diff options
Diffstat (limited to 'gen')
-rw-r--r-- | gen/gen_lexer.inc | 30 | ||||
-rw-r--r-- | gen/gen_parser.c | 638 |
2 files changed, 468 insertions, 200 deletions
diff --git a/gen/gen_lexer.inc b/gen/gen_lexer.inc index b6f9599..0e34d3f 100644 --- a/gen/gen_lexer.inc +++ b/gen/gen_lexer.inc @@ -1105,13 +1105,15 @@ case 36: YY_RULE_SETUP #line 156 "src/lexer.l" { - yylval->str = yytext; + /* skip quotation marks */ + yylval->str = strdup(yytext + 1); + yylval->str[strlen(yylval->str) - 1] = '\0'; return STRING; } YY_BREAK case 37: YY_RULE_SETUP -#line 161 "src/lexer.l" +#line 163 "src/lexer.l" { yylval->num = lex_date(parser, src_loc(*yylloc), yytext); return DATE_LITERAL; @@ -1119,7 +1121,7 @@ YY_RULE_SETUP YY_BREAK case 38: YY_RULE_SETUP -#line 166 "src/lexer.l" +#line 168 "src/lexer.l" { yylval->snum = lex_int(parser, src_loc(*yylloc), yytext); return INT_LITERAL; @@ -1127,47 +1129,47 @@ YY_RULE_SETUP YY_BREAK case 39: YY_RULE_SETUP -#line 171 "src/lexer.l" +#line 173 "src/lexer.l" { - yylval->str = yytext; + yylval->str = strdup(yytext); return IDENT; } YY_BREAK case 40: YY_RULE_SETUP -#line 176 "src/lexer.l" +#line 178 "src/lexer.l" { - yylval->str = yytext; + yylval->str = strdup(yytext); return FUNC_IDENT; } YY_BREAK case 41: YY_RULE_SETUP -#line 181 "src/lexer.l" +#line 183 "src/lexer.l" { - yylval->str = yytext; + yylval->str = strdup(yytext); return PROC_IDENT; } YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP -#line 186 "src/lexer.l" +#line 188 "src/lexer.l" {/* skip whitespace */} YY_BREAK case 43: YY_RULE_SETUP -#line 188 "src/lexer.l" +#line 190 "src/lexer.l" { lex_fail(parser, src_loc(*yylloc), "Unexpected token: %s", yytext); } YY_BREAK case 44: YY_RULE_SETUP -#line 191 "src/lexer.l" +#line 193 "src/lexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 1171 "gen/gen_lexer.inc" +#line 1173 "gen/gen_lexer.inc" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(SC_COMMENT): yyterminate(); @@ -2299,6 +2301,6 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 191 "src/lexer.l" +#line 193 "src/lexer.l" diff --git a/gen/gen_parser.c b/gen/gen_parser.c index a1632fd..7d6e67d 100644 --- a/gen/gen_parser.c +++ b/gen/gen_parser.c @@ -77,6 +77,7 @@ #include <posthaste/parser.h> #include <posthaste/date.h> +#include <posthaste/ast.h> #define FOREACH_TOKEN(M) \ M(LPAREN) \ @@ -115,7 +116,7 @@ M(PROC_IDENT) -#line 119 "gen/gen_parser.c" +#line 120 "gen/gen_parser.c" # ifndef YY_CAST # ifdef __cplusplus @@ -198,14 +199,14 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 59 "src/parser.y" +#line 60 "src/parser.y" - struct ast_node *node; + struct ast *node; ph_date_t num; int64_t snum; char *str; -#line 209 "gen/gen_parser.c" +#line 210 "gen/gen_parser.c" }; typedef union YYSTYPE YYSTYPE; @@ -293,29 +294,30 @@ enum yysymbol_kind_t YYSYMBOL_arguments = 52, /* arguments */ YYSYMBOL_opt_arguments = 53, /* opt_arguments */ YYSYMBOL_assignment = 54, /* assignment */ - YYSYMBOL_lvalue = 55, /* lvalue */ - YYSYMBOL_rvalue = 56, /* rvalue */ - YYSYMBOL_print_statement = 57, /* print_statement */ - YYSYMBOL_print_items = 58, /* print_items */ - YYSYMBOL_print_item = 59, /* print_item */ - YYSYMBOL_statement = 60, /* statement */ - YYSYMBOL_until_statement = 61, /* until_statement */ - YYSYMBOL_unless_statement = 62, /* unless_statement */ - YYSYMBOL_expression = 63, /* expression */ - YYSYMBOL_simple_expr = 64, /* simple_expr */ - YYSYMBOL_term = 65, /* term */ - YYSYMBOL_factor = 66, /* factor */ - YYSYMBOL_atom = 67, /* atom */ - YYSYMBOL_function_call = 68, /* function_call */ - YYSYMBOL_unless_expression = 69, /* unless_expression */ - YYSYMBOL_opt_definitions = 70, /* opt_definitions */ - YYSYMBOL_program = 71 /* program */ + YYSYMBOL_ident = 55, /* ident */ + YYSYMBOL_lvalue = 56, /* lvalue */ + YYSYMBOL_rvalue = 57, /* rvalue */ + YYSYMBOL_print_statement = 58, /* print_statement */ + YYSYMBOL_print_items = 59, /* print_items */ + YYSYMBOL_print_item = 60, /* print_item */ + YYSYMBOL_statement = 61, /* statement */ + YYSYMBOL_until_statement = 62, /* until_statement */ + YYSYMBOL_unless_statement = 63, /* unless_statement */ + YYSYMBOL_expression = 64, /* expression */ + YYSYMBOL_simple_expr = 65, /* simple_expr */ + YYSYMBOL_term = 66, /* term */ + YYSYMBOL_factor = 67, /* factor */ + YYSYMBOL_atom = 68, /* atom */ + YYSYMBOL_function_call = 69, /* function_call */ + YYSYMBOL_unless_expression = 70, /* unless_expression */ + YYSYMBOL_opt_definitions = 71, /* opt_definitions */ + YYSYMBOL_program = 72 /* program */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; /* Second part of user prologue. */ -#line 104 "src/parser.y" +#line 143 "src/parser.y" /** Modifies the signature of yylex to fit our parser better. */ @@ -355,7 +357,7 @@ static void yyerror(YYLTYPE *yylloc, void *lexer, struct parser *parser, const char *msg); -#line 359 "gen/gen_parser.c" +#line 361 "gen/gen_parser.c" #ifdef short @@ -680,18 +682,18 @@ union yyalloc #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 29 +#define YYFINAL 30 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 156 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 37 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 35 +#define YYNNTS 36 /* YYNRULES -- Number of rules. */ -#define YYNRULES 72 +#define YYNRULES 73 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 136 +#define YYNSTATES 137 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 291 @@ -744,14 +746,14 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 148, 148, 149, 152, 153, 156, 157, 158, 161, - 164, 165, 168, 169, 172, 175, 176, 179, 183, 188, - 189, 192, 193, 196, 199, 202, 203, 206, 207, 210, - 213, 214, 217, 218, 221, 224, 225, 228, 229, 232, - 233, 234, 235, 236, 237, 240, 243, 244, 247, 248, - 249, 252, 253, 254, 257, 258, 259, 262, 263, 264, - 267, 268, 269, 270, 271, 272, 273, 276, 279, 282, - 283, 286, 287 + 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 }; #endif @@ -778,10 +780,11 @@ static const char *const yytname[] = "opt_variable_definitions", "return", "opt_return", "function_definition", "procedure_definition", "formals", "opt_formals", "formal_arg", "procedure_call", "arguments", "opt_arguments", - "assignment", "lvalue", "rvalue", "print_statement", "print_items", - "print_item", "statement", "until_statement", "unless_statement", - "expression", "simple_expr", "term", "factor", "atom", "function_call", - "unless_expression", "opt_definitions", "program", YY_NULLPTR + "assignment", "ident", "lvalue", "rvalue", "print_statement", + "print_items", "print_item", "statement", "until_statement", + "unless_statement", "expression", "simple_expr", "term", "factor", + "atom", "function_call", "unless_expression", "opt_definitions", + "program", YY_NULLPTR }; static const char * @@ -791,34 +794,34 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-21) +#define YYPACT_NINF (-18) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-71) +#define YYTABLE_NINF (-72) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -static const yytype_int8 yypact[] = +static const yytype_int16 yypact[] = { - 5, -21, 4, 51, 56, -21, 32, -21, -21, -21, - -3, 83, 81, 89, 95, -21, 97, 104, -3, 66, - 47, -21, -21, -21, 98, -21, 99, -21, -21, -21, - 66, 112, 112, 113, 66, -20, -21, -21, 105, 114, - 66, 86, 86, -21, 9, 3, 20, -21, -21, -21, - -21, -21, 106, 9, 12, -3, 9, 110, -21, 111, - 107, 115, -21, -21, 116, 65, 66, 66, 121, 66, - 57, -21, -21, 66, 66, 66, 66, 66, 66, 47, - 66, -21, 9, -21, -21, 122, 96, 112, 96, -21, - 66, -5, 9, -21, 123, -21, 3, 3, 20, 20, - -21, -21, -21, 59, 119, 126, -21, 109, -21, 109, - -21, -3, -21, -21, 66, -21, -21, 109, -21, 117, - 118, 108, 61, -21, -3, 12, -21, 66, 100, 101, - 27, 103, 120, -21, -21, -21 + 23, -18, 20, 11, 14, -18, -15, -18, -18, -18, + -2, 30, 21, 31, 41, -18, -18, 51, -2, 113, + 68, -18, -18, -18, 70, 89, -18, 93, -18, -18, + -18, 113, 107, 107, 113, 34, -18, -18, 105, 113, + 88, 88, -18, 108, 59, 63, 57, -18, -18, -18, + -18, -18, 109, 59, 118, 61, -2, 59, 115, -18, + 114, 110, 116, -18, 119, 22, 113, 113, 113, 15, + -18, -18, 125, 113, 113, 113, 113, 113, 113, 68, + -18, 113, -18, 59, -18, -18, 126, 99, 107, 99, + -18, 113, -8, 59, 127, -18, -18, 63, 63, 57, + 57, -18, -18, -18, 32, 124, 132, -18, 117, -18, + 117, -18, -2, -18, -18, 113, -18, -18, 117, -18, + 120, 121, 112, 17, -18, -2, 61, -18, 113, 103, + 104, -4, 122, 111, -18, -18, -18 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -826,38 +829,38 @@ static const yytype_int8 yypact[] = means the default is an error. */ static const yytype_int8 yydefact[] = { - 0, 72, 0, 0, 0, 69, 5, 8, 6, 7, + 0, 73, 0, 0, 0, 70, 5, 8, 6, 7, 0, 0, 0, 0, 0, 4, 30, 0, 0, 0, - 0, 71, 39, 40, 0, 41, 3, 42, 43, 1, - 0, 22, 22, 0, 28, 0, 63, 62, 60, 0, - 0, 0, 0, 65, 44, 48, 51, 54, 59, 64, - 37, 34, 36, 38, 0, 0, 9, 0, 21, 0, - 20, 0, 31, 27, 0, 26, 0, 0, 0, 28, - 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, - 0, 29, 32, 33, 2, 0, 16, 0, 0, 24, - 0, 0, 45, 61, 0, 66, 49, 50, 52, 53, - 55, 56, 35, 0, 0, 0, 15, 13, 19, 13, - 25, 0, 46, 67, 0, 23, 14, 11, 12, 0, - 0, 0, 0, 10, 0, 0, 47, 0, 0, 0, - 0, 0, 0, 68, 18, 17 + 0, 72, 40, 41, 31, 0, 42, 3, 43, 44, + 1, 0, 22, 22, 28, 0, 64, 63, 0, 0, + 0, 0, 66, 61, 45, 49, 52, 55, 60, 65, + 38, 35, 37, 39, 0, 0, 0, 9, 0, 21, + 0, 20, 0, 27, 0, 26, 0, 0, 28, 0, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 29, 33, 34, 2, 0, 16, 0, 0, + 24, 0, 0, 46, 0, 67, 62, 50, 51, 53, + 54, 56, 57, 36, 0, 0, 0, 15, 13, 19, + 13, 25, 0, 47, 68, 0, 23, 14, 11, 12, + 0, 0, 0, 0, 10, 0, 0, 48, 0, 0, + 0, 0, 0, 0, 69, 18, 17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -21, -14, 132, -21, 60, 23, 33, 53, -21, -21, - -21, -21, 124, 58, -10, 62, 77, -21, -21, 22, - -21, 69, -21, -21, -21, -21, -18, 25, 28, 34, - 64, -21, -21, -21, -21 + -18, -13, 135, -18, 7, 33, 35, 60, -18, -18, + -18, 62, 123, -18, -10, 64, 80, -18, -9, -18, + 26, -18, 74, -18, -18, -18, -18, -17, 13, 25, + 27, 66, -18, -18, -18, -18 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - 0, 21, 5, 6, 117, 118, 119, 106, 107, 8, - 9, 58, 59, 60, 43, 63, 64, 23, 24, 81, - 25, 51, 52, 26, 27, 28, 65, 45, 46, 47, - 48, 49, 83, 10, 11 + 0, 21, 5, 6, 118, 119, 120, 107, 108, 8, + 9, 59, 60, 61, 42, 63, 64, 23, 43, 25, + 82, 26, 51, 52, 27, 28, 29, 65, 45, 46, + 47, 48, 49, 84, 10, 11 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -865,42 +868,42 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 22, 44, 53, 16, 35, 17, 1, 66, 22, 67, - 12, -70, 56, -70, 73, 74, 36, 37, 38, 39, - 17, 40, 70, 111, 75, 76, 112, 18, 73, 74, - 2, 19, 20, 41, 42, -70, 82, 3, 4, -70, - -70, 84, 80, 77, 78, 22, 73, 74, 91, 92, - 50, 36, 37, 38, 39, 17, 40, 2, 133, 13, - 7, 53, 103, 14, 3, 4, 7, 95, 41, 42, - 36, 37, 38, 39, 17, 40, 73, 74, 73, 74, - 73, 74, 90, 29, 73, 74, 114, 41, 42, 127, - 36, 37, 38, 39, 17, 40, 122, 121, 96, 97, - 30, 22, 31, 98, 99, 71, 72, 82, 32, 130, - 128, 100, 101, 34, 22, 33, 55, 54, 57, 62, - 68, 85, 79, 69, 87, 86, 89, 93, 104, 88, - 105, 115, 116, 113, 2, 134, 131, 132, 15, 126, - 123, 109, 120, 124, 125, 108, 94, 129, 102, 0, - 0, 0, 110, 135, 0, 0, 61 + 22, 24, 44, 53, 16, 35, 17, 7, 22, 24, + 2, 73, 74, 7, 57, 73, 74, 3, 4, 13, + 112, 14, 69, 113, 1, 95, 12, 134, 18, -71, + 30, -71, 19, 20, 73, 74, 73, 74, 83, 91, + 31, 73, 74, 85, 32, 128, 22, 24, 2, 92, + 93, 73, 74, -71, 33, 3, 4, -71, -71, 115, + 34, 66, 53, 67, 104, 36, 37, 16, 38, 17, + 39, 50, 36, 37, 16, 38, 17, 39, 73, 74, + 77, 78, 40, 41, 75, 76, 97, 98, 54, 40, + 41, 81, 36, 37, 16, 38, 17, 39, 123, 122, + 99, 100, 22, 24, 101, 102, 70, 71, 55, 83, + 56, 131, 129, 58, 68, 22, 24, 36, 37, 16, + 38, 17, 39, 72, 80, 79, 86, 88, 87, 90, + 89, 96, 105, 106, 40, 41, 116, 114, 117, 132, + 133, 15, 2, 127, 136, 121, 125, 126, 94, 110, + 109, 124, 130, 103, 135, 111, 62 }; -static const yytype_int8 yycheck[] = +static const yytype_uint8 yycheck[] = { - 10, 19, 20, 6, 18, 8, 1, 27, 18, 29, - 6, 6, 30, 8, 19, 20, 4, 5, 6, 7, - 8, 9, 40, 28, 21, 22, 31, 30, 19, 20, - 25, 34, 35, 21, 22, 30, 54, 32, 33, 34, - 35, 55, 30, 23, 24, 55, 19, 20, 66, 67, - 3, 4, 5, 6, 7, 8, 9, 25, 31, 8, - 0, 79, 80, 7, 32, 33, 6, 10, 21, 22, - 4, 5, 6, 7, 8, 9, 19, 20, 19, 20, - 19, 20, 17, 0, 19, 20, 27, 21, 22, 28, - 4, 5, 6, 7, 8, 9, 114, 111, 73, 74, - 19, 111, 13, 75, 76, 41, 42, 125, 13, 127, - 124, 77, 78, 9, 124, 18, 17, 19, 6, 6, - 15, 11, 16, 9, 17, 14, 10, 6, 6, 14, - 34, 12, 6, 10, 25, 32, 36, 36, 6, 31, - 117, 88, 109, 26, 26, 87, 69, 125, 79, -1, - -1, -1, 90, 33, -1, -1, 32 + 10, 10, 19, 20, 6, 18, 8, 0, 18, 18, + 25, 19, 20, 6, 31, 19, 20, 32, 33, 8, + 28, 7, 39, 31, 1, 10, 6, 31, 30, 6, + 0, 8, 34, 35, 19, 20, 19, 20, 55, 17, + 19, 19, 20, 56, 13, 28, 56, 56, 25, 66, + 67, 19, 20, 30, 13, 32, 33, 34, 35, 27, + 9, 27, 79, 29, 81, 4, 5, 6, 7, 8, + 9, 3, 4, 5, 6, 7, 8, 9, 19, 20, + 23, 24, 21, 22, 21, 22, 73, 74, 18, 21, + 22, 30, 4, 5, 6, 7, 8, 9, 115, 112, + 75, 76, 112, 112, 77, 78, 40, 41, 19, 126, + 17, 128, 125, 6, 9, 125, 125, 4, 5, 6, + 7, 8, 9, 15, 6, 16, 11, 17, 14, 10, + 14, 6, 6, 34, 21, 22, 12, 10, 6, 36, + 36, 6, 25, 31, 33, 110, 26, 26, 68, 89, + 88, 118, 126, 79, 32, 91, 33 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -908,19 +911,19 @@ static const yytype_int8 yycheck[] = static const yytype_int8 yystos[] = { 0, 1, 25, 32, 33, 39, 40, 41, 46, 47, - 70, 71, 6, 8, 7, 39, 6, 8, 30, 34, - 35, 38, 51, 54, 55, 57, 60, 61, 62, 0, - 19, 13, 13, 18, 9, 38, 4, 5, 6, 7, - 9, 21, 22, 51, 63, 64, 65, 66, 67, 68, - 3, 58, 59, 63, 19, 17, 63, 6, 48, 49, - 50, 49, 6, 52, 53, 63, 27, 29, 15, 9, - 63, 67, 67, 19, 20, 21, 22, 23, 24, 16, - 30, 56, 63, 69, 38, 11, 14, 17, 14, 10, - 17, 63, 63, 6, 53, 10, 64, 64, 65, 65, - 66, 66, 58, 63, 6, 34, 44, 45, 50, 44, - 52, 28, 31, 10, 27, 12, 6, 41, 42, 43, - 43, 38, 63, 42, 26, 26, 31, 28, 38, 56, - 63, 36, 36, 31, 32, 33 + 71, 72, 6, 8, 7, 39, 6, 8, 30, 34, + 35, 38, 51, 54, 55, 56, 58, 61, 62, 63, + 0, 19, 13, 13, 9, 38, 4, 5, 7, 9, + 21, 22, 51, 55, 64, 65, 66, 67, 68, 69, + 3, 59, 60, 64, 18, 19, 17, 64, 6, 48, + 49, 50, 49, 52, 53, 64, 27, 29, 9, 64, + 68, 68, 15, 19, 20, 21, 22, 23, 24, 16, + 6, 30, 57, 64, 70, 38, 11, 14, 17, 14, + 10, 17, 64, 64, 53, 10, 6, 65, 65, 66, + 66, 67, 67, 59, 64, 6, 34, 44, 45, 48, + 44, 52, 28, 31, 10, 27, 12, 6, 41, 42, + 43, 43, 38, 64, 42, 26, 26, 31, 28, 38, + 57, 64, 36, 36, 31, 32, 33 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -929,11 +932,11 @@ static const yytype_int8 yyr1[] = 0, 37, 38, 38, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 49, 50, 51, 52, 52, 53, 53, 54, - 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, - 60, 60, 60, 60, 60, 61, 62, 62, 63, 63, - 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, - 67, 67, 67, 67, 67, 67, 67, 68, 69, 70, - 70, 71, 71 + 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, + 61, 61, 61, 61, 61, 61, 62, 63, 63, 64, + 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, + 67, 68, 68, 68, 68, 68, 68, 68, 69, 70, + 71, 71, 72, 72 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -942,11 +945,11 @@ static const yytype_int8 yyr2[] = 0, 2, 3, 1, 2, 1, 1, 1, 1, 4, 2, 1, 1, 0, 2, 1, 0, 11, 11, 3, 1, 1, 0, 4, 4, 3, 1, 1, 0, 3, - 1, 3, 1, 1, 2, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 4, 5, 7, 1, 3, - 3, 1, 3, 3, 1, 3, 3, 2, 2, 1, - 1, 3, 1, 1, 1, 1, 3, 4, 7, 1, - 0, 2, 1 + 1, 1, 3, 1, 1, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 4, 5, 7, 1, + 3, 3, 1, 3, 3, 1, 3, 3, 2, 2, + 1, 1, 3, 1, 1, 1, 1, 3, 4, 7, + 1, 0, 2, 1 }; @@ -1805,23 +1808,330 @@ yyreduce: YY_REDUCE_PRINT (yyn); switch (yyn) { - case 70: /* opt_definitions: %empty */ -#line 283 "src/parser.y" - {} -#line 1812 "gen/gen_parser.c" + case 2: /* statement_list: statement "," statement_list */ +#line 187 "src/parser.y" + { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1815 "gen/gen_parser.c" break; - case 72: /* program: error */ -#line 287 "src/parser.y" + case 4: /* definitions: definition definitions */ +#line 191 "src/parser.y" + { (yyval.node) = (yyvsp[-1].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1821 "gen/gen_parser.c" + break; + + case 9: /* variable_definition: "var" IDENT "=" expression */ +#line 200 "src/parser.y" + { + (yyval.node) = gen_var_def((yyvsp[-2].str), (yyvsp[0].node), src_loc((yyloc))); + } +#line 1829 "gen/gen_parser.c" + break; + + case 10: /* variable_definitions: variable_definition variable_definitions */ +#line 205 "src/parser.y" + { (yyval.node) = (yyvsp[-1].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1835 "gen/gen_parser.c" + break; + + case 13: /* opt_variable_definitions: %empty */ +#line 210 "src/parser.y" + { (yyval.node) = NULL; } +#line 1841 "gen/gen_parser.c" + break; + + case 14: /* return: "return" IDENT */ +#line 213 "src/parser.y" + { (yyval.str) = (yyvsp[0].str); } +#line 1847 "gen/gen_parser.c" + break; + + case 16: /* opt_return: %empty */ +#line 217 "src/parser.y" + { (yyval.str) = NULL; } +#line 1853 "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" + { + struct ast *ret = gen_return((yyvsp[-2].node), (yyvsp[-2].node)->loc); + (yyval.node) = gen_func_def((yyvsp[-9].str), + (yyvsp[-5].str), + (yyvsp[-7].node), + (yyvsp[-4].node), + ret, + src_loc((yyloc))); + } +#line 1867 "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" + { + (yyval.node) = gen_proc_def((yyvsp[-9].str), + (yyvsp[-5].str), + (yyvsp[-7].node), + (yyvsp[-4].node), + (yyvsp[-2].node), + src_loc((yyloc))); + } +#line 1880 "gen/gen_parser.c" + break; + + case 19: /* formals: formal_arg "," formals */ +#line 244 "src/parser.y" + { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1886 "gen/gen_parser.c" + break; + + case 22: /* opt_formals: %empty */ +#line 249 "src/parser.y" + { (yyval.node) = NULL; } +#line 1892 "gen/gen_parser.c" + break; + + case 23: /* formal_arg: IDENT "[" IDENT "]" */ +#line 252 "src/parser.y" + { + (yyval.node) = gen_formal_def((yyvsp[-3].str), (yyvsp[-1].str), src_loc((yyloc))); + } +#line 1900 "gen/gen_parser.c" + break; + + case 24: /* procedure_call: PROC_IDENT "(" opt_arguments ")" */ +#line 257 "src/parser.y" + { + (yyval.node) = gen_proc_call((yyvsp[-3].str), (yyvsp[-1].node), src_loc((yyloc))); + } +#line 1908 "gen/gen_parser.c" + break; + + case 25: /* arguments: expression "," arguments */ +#line 262 "src/parser.y" + { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1914 "gen/gen_parser.c" + break; + + case 28: /* opt_arguments: %empty */ +#line 267 "src/parser.y" + { (yyval.node) = NULL; } +#line 1920 "gen/gen_parser.c" + break; + + case 29: /* assignment: lvalue "=" rvalue */ +#line 270 "src/parser.y" + { + (yyval.node) = gen_assign((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 1928 "gen/gen_parser.c" + break; + + case 30: /* ident: IDENT */ +#line 275 "src/parser.y" + { + (yyval.node) = gen_id((yyvsp[0].str), src_loc((yyloc))); + } +#line 1936 "gen/gen_parser.c" + break; + + case 32: /* lvalue: ident "." IDENT */ +#line 281 "src/parser.y" + { (yyval.node) = gen_dot((yyvsp[-2].node), (yyvsp[0].str), src_loc((yyloc))); } +#line 1942 "gen/gen_parser.c" + break; + + case 35: /* print_statement: "print" print_items */ +#line 288 "src/parser.y" + { (yyval.node) = gen_print((yyvsp[0].node), src_loc((yyloc))); } +#line 1948 "gen/gen_parser.c" + break; + + case 36: /* print_items: print_item "&" print_items */ +#line 291 "src/parser.y" + { (yyval.node) = (yyvsp[-2].node); (yyval.node)->n = (yyvsp[0].node); } +#line 1954 "gen/gen_parser.c" + break; + + case 38: /* print_item: STRING */ +#line 295 "src/parser.y" + { (yyval.node) = gen_const_string((yyvsp[0].str), src_loc((yyloc))); } +#line 1960 "gen/gen_parser.c" + break; + + case 45: /* statement: "return" expression */ +#line 304 "src/parser.y" + { (yyval.node) = gen_return((yyvsp[0].node), src_loc((yyloc))); } +#line 1966 "gen/gen_parser.c" + break; + + case 46: /* until_statement: "do" statement_list "until" expression */ +#line 307 "src/parser.y" + { + (yyval.node) = gen_until((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 1974 "gen/gen_parser.c" + break; + + case 47: /* unless_statement: "do" statement_list "unless" expression "done" */ +#line 312 "src/parser.y" + { + (yyval.node) = gen_unless((yyvsp[-3].node), (yyvsp[-1].node), NULL, src_loc((yyloc))); + } +#line 1982 "gen/gen_parser.c" + break; + + case 48: /* unless_statement: "do" statement_list "unless" expression "otherwise" statement_list "done" */ +#line 315 "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" + break; + + case 50: /* expression: expression "=" simple_expr */ +#line 321 "src/parser.y" + { + (yyval.node) = gen_eq((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 1998 "gen/gen_parser.c" + break; + + case 51: /* expression: expression "<" simple_expr */ +#line 324 "src/parser.y" + { + (yyval.node) = gen_lt((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 2006 "gen/gen_parser.c" + break; + + case 53: /* simple_expr: simple_expr "+" term */ +#line 330 "src/parser.y" + { + (yyval.node) = gen_add((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 2014 "gen/gen_parser.c" + break; + + case 54: /* simple_expr: simple_expr "-" term */ +#line 333 "src/parser.y" + { + (yyval.node) = gen_sub((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 2022 "gen/gen_parser.c" + break; + + case 56: /* term: term "*" factor */ +#line 339 "src/parser.y" + { + (yyval.node) = gen_mul((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 2030 "gen/gen_parser.c" + break; + + case 57: /* term: term "/" factor */ +#line 342 "src/parser.y" + { + (yyval.node) = gen_div((yyvsp[-2].node), (yyvsp[0].node), src_loc((yyloc))); + } +#line 2038 "gen/gen_parser.c" + break; + + case 58: /* factor: "+" atom */ +#line 347 "src/parser.y" + { + (yyval.node) = gen_pos((yyvsp[0].node), src_loc((yyloc))); + } +#line 2046 "gen/gen_parser.c" + break; + + case 59: /* factor: "-" atom */ +#line 350 "src/parser.y" + { + (yyval.node) = gen_neg((yyvsp[0].node), src_loc((yyloc))); + } +#line 2054 "gen/gen_parser.c" + break; + + case 62: /* atom: ident "'" IDENT */ +#line 357 "src/parser.y" + { + (yyval.node) = gen_attr((yyvsp[-2].node), (yyvsp[0].str), src_loc((yyloc))); + } +#line 2062 "gen/gen_parser.c" + break; + + case 63: /* atom: INT_LITERAL */ +#line 360 "src/parser.y" + { + (yyval.node) = gen_const_int((yyvsp[0].snum), src_loc((yyloc))); + } +#line 2070 "gen/gen_parser.c" + break; + + case 64: /* atom: DATE_LITERAL */ +#line 363 "src/parser.y" + { + (yyval.node) = gen_const_date((yyvsp[0].num), src_loc((yyloc))); + } +#line 2078 "gen/gen_parser.c" + break; + + case 67: /* atom: "(" expression ")" */ +#line 368 "src/parser.y" + { (yyval.node) = (yyvsp[-1].node); } +#line 2084 "gen/gen_parser.c" + break; + + case 68: /* function_call: FUNC_IDENT "(" opt_arguments ")" */ +#line 371 "src/parser.y" + { + (yyval.node) = gen_func_call((yyvsp[-3].str), (yyvsp[-1].node), src_loc((yyloc))); + } +#line 2092 "gen/gen_parser.c" + break; + + case 69: /* unless_expression: "do" expression "unless" expression "otherwise" expression "done" */ +#line 376 "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" + break; + + case 71: /* opt_definitions: %empty */ +#line 382 "src/parser.y" + { (yyval.node) = NULL; } +#line 2106 "gen/gen_parser.c" + break; + + case 72: /* program: opt_definitions statement_list */ +#line 385 "src/parser.y" + { + if ((yyvsp[-1].node)) { + ast_last((yyvsp[-1].node))->n = (yyvsp[0].node); + (yyval.node) = (yyvsp[-1].node); + } + else { + (yyval.node) = (yyvsp[0].node); + } + + parser->tree = (yyval.node); + } +#line 2122 "gen/gen_parser.c" + break; + + case 73: /* program: error */ +#line 396 "src/parser.y" { /* make sure to catch parse errors */ parser->failed = true; } -#line 1821 "gen/gen_parser.c" +#line 2131 "gen/gen_parser.c" break; -#line 1825 "gen/gen_parser.c" +#line 2135 "gen/gen_parser.c" default: break; } @@ -2050,49 +2360,11 @@ yyreturnlab: return yyresult; } -#line 292 "src/parser.y" +#line 401 "src/parser.y" #include "gen_lexer.inc" -static void dump_yychar(struct parser *p, int yychar, YYSTYPE yylval, YYLTYPE yylloc) -{ - struct src_loc loc = src_loc(yylloc); - printf("%s:%d:%d: ", p->fname, loc.first_line, loc.first_col); - -#define PRINT_NAME(token) case token: printf(#token " "); break; - switch (yychar) { - FOREACH_TOKEN(PRINT_NAME); - default: printf("Unknown yychar\n"); return; - } - - char date_str[11] = {0}; - switch (yychar) { - case INT_LITERAL: printf("(%lld)", (long long int)yylval.snum); break; - case IDENT: printf("(%s)", yylval.str); break; - case FUNC_IDENT: printf("(%s)", yylval.str); break; - case PROC_IDENT: printf("(%s)", yylval.str); break; - case DATE_LITERAL: - date_to_string(date_str, yylval.num); - printf("(%s)", date_str); - break; - } - - printf("\n"); -} - -static void dump_lex(struct parser *p) -{ - int yychar; - YYSTYPE yylval; - YYLTYPE yylloc = {1, 1, 1, 1}; - - /* run lexer until we reach the end of the file */ - while ((yychar = yylex(&yylval, &yylloc, p->lexer, p)) != YYEOF) { - dump_yychar(p, yychar, yylval, yylloc); - } -} - static struct src_loc src_loc(YYLTYPE yylloc) { struct src_loc loc; @@ -2139,11 +2411,5 @@ void parse(struct parser *p, const char *fname, const char *buf) yylex_init(&p->lexer); yy_scan_string(buf, p->lexer); - - // debugging, remember to reset yy_scan_string once the actual parser - // runs - //dump_lex(p); - - yy_scan_string(buf, p->lexer); yyparse(p->lexer, p); } |