%{ #include #include "ast.c" extern FILE *yyin; extern int yylex(); extern void yyerror(); ast_node* yyast = NULL; %} %define parse.error verbose %union { char* string; int number; ast_node* node; } %token OPERATOR_PLUS %token OPERATOR_MINUS %token ASSIGN %token FUNCTION %token IF %token ELSE %token RETURN %token CONST %token VAR %token TYPE_INTEGER %token TYPE_STRING %token TYPE_VOID %token PARENTHESIS_LEFT %token PARENTHESIS_RIGHT %token BRACE_LEFT %token BRACE_RIGHT %token BRACKET_LEFT %token BRACKET_RIGHT %token COMMA; %token COLON; %token NUMBER; %token IDENTIFIER %token COMMENT; %token END_OF_LINE; %type program %type function %type arguments %type argument %type return_type %type variable_type %type statements %type statement %type expression %type IDENTIFIER %type RETURN %start program %% program: { $$ = NULL; } | program statement END_OF_LINE { $$ = create_program_node($1, $2); } // function henshin(): void {} // function henshin(hen: integer, shin: integer): void {} function: | FUNCTION IDENTIFIER PARENTHESIS_LEFT PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT | FUNCTION IDENTIFIER PARENTHESIS_LEFT arguments PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT { $$ = create_node(); $$->value = $2; } arguments: | argument | arguments COMMA argument argument: | IDENTIFIER COLON variable_type return_type: | TYPE_INTEGER | TYPE_STRING | TYPE_VOID variable_type: | TYPE_INTEGER | TYPE_STRING statements: | statement | statements END_OF_LINE statement statement: // const henshin: integer = 2 | CONST IDENTIFIER COLON variable_type ASSIGN expression | RETURN expression { $$ = create_node(); $$->left = $1; $$->right = $2; } | IDENTIFIER PARENTHESIS_LEFT PARENTHESIS_RIGHT | function expression: | NUMBER | IDENTIFIER %% void main (int argc, char **argv) { //henshin_lex(); yyin = fopen(argv[1], "r"); yyparse(); printf("%s", yyast); }