diff options
Diffstat (limited to 'gen')
-rw-r--r-- | gen/gen_parser.c | 236 |
1 files changed, 100 insertions, 136 deletions
diff --git a/gen/gen_parser.c b/gen/gen_parser.c index 7d6e67d..1d07254 100644 --- a/gen/gen_parser.c +++ b/gen/gen_parser.c @@ -79,44 +79,8 @@ #include <posthaste/date.h> #include <posthaste/ast.h> -#define FOREACH_TOKEN(M) \ - M(LPAREN) \ - M(RPAREN) \ - M(LSQUARE) \ - M(RSQUARE) \ - M(LCURLY) \ - M(RCURLY) \ - M(APOSTROPHE) \ - M(AMPERSAND) \ - M(COMMA) \ - M(DOT) \ - M(EQ) \ - M(LT) \ - M(PLUS) \ - M(MINUS) \ - M(MULT) \ - M(DIV) \ - M(VAR) \ - M(IS) \ - M(UNLESS) \ - M(OTHERWISE) \ - M(UNTIL) \ - M(DO) \ - M(DONE) \ - M(PROCEDURE) \ - M(FUNCTION) \ - M(RETURN) \ - M(PRINT) \ - M(END) \ - M(STRING) \ - M(DATE_LITERAL) \ - M(INT_LITERAL) \ - M(IDENT) \ - M(FUNC_IDENT) \ - M(PROC_IDENT) - - -#line 120 "gen/gen_parser.c" + +#line 84 "gen/gen_parser.c" # ifndef YY_CAST # ifdef __cplusplus @@ -199,14 +163,14 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 60 "src/parser.y" +#line 24 "src/parser.y" struct ast *node; ph_date_t num; int64_t snum; char *str; -#line 210 "gen/gen_parser.c" +#line 174 "gen/gen_parser.c" }; typedef union YYSTYPE YYSTYPE; @@ -317,7 +281,7 @@ typedef enum yysymbol_kind_t yysymbol_kind_t; /* Second part of user prologue. */ -#line 143 "src/parser.y" +#line 107 "src/parser.y" /** Modifies the signature of yylex to fit our parser better. */ @@ -357,7 +321,7 @@ static void yyerror(YYLTYPE *yylloc, void *lexer, struct parser *parser, const char *msg); -#line 361 "gen/gen_parser.c" +#line 325 "gen/gen_parser.c" #ifdef short @@ -746,14 +710,14 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 187, 187, 188, 191, 192, 195, 196, 197, 200, - 205, 206, 209, 210, 213, 216, 217, 220, 232, 244, - 245, 248, 249, 252, 257, 262, 263, 266, 267, 270, - 275, 280, 281, 284, 285, 288, 291, 292, 295, 296, - 299, 300, 301, 302, 303, 304, 307, 312, 315, 320, - 321, 324, 329, 330, 333, 338, 339, 342, 347, 350, - 353, 356, 357, 360, 363, 366, 367, 368, 371, 376, - 381, 382, 385, 396 + 0, 151, 151, 152, 155, 156, 159, 160, 161, 164, + 169, 170, 173, 174, 177, 180, 181, 184, 196, 208, + 209, 212, 213, 216, 221, 226, 227, 230, 231, 234, + 239, 244, 245, 248, 249, 252, 255, 256, 259, 260, + 263, 264, 265, 266, 267, 268, 271, 276, 279, 284, + 285, 288, 293, 294, 297, 302, 303, 306, 311, 314, + 317, 320, 321, 324, 327, 330, 331, 332, 335, 340, + 345, 346, 349, 360 }; #endif @@ -1809,51 +1773,51 @@ yyreduce: switch (yyn) { case 2: /* statement_list: statement "," statement_list */ -#line 187 "src/parser.y" +#line 151 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1815 "gen/gen_parser.c" +#line 1779 "gen/gen_parser.c" break; case 4: /* definitions: definition definitions */ -#line 191 "src/parser.y" +#line 155 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1821 "gen/gen_parser.c" +#line 1785 "gen/gen_parser.c" break; case 9: /* variable_definition: "var" IDENT "=" expression */ -#line 200 "src/parser.y" +#line 164 "src/parser.y" { (yyval.node) = gen_var_def((yyvsp[-2].str), (yyvsp[0].node), src_loc((yyloc))); } -#line 1829 "gen/gen_parser.c" +#line 1793 "gen/gen_parser.c" break; case 10: /* variable_definitions: variable_definition variable_definitions */ -#line 205 "src/parser.y" +#line 169 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1835 "gen/gen_parser.c" +#line 1799 "gen/gen_parser.c" break; case 13: /* opt_variable_definitions: %empty */ -#line 210 "src/parser.y" +#line 174 "src/parser.y" { (yyval.node) = NULL; } -#line 1841 "gen/gen_parser.c" +#line 1805 "gen/gen_parser.c" break; case 14: /* return: "return" IDENT */ -#line 213 "src/parser.y" +#line 177 "src/parser.y" { (yyval.str) = (yyvsp[0].str); } -#line 1847 "gen/gen_parser.c" +#line 1811 "gen/gen_parser.c" break; case 16: /* opt_return: %empty */ -#line 217 "src/parser.y" +#line 181 "src/parser.y" { (yyval.str) = NULL; } -#line 1853 "gen/gen_parser.c" +#line 1817 "gen/gen_parser.c" break; case 17: /* function_definition: "function" FUNC_IDENT "{" opt_formals "}" return opt_variable_definitions "is" rvalue "end" "function" */ -#line 221 "src/parser.y" +#line 185 "src/parser.y" { struct ast *ret = gen_return((yyvsp[-2].node), (yyvsp[-2].node)->loc); (yyval.node) = gen_func_def((yyvsp[-9].str), @@ -1863,11 +1827,11 @@ yyreduce: ret, src_loc((yyloc))); } -#line 1867 "gen/gen_parser.c" +#line 1831 "gen/gen_parser.c" break; case 18: /* procedure_definition: "procedure" PROC_IDENT "{" opt_formals "}" opt_return opt_variable_definitions "is" statement_list "end" "procedure" */ -#line 234 "src/parser.y" +#line 198 "src/parser.y" { (yyval.node) = gen_proc_def((yyvsp[-9].str), (yyvsp[-5].str), @@ -1876,237 +1840,237 @@ yyreduce: (yyvsp[-2].node), src_loc((yyloc))); } -#line 1880 "gen/gen_parser.c" +#line 1844 "gen/gen_parser.c" break; case 19: /* formals: formal_arg "," formals */ -#line 244 "src/parser.y" +#line 208 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1886 "gen/gen_parser.c" +#line 1850 "gen/gen_parser.c" break; case 22: /* opt_formals: %empty */ -#line 249 "src/parser.y" +#line 213 "src/parser.y" { (yyval.node) = NULL; } -#line 1892 "gen/gen_parser.c" +#line 1856 "gen/gen_parser.c" break; case 23: /* formal_arg: IDENT "[" IDENT "]" */ -#line 252 "src/parser.y" +#line 216 "src/parser.y" { (yyval.node) = gen_formal_def((yyvsp[-3].str), (yyvsp[-1].str), src_loc((yyloc))); } -#line 1900 "gen/gen_parser.c" +#line 1864 "gen/gen_parser.c" break; case 24: /* procedure_call: PROC_IDENT "(" opt_arguments ")" */ -#line 257 "src/parser.y" +#line 221 "src/parser.y" { (yyval.node) = gen_proc_call((yyvsp[-3].str), (yyvsp[-1].node), src_loc((yyloc))); } -#line 1908 "gen/gen_parser.c" +#line 1872 "gen/gen_parser.c" break; case 25: /* arguments: expression "," arguments */ -#line 262 "src/parser.y" +#line 226 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1914 "gen/gen_parser.c" +#line 1878 "gen/gen_parser.c" break; case 28: /* opt_arguments: %empty */ -#line 267 "src/parser.y" +#line 231 "src/parser.y" { (yyval.node) = NULL; } -#line 1920 "gen/gen_parser.c" +#line 1884 "gen/gen_parser.c" break; case 29: /* assignment: lvalue "=" rvalue */ -#line 270 "src/parser.y" +#line 234 "src/parser.y" { (yyval.node) = gen_assign((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 1928 "gen/gen_parser.c" +#line 1892 "gen/gen_parser.c" break; case 30: /* ident: IDENT */ -#line 275 "src/parser.y" +#line 239 "src/parser.y" { (yyval.node) = gen_id((yyvsp[0].str), src_loc((yyloc))); } -#line 1936 "gen/gen_parser.c" +#line 1900 "gen/gen_parser.c" break; case 32: /* lvalue: ident "." IDENT */ -#line 281 "src/parser.y" +#line 245 "src/parser.y" { (yyval.node) = gen_dot((yyvsp[-2].node), (yyvsp[0].str), src_loc((yyloc))); } -#line 1942 "gen/gen_parser.c" +#line 1906 "gen/gen_parser.c" break; case 35: /* print_statement: "print" print_items */ -#line 288 "src/parser.y" +#line 252 "src/parser.y" { (yyval.node) = gen_print((yyvsp[0].node), src_loc((yyloc))); } -#line 1948 "gen/gen_parser.c" +#line 1912 "gen/gen_parser.c" break; case 36: /* print_items: print_item "&" print_items */ -#line 291 "src/parser.y" +#line 255 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } -#line 1954 "gen/gen_parser.c" +#line 1918 "gen/gen_parser.c" break; case 38: /* print_item: STRING */ -#line 295 "src/parser.y" +#line 259 "src/parser.y" { (yyval.node) = gen_const_string((yyvsp[0].str), src_loc((yyloc))); } -#line 1960 "gen/gen_parser.c" +#line 1924 "gen/gen_parser.c" break; case 45: /* statement: "return" expression */ -#line 304 "src/parser.y" +#line 268 "src/parser.y" { (yyval.node) = gen_return((yyvsp[0].node), src_loc((yyloc))); } -#line 1966 "gen/gen_parser.c" +#line 1930 "gen/gen_parser.c" break; case 46: /* until_statement: "do" statement_list "until" expression */ -#line 307 "src/parser.y" +#line 271 "src/parser.y" { (yyval.node) = gen_until((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 1974 "gen/gen_parser.c" +#line 1938 "gen/gen_parser.c" break; case 47: /* unless_statement: "do" statement_list "unless" expression "done" */ -#line 312 "src/parser.y" +#line 276 "src/parser.y" { (yyval.node) = gen_unless((yyvsp[-3].node), (yyvsp[-1].node), NULL, src_loc((yyloc))); } -#line 1982 "gen/gen_parser.c" +#line 1946 "gen/gen_parser.c" break; case 48: /* unless_statement: "do" statement_list "unless" expression "otherwise" statement_list "done" */ -#line 315 "src/parser.y" +#line 279 "src/parser.y" { (yyval.node) = gen_unless((yyvsp[-5].node), (yyvsp[-3].node), (yyvsp[-1].node), src_loc((yyloc))); } -#line 1990 "gen/gen_parser.c" +#line 1954 "gen/gen_parser.c" break; case 50: /* expression: expression "=" simple_expr */ -#line 321 "src/parser.y" +#line 285 "src/parser.y" { (yyval.node) = gen_eq((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 1998 "gen/gen_parser.c" +#line 1962 "gen/gen_parser.c" break; case 51: /* expression: expression "<" simple_expr */ -#line 324 "src/parser.y" +#line 288 "src/parser.y" { (yyval.node) = gen_lt((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 2006 "gen/gen_parser.c" +#line 1970 "gen/gen_parser.c" break; case 53: /* simple_expr: simple_expr "+" term */ -#line 330 "src/parser.y" +#line 294 "src/parser.y" { (yyval.node) = gen_add((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 2014 "gen/gen_parser.c" +#line 1978 "gen/gen_parser.c" break; case 54: /* simple_expr: simple_expr "-" term */ -#line 333 "src/parser.y" +#line 297 "src/parser.y" { (yyval.node) = gen_sub((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 2022 "gen/gen_parser.c" +#line 1986 "gen/gen_parser.c" break; case 56: /* term: term "*" factor */ -#line 339 "src/parser.y" +#line 303 "src/parser.y" { (yyval.node) = gen_mul((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 2030 "gen/gen_parser.c" +#line 1994 "gen/gen_parser.c" break; case 57: /* term: term "/" factor */ -#line 342 "src/parser.y" +#line 306 "src/parser.y" { (yyval.node) = gen_div((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); } -#line 2038 "gen/gen_parser.c" +#line 2002 "gen/gen_parser.c" break; case 58: /* factor: "+" atom */ -#line 347 "src/parser.y" +#line 311 "src/parser.y" { (yyval.node) = gen_pos((yyvsp[0].node), src_loc((yyloc))); } -#line 2046 "gen/gen_parser.c" +#line 2010 "gen/gen_parser.c" break; case 59: /* factor: "-" atom */ -#line 350 "src/parser.y" +#line 314 "src/parser.y" { (yyval.node) = gen_neg((yyvsp[0].node), src_loc((yyloc))); } -#line 2054 "gen/gen_parser.c" +#line 2018 "gen/gen_parser.c" break; case 62: /* atom: ident "'" IDENT */ -#line 357 "src/parser.y" +#line 321 "src/parser.y" { (yyval.node) = gen_attr((yyvsp[-2].node), (yyvsp[0].str), src_loc((yyloc))); } -#line 2062 "gen/gen_parser.c" +#line 2026 "gen/gen_parser.c" break; case 63: /* atom: INT_LITERAL */ -#line 360 "src/parser.y" +#line 324 "src/parser.y" { (yyval.node) = gen_const_int((yyvsp[0].snum), src_loc((yyloc))); } -#line 2070 "gen/gen_parser.c" +#line 2034 "gen/gen_parser.c" break; case 64: /* atom: DATE_LITERAL */ -#line 363 "src/parser.y" +#line 327 "src/parser.y" { (yyval.node) = gen_const_date((yyvsp[0].num), src_loc((yyloc))); } -#line 2078 "gen/gen_parser.c" +#line 2042 "gen/gen_parser.c" break; case 67: /* atom: "(" expression ")" */ -#line 368 "src/parser.y" +#line 332 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 2084 "gen/gen_parser.c" +#line 2048 "gen/gen_parser.c" break; case 68: /* function_call: FUNC_IDENT "(" opt_arguments ")" */ -#line 371 "src/parser.y" +#line 335 "src/parser.y" { (yyval.node) = gen_func_call((yyvsp[-3].str), (yyvsp[-1].node), src_loc((yyloc))); } -#line 2092 "gen/gen_parser.c" +#line 2056 "gen/gen_parser.c" break; case 69: /* unless_expression: "do" expression "unless" expression "otherwise" expression "done" */ -#line 376 "src/parser.y" +#line 340 "src/parser.y" { (yyval.node) = gen_unless_expr((yyvsp[-5].node), (yyvsp[-3].node), (yyvsp[-1].node), src_loc((yyloc))); } -#line 2100 "gen/gen_parser.c" +#line 2064 "gen/gen_parser.c" break; case 71: /* opt_definitions: %empty */ -#line 382 "src/parser.y" +#line 346 "src/parser.y" { (yyval.node) = NULL; } -#line 2106 "gen/gen_parser.c" +#line 2070 "gen/gen_parser.c" break; case 72: /* program: opt_definitions statement_list */ -#line 385 "src/parser.y" +#line 349 "src/parser.y" { if ((yyvsp[-1].node)) { ast_last((yyvsp[-1].node))->n = (yyvsp[0].node); @@ -2118,20 +2082,20 @@ yyreduce: parser->tree = (yyval.node); } -#line 2122 "gen/gen_parser.c" +#line 2086 "gen/gen_parser.c" break; case 73: /* program: error */ -#line 396 "src/parser.y" +#line 360 "src/parser.y" { /* make sure to catch parse errors */ parser->failed = true; } -#line 2131 "gen/gen_parser.c" +#line 2095 "gen/gen_parser.c" break; -#line 2135 "gen/gen_parser.c" +#line 2099 "gen/gen_parser.c" default: break; } @@ -2360,7 +2324,7 @@ yyreturnlab: return yyresult; } -#line 401 "src/parser.y" +#line 365 "src/parser.y" #include "gen_lexer.inc" |