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