aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser.y142
1 files changed, 139 insertions, 3 deletions
diff --git a/src/parser.y b/src/parser.y
index 8a4ddb5..ee1a026 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -141,10 +141,145 @@ static void yyerror(YYLTYPE *yylloc, void *lexer,
%}
-%start input;
+%start program;
%%
-input: /* empty */
+statement_list
+ : statement "," statement_list
+ | statement
+
+definitions
+ : function_definition
+ | procedure_definition
+ | variable_definition
+
+variable_definition
+ : "var" IDENT "=" expression
+
+variable_definitions
+ : variable_definition variable_definitions
+ | variable_definition
+
+opt_variable_definitions
+ : variable_definitions
+ |
+
+return
+ : "return" IDENT
+
+opt_return
+ : return
+ |
+
+function_definition
+ : "function" FUNC_IDENT "{" opt_formals "}"
+ return opt_variable_definitions "is" rvalue "end" "function"
+
+procedure_definition
+ : "procedure" PROC_IDENT "(" opt_formals "}"
+ opt_return opt_variable_definitions "is" statement_list
+ "end" "procedure"
+
+formals
+ : formal_arg "," formal_arg
+ | formal_arg
+
+opt_formals
+ : formals
+ |
+
+formal_arg
+ : IDENT "[" IDENT "]"
+
+procedure_call
+ : PROC_IDENT "(" opt_arguments ")"
+
+arguments
+ : expression "," expression
+ | expression
+
+opt_arguments
+ : arguments
+ |
+
+assignment
+ : lvalue "=" rvalue
+
+lvalue
+ : IDENT
+ | IDENT "." IDENT
+
+rvalue
+ : expression
+ | unless_expression
+
+print_statement
+ : "print" print_items
+
+print_items
+ : print_item "&" print_items
+ | print_item
+
+print_item
+ : STRING
+ | expression
+
+statement
+ : procedure_call
+ | assignment
+ | print_statement
+ | until_statement
+ | unless_statement
+ | "return" expression
+
+until_statement
+ : "do" statement_list "until" expression
+
+unless_statement
+ : "do" statement_list "unless" expression
+ | "do" statement_list "unless" expression "otherwise" statement_list "done"
+
+expression
+ : simple_expr
+ | expression "=" simple_expr
+ | expression "<" simple_expr
+
+simple_expr
+ : term
+ | simple_expr "+" term
+ | simple_expr "-" term
+
+term
+ : factor
+ | term "*" factor
+ | term "/" factor
+
+factor
+ : "+" atom
+ | "-" atom
+ | atom
+
+atom
+ : IDENT
+ | IDENT "'" IDENT
+ | INT_LITERAL
+ | DATE_LITERAL
+ | function_call
+ | procedure_call
+ | "(" expression ")"
+
+function_call
+ : FUNC_IDENT "(" opt_arguments ")"
+
+unless_expression
+ : "do" expression "unless" expression "otherwise" expression "done"
+
+opt_definitions
+ : definitions
+ | {}
+
+program
+ : opt_definitions statement_list
%%
@@ -239,5 +374,6 @@ void parse(struct parser *p, const char *fname, const char *buf)
// runs
dump_lex(p);
- // yyparse(p->lexer, p);
+ yy_scan_string(buf, p->lexer);
+ yyparse(p->lexer, p);
}