#ifndef CCMMC_HEADER_AST_H #define CCMMC_HEADER_AST_H #define MAX_ARRAY_DIMENSION 7 typedef enum DATA_TYPE { INT_TYPE, FLOAT_TYPE, VOID_TYPE, INT_PTR_TYPE,//for parameter passing FLOAT_PTR_TYPE,//for parameter passing CONST_STRING_TYPE,//for "const string" NONE_TYPE,//for nodes like PROGRAM_NODE which has no type ERROR_TYPE } DATA_TYPE; typedef enum IDENTIFIER_KIND { NORMAL_ID, //function Name, uninitialized scalar variable ARRAY_ID, //ID_NODE->child = dim WITH_INIT_ID, //ID_NODE->child = initial value } IDENTIFIER_KIND; typedef enum BINARY_OPERATOR { BINARY_OP_ADD, BINARY_OP_SUB, BINARY_OP_MUL, BINARY_OP_DIV, BINARY_OP_EQ, BINARY_OP_GE, BINARY_OP_LE, BINARY_OP_NE, BINARY_OP_GT, BINARY_OP_LT, BINARY_OP_AND, BINARY_OP_OR } BINARY_OPERATOR; typedef enum UNARY_OPERATOR { UNARY_OP_POSITIVE, UNARY_OP_NEGATIVE, UNARY_OP_LOGICAL_NEGATION } UNARY_OPERATOR; //C_type= type of constant ex: 1, 3.3, "const string" //do not modify, or lexer might break typedef enum C_type {INTEGERC,FLOATC,STRINGC} C_type; typedef enum STMT_KIND { WHILE_STMT, FOR_STMT, ASSIGN_STMT, //TODO:for simpler implementation, assign_expr also uses this IF_STMT, FUNCTION_CALL_STMT, RETURN_STMT, } STMT_KIND; typedef enum EXPR_KIND { BINARY_OPERATION, UNARY_OPERATION } EXPR_KIND; typedef enum DECL_KIND { VARIABLE_DECL, TYPE_DECL, FUNCTION_DECL, FUNCTION_PARAMETER_DECL } DECL_KIND; typedef enum AST_TYPE { PROGRAM_NODE, DECLARATION_NODE, IDENTIFIER_NODE, PARAM_LIST_NODE, NUL_NODE, BLOCK_NODE, VARIABLE_DECL_LIST_NODE, STMT_LIST_NODE, STMT_NODE, EXPR_NODE, CONST_VALUE_NODE, //ex:1, 2, "constant string" NONEMPTY_ASSIGN_EXPR_LIST_NODE, NONEMPTY_RELOP_EXPR_LIST_NODE } AST_TYPE; //************************* // AST_NODE's semantic value //************************* typedef struct STMTSemanticValue { STMT_KIND kind; } STMTSemanticValue; typedef struct EXPRSemanticValue { EXPR_KIND kind; int isConstEval; union { int iValue; float fValue; } constEvalValue; union { BINARY_OPERATOR binaryOp; UNARY_OPERATOR unaryOp; } op; } EXPRSemanticValue; typedef struct DECLSemanticValue { DECL_KIND kind; } DECLSemanticValue; struct SymbolAttribute; typedef struct IdentifierSemanticValue { char *identifierName; struct SymbolTableEntry *symbolTableEntry; IDENTIFIER_KIND kind; } IdentifierSemanticValue; typedef struct TypeSpecSemanticValue { char *typeName; } TypeSpecSemanticValue; //don't modify or lexer may break typedef struct CON_Type{ C_type const_type; union { int intval; double fval; char *sc; } const_u; } CON_Type; struct AST_NODE { struct AST_NODE *child; struct AST_NODE *parent; struct AST_NODE *rightSibling; struct AST_NODE *leftmostSibling; AST_TYPE nodeType; DATA_TYPE dataType; int linenumber; union { IdentifierSemanticValue identifierSemanticValue; STMTSemanticValue stmtSemanticValue; DECLSemanticValue declSemanticValue; EXPRSemanticValue exprSemanticValue; CON_Type *const1; } semantic_value; }; typedef struct AST_NODE AST_NODE; AST_NODE *Allocate(AST_TYPE type); AST_NODE* makeSibling(AST_NODE *a, AST_NODE *b); AST_NODE* makeChild(AST_NODE *parent, AST_NODE *child); AST_NODE* makeFamily(AST_NODE *parent, int childrenCount, ...); AST_NODE* makeIDNode(char *lexeme, IDENTIFIER_KIND idKind); AST_NODE* makeStmtNode(STMT_KIND stmtKind); AST_NODE* makeDeclNode(DECL_KIND declKind); AST_NODE* makeExprNode(EXPR_KIND exprKind, int operationEnumValue); void semanticAnalysis(AST_NODE *root); // Functions exported by draw.c void printGV(AST_NODE *root, const char* fileName); #endif