aboutsummaryrefslogtreecommitdiff
path: root/gen
diff options
context:
space:
mode:
Diffstat (limited to 'gen')
-rw-r--r--gen/gen_lexer.inc30
-rw-r--r--gen/gen_parser.c638
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);
}