Skip to content

Commit

Permalink
Atualizando os arquivos da etapa4 e colocando no master
Browse files Browse the repository at this point in the history
  • Loading branch information
fkeglevich committed Jun 19, 2017
1 parent 8f5b210 commit 5b40fac
Show file tree
Hide file tree
Showing 11 changed files with 197 additions and 22 deletions.
Empty file modified Makefile
100755 → 100644
Empty file.
Empty file modified ast.c
100755 → 100644
Empty file.
Empty file modified ast.h
100755 → 100644
Empty file.
1 change: 0 additions & 1 deletion comp
Submodule comp deleted from eed107
1 change: 1 addition & 0 deletions hash.c
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ HASH_NODE* hash_insert(int type, char *text)

newNode->dataNature = NATURE_UNKNOWN;
newNode->dataType = DATATYPE_UNKNOWN;
newNode->funcParam = NULL;
yylval.symbol = newNode;

return newNode;
Expand Down
2 changes: 2 additions & 0 deletions hash.h
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ const char* getTokenName(int code);
#define DATATYPE_FLOAT 4
#define DATATYPE_DOUBLE 5
#define DATATYPE_BOOL 6
#define DATATYPE_STRING 7

typedef struct hash_node {
int type;
int dataNature;
int dataType;
char *text;
struct hash_node *next;
void *funcParam; // Parametros de função
} HASH_NODE;

HASH_NODE *table[HASH_SIZE];
Expand Down
Empty file modified main.c
100755 → 100644
Empty file.
Empty file modified parser.y
100755 → 100644
Empty file.
8 changes: 0 additions & 8 deletions scanner.l
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,6 @@ Grupo:
#include "semantic.h"
#include "y.tab.h"

#define SYMBOL_LIT_INT 1
#define SYMBOL_LIT_REAL 2
#define SYMBOL_LIT_CHAR 3
#define SYMBOL_LIT_STRING 4
#define SYMBOL_LIT_TRUE 5
#define SYMBOL_LIT_FALSE 6
#define SYMBOL_IDENTIFIER 7

int running = 1;
int contadorLinhas = 1;

Expand Down
195 changes: 182 additions & 13 deletions semantic.c
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -22,30 +22,194 @@ void checkIdentifierExists(HASH_NODE *node)
semanticError();
}

//Função que checa a declaração
void checkNature(HASH_NODE *node, int expectedNature)
{
if (node->dataNature != expectedNature)
semanticError();
}

/*
#define DATATYPE_UNKNOWN 0
#define DATATYPE_BYTE 1
#define DATATYPE_SHORT 2
#define DATATYPE_LONG 3
#define DATATYPE_FLOAT 4
#define DATATYPE_DOUBLE 5
#define DATATYPE_BOOL 6
#define DATATYPE_STRING 7
*/

int compareDataTypes(int a, int b)
{
if (a == DATATYPE_STRING || b == DATATYPE_STRING)
semanticError();

if (a == DATATYPE_UNKNOWN || b == DATATYPE_UNKNOWN)
semanticError();

if (a != DATATYPE_BOOL && b != DATATYPE_BOOL)
{
if (a > b)
return a;
else
return b;
}
else
{
if (a == DATATYPE_BOOL && b == DATATYPE_BOOL)
return DATATYPE_BOOL;
else
semanticError();
}
return DATATYPE_UNKNOWN;
}

int getDataTypeFromVarType(AST_NODE *node)
{
switch(node->type)
{
case AST_BYTE: return DATATYPE_BYTE;
case AST_SHORT: return DATATYPE_SHORT;
case AST_LONG: return DATATYPE_LONG;
case AST_FLOAT: return DATATYPE_FLOAT;
case AST_DOUBLE: return DATATYPE_DOUBLE;
case AST_BOOL: return DATATYPE_BOOL;
default: semanticError();
}
return DATATYPE_UNKNOWN;
}

/*
lista_parametros
: declara_parametro {$$ = $1;}
| declara_parametro ',' lista_parametros {$$ = ast_insert(AST_ARGS_LIST, NULL, $1, $3, NULL, NULL);}
| {$$ = NULL;}
;
declara_parametro: tipo_variavel TK_IDENTIFIER {$$ = ast_insert(AST_DEC_ARGS, $2, $1, NULL, NULL, NULL);};
chama_parametros
: expressao {$$ = $1;}
| expressao ',' chama_parametros {$$ = ast_insert(AST_PARAM_LIST, NULL, $1, $3, NULL, NULL);}
| {$$ = NULL;}
;
*/
void checkParamPair(AST_NODE *declared, AST_NODE *called)
{
int declaredDataType;

if (declared == NULL && called == NULL)
return;

if (declared == NULL && called != NULL)
semanticError();

if (declared != NULL && called == NULL)
semanticError();

if (declared->type == AST_DEC_ARGS && called->type != AST_PARAM_LIST)
{
declaredDataType = getDataTypeFromVarType(declared->children[0]);
compareDataTypes(declaredDataType, getExpressionDataType(called));
return;
}

if (declared->type == AST_ARGS_LIST && called->type == AST_PARAM_LIST)
{
checkParamPair(declared->children[0], called->children[0]);
checkParamPair(declared->children[1], called->children[1]);
return;
}

semanticError();
}

