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; "if" return TOK_IF;
"else" return TOK_ELSE; "else" return TOK_ELSE;
"let" return TOK_LET; "let" return TOK_LET;
"assert" return TOK_ASSERT;
"echo" return TOK_ECHO;
"for" return TOK_FOR; "for" return TOK_FOR;
"each" return TOK_EACH; "each" return TOK_EACH;

View file

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