Fix parser issue with assert and echo by adding them as separate tokens
This commit is contained in:
parent
ba2c259f97
commit
48a2ff63bf
2 changed files with 41 additions and 22 deletions
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
61
src/parser.y
61
src/parser.y
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue