diff options
Diffstat (limited to 'grammar.y')
-rw-r--r-- | grammar.y | 89 |
1 files changed, 76 insertions, 13 deletions
@@ -1,13 +1,24 @@ %{ #include <stdio.h> +#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 @@ -19,6 +30,10 @@ extern void yyerror(); %token CONST %token VAR +%token TYPE_INTEGER +%token TYPE_STRING +%token TYPE_VOID + %token PARENTHESIS_LEFT %token PARENTHESIS_RIGHT %token BRACE_LEFT @@ -27,6 +42,7 @@ extern void yyerror(); %token BRACKET_RIGHT %token COMMA; +%token COLON; %token NUMBER; %token IDENTIFIER @@ -34,20 +50,65 @@ extern void yyerror(); %token END_OF_LINE; +%type <node> program +%type <node> function +%type <node> arguments +%type <node> argument +%type <node> return_type +%type <node> variable_type +%type <node> statements +%type <node> statement +%type <node> expression + +%type <node> IDENTIFIER +%type <node> RETURN + +%start program + %% -program: - | program statement END_OF_LINE - ; - -statement: expression - | RETURN expression - | CONST IDENTIFIER ASSIGN expression - | VAR IDENTIFIER ASSIGN expression - ; - -expression: NUMBER - | IDENTIFIER - ; +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) @@ -55,4 +116,6 @@ void main (int argc, char **argv) //henshin_lex(); yyin = fopen(argv[1], "r"); yyparse(); + + printf("%s", yyast); } |