summaryrefslogtreecommitdiff
path: root/grammar.y
diff options
context:
space:
mode:
Diffstat (limited to 'grammar.y')
-rw-r--r--grammar.y89
1 files changed, 76 insertions, 13 deletions
diff --git a/grammar.y b/grammar.y
index 446b651..c85da97 100644
--- a/grammar.y
+++ b/grammar.y
@@ -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);
}