int getExpressionDataType(AST_NODE *node)
{
int res;
switch(node->type)
{
case AST_PARENTHESES:
return getExpressionDataType(node->children[0]);

case AST_ADD:
case AST_SUB:
case AST_MUL:
case AST_DIV:
return compareDataTypes(getExpressionDataType(node->children[0]), getExpressionDataType(node->children[1]));

case AST_GT:
case AST_LT:
case AST_LE:
case AST_GE:
res = compareDataTypes(getExpressionDataType(node->children[0]), getExpressionDataType(node->children[1]));
if (res == DATATYPE_UNKNOWN || res == DATATYPE_BOOL)
semanticError();
return DATATYPE_BOOL;

case AST_EQ:
case AST_NE:
return DATATYPE_BOOL;

case AST_AND:
case AST_OR:
if (compareDataTypes(getExpressionDataType(node->children[0]), getExpressionDataType(node->children[1])) != DATATYPE_BOOL)
semanticError();
return DATATYPE_BOOL;

case AST_NOT:
if (getExpressionDataType(node->children[0]) != DATATYPE_BOOL)
semanticError();
return DATATYPE_BOOL;

case AST_ID:
checkIdentifierExists(node->symbol);
return node->symbol->dataType;

case AST_ID_VECTOR:
checkIdentifierExists(node->symbol);
if (compareDataTypes(getExpressionDataType(node->children[0]), DATATYPE_LONG) != DATATYPE_LONG)
semanticError();
return node->symbol->dataType;

//| TK_IDENTIFIER '(' chama_parametros ')' {$$ = ast_insert(AST_ID_CALL, $1, $3, NULL, NULL, NULL);}
case AST_ID_CALL:
checkIdentifierExists(node->symbol);
checkParamPair(node->symbol->funcParam, node->children[0]);
return node->symbol->dataType;

case AST_LITERAL:
switch(node->symbol->type)
{
case SYMBOL_LIT_INT: return DATATYPE_LONG;
case SYMBOL_LIT_REAL: return DATATYPE_DOUBLE;
case SYMBOL_LIT_CHAR: return DATATYPE_BYTE;
case SYMBOL_LIT_STRING: return DATATYPE_STRING;
case SYMBOL_LIT_TRUE:
case SYMBOL_LIT_FALSE:
return DATATYPE_BOOL;
}
break;
}
}

void checkDeclr(AST_NODE *node)
{
//Se a variável for declarada duas vezes dá erro
if (node->symbol->dataNature != NATURE_UNKNOWN)
semanticError();

switch(node->type)
{
case AST_VAR_DEC: node->symbol->dataNature = NATURE_VAR; break;
case AST_VEC_DEC: node->symbol->dataNature = NATURE_VEC; break;
case AST_FUNC_DEC: node->symbol->dataNature = NATURE_FUNC; break;
case AST_FUNC_DEC:
node->symbol->dataNature = NATURE_FUNC;
node->symbol->funcParam = node->children[1];
break;
}

switch(node->children[0]->type)
{
case AST_BYTE: node->symbol->dataType = DATATYPE_BYTE; break;
case AST_SHORT: node->symbol->dataType = DATATYPE_SHORT; break;
case AST_LONG: node->symbol->dataType = DATATYPE_LONG; break;
case AST_FLOAT: node->symbol->dataType = DATATYPE_FLOAT; break;
case AST_DOUBLE: node->symbol->dataType = DATATYPE_DOUBLE; break;
case AST_BOOL: node->symbol->dataType = DATATYPE_BOOL; break;
default: semanticError(); break;
}
node->symbol->dataType = getDataTypeFromVarType(node->children[0]);
}

void checkChildren(AST_NODE *node)
Expand Down Expand Up @@ -78,6 +242,11 @@ void checkProgram(AST_NODE *node)
checkDeclr(node);
break;

case AST_ATRIB:
checkIdentifierExists(node->symbol);
checkNature(node->symbol, NATURE_VAR);
break;

case AST_READ:
checkIdentifierExists(node->symbol);
break;
Expand Down
12 changes: 12 additions & 0 deletions semantic.h
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,20 @@ Professor: Marcelo Johann

#include "ast.h"

#define SYMBOL_LIT_INT 1
#define SYMBOL_LIT_REAL 2
#define SYMBOL_LIT_CHAR 3
#define SYMBOL_LIT_STRING 4
#define SYMBOL_LIT_TRUE 5
#define SYMBOL_LIT_FALSE 6
#define SYMBOL_IDENTIFIER 7

void semanticError();
void checkDeclr(AST_NODE *node);
int compareDataTypes(int a, int b);
int getDataTypeFromVarType(AST_NODE *node);
void checkParamPair(AST_NODE *declared, AST_NODE *called);
int getExpressionDataType(AST_NODE *node);
void checkIdentifier(HASH_NODE *node);
void checkChildren(AST_NODE *node);
void checkProgram(AST_NODE *node);
Expand Down

0 comments on commit 5b40fac

Please sign in to comment.