Fix parser issue with assert and echo by adding them as separate tokens

This commit is contained in:
Marius Kintel 2016-11-05 14:57:47 -04:00
parent ba2c259f97
commit 48a2ff63bf
2 changed files with 41 additions and 22 deletions

View file

@ -170,6 +170,8 @@ use[ \t\r\n>]*"<" { BEGIN(cond_use); }
"if" return TOK_IF;
"else" return TOK_ELSE;
"let" return TOK_LET;
"assert" return TOK_ASSERT;
"echo" return TOK_ECHO;
"for" return TOK_FOR;
"each" return TOK_EACH;

View file

@ -92,6 +92,8 @@ fs::path parser_sourcefile;
%token TOK_ELSE
%token TOK_FOR
%token TOK_LET
%token TOK_ASSERT
%token TOK_ECHO
%token TOK_EACH
%token <text> TOK_ID
@ -105,7 +107,9 @@ fs::path parser_sourcefile;
%token LE GE EQ NE AND OR
%left HIGH_PRIO_LEFT
%right LET
%right LOW_PRIO_RIGHT
%left LOW_PRIO_LEFT
%right '?' ':'
@ -120,7 +124,8 @@ fs::path parser_sourcefile;
%left '[' ']'
%left '.'
%left LOW_PRIO_LEFT
%right HIGH_PRIO_RIGHT
%left HIGH_PRIO_LEFT
%type <expr> expr
%type <vec> vector_expr
@ -296,6 +301,8 @@ module_id:
TOK_ID { $$ = $1; }
| TOK_FOR { $$ = strdup("for"); }
| TOK_LET { $$ = strdup("let"); }
| TOK_ASSERT { $$ = strdup("assert"); }
| TOK_ECHO { $$ = strdup("echo"); }
| TOK_EACH { $$ = strdup("each"); }
;
@ -432,17 +439,27 @@ expr:
{
$$ = new ArrayLookup($1, $3, LOC(@$));
}
| TOK_ID '(' arguments_call ')' expr_or_empty
| TOK_ID '(' arguments_call ')'
{
$$ = FunctionCall::create($1, *$3, $5, LOC(@$));
$$ = new FunctionCall($1, *$3, LOC(@$));
free($1);
delete $3;
}
| TOK_LET '(' arguments_call ')' expr_or_empty
| TOK_LET '(' arguments_call ')' expr %prec LET
{
$$ = FunctionCall::create("let", *$3, $5, LOC(@$));
delete $3;
}
| TOK_ASSERT '(' arguments_call ')' expr_or_empty %prec LOW_PRIO_LEFT
{
$$ = FunctionCall::create("assert", *$3, $5, LOC(@$));
delete $3;
}
| TOK_ECHO '(' arguments_call ')' expr_or_empty %prec LOW_PRIO_LEFT
{
$$ = FunctionCall::create("echo", *$3, $5, LOC(@$));
delete $3;
}
;
expr_or_empty:
@ -456,7 +473,7 @@ expr_or_empty:
}
;
list_comprehension_elements:
list_comprehension_elements:
/* The last set element may not be a "let" (as that would instead
be parsed as an expression) */
TOK_LET '(' arguments_call ')' list_comprehension_elements_p