diff --git a/nodes/Node.h b/nodes/Node.h index 18c3022..be14244 100644 --- a/nodes/Node.h +++ b/nodes/Node.h @@ -29,6 +29,10 @@ class Node }; +class ArrayTypeNode : public Node +{ +}; + class CStatementNode : public Node { public: @@ -42,6 +46,10 @@ class DoubleNode : public Node DoubleNode(double val) { m_double = val; } }; +class FunctionNode : public Node +{ +}; + class IdentifierNode : public Node { public: @@ -54,6 +62,16 @@ class IntegerNode : public Node IntegerNode(uint64_t integer) { m_integer = integer; } }; +class ItemsNode : public Node +{ +}; + +class PrimitiveTypeNode : public Node +{ + public: + PrimitiveTypeNode(uint64_t type) { m_integer = type; } +}; + class ProgramNode : public Node { }; @@ -64,4 +82,12 @@ class StringNode : public Node StringNode(const std::string & str) { m_string = str; } }; +class StructTypeNode : public Node +{ +}; + +class VariableSpecNode : public Node +{ +}; + #endif diff --git a/parser/parser.yy b/parser/parser.yy index b9cb775..2cf7828 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -97,26 +97,21 @@ program: program_items { ; program_items: /* empty */ - | program_item program_items + | program_item program_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; -program_item: module_declaration - | import - | variable_declaration - | function - | c_statement +program_item: function { + $$ = $1; + } + | c_statement { + $$ = $1; + } ; -module_declaration: MODULE module_name SEMICOLON - ; - -module_name: IDENTIFIER module_name_more - ; - -module_name_more: /* empty */ - | DOT IDENTIFIER module_name_more - ; - import: IMPORT import_name SEMICOLON ; @@ -131,60 +126,119 @@ import_name_more_more: IDENTIFIER import_name_more | STAR ; -function: IDENTIFIER LPAREN parameter_list RPAREN COLON type LCURLY function_items RCURLY +function: IDENTIFIER LPAREN parameter_list RPAREN COLON type LCURLY function_items RCURLY { + $$ = new FunctionNode(); + $$->addChild($3); + $$->addChild($6); + $$->addChildren($8); + } ; function_items: /* empty */ - | statement function_items + | statement function_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; parameter_list: /* empty */ - | variable_spec parameter_list_more + | variable_spec parameter_list_more { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; parameter_list_more: /* empty */ - | COMMA variable_spec parameter_list_more + | COMMA variable_spec parameter_list_more { + $$ = new ItemsNode(); + $$->addChild($2); + $$->addChildren($3); + } ; -primitive_type: BYTE - | UBYTE - | CHAR - | WCHAR - | SHORT - | USHORT - | INT - | UINT - | LONG - | ULONG +primitive_type: BYTE { + $$ = new PrimitiveTypeNode(BYTE); + } + | UBYTE { + $$ = new PrimitiveTypeNode(UBYTE); + } + | CHAR { + $$ = new PrimitiveTypeNode(CHAR); + } + | WCHAR { + $$ = new PrimitiveTypeNode(WCHAR); + } + | SHORT { + $$ = new PrimitiveTypeNode(SHORT); + } + | USHORT { + $$ = new PrimitiveTypeNode(USHORT); + } + | INT { + $$ = new PrimitiveTypeNode(INT); + } + | UINT { + $$ = new PrimitiveTypeNode(UINT); + } + | LONG { + $$ = new PrimitiveTypeNode(LONG); + } + | ULONG { + $$ = new PrimitiveTypeNode(ULONG); + } ; -struct_type: STRUCT LCURLY struct_items RCURLY +struct_type: STRUCT LCURLY struct_items RCURLY { + $$ = new StructTypeNode(); + $$->addChildren($3); + } ; struct_items: /* empty */ - | struct_item struct_items + | struct_item struct_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; -struct_item: variable_declaration +struct_item: variable_declaration { + $$ = $1; + } ; -variable_declaration: variable_spec SEMICOLON; +variable_declaration: variable_spec SEMICOLON { + $$ = $1; + } ; -variable_spec: IDENTIFIER COLON type +variable_spec: IDENTIFIER COLON type { + $$ = new VariableSpecNode(); + $$->addChild($1); + $$->addChild($3); + } ; -ptr_type: type STAR - ; - -array_type: type LBRACKET RBRACKET +array_type: type LBRACKET RBRACKET { + $$ = new ArrayTypeNode(); + $$->addChild($1); + } ; -type: primitive_type - | ptr_type - | struct_type - | array_type - | IDENTIFIER +type: primitive_type { + $$ = $1; + } + | struct_type { + $$ = $1; + } + | array_type { + $$ = $1; + } + | IDENTIFIER { + $$ = $1; + } ; statement: expression SEMICOLON