Consider the following Jison grammar:
%lex
%%
\s+ { /* skip whitespace */ }
"[" { return "LBRACKET"; }
"]" { return "RBRACKET"; }
<<EOF>> { return "EOF"; }
. { return "INVALID"; }
%start program
/lex
%%
program
: s "EOF"
{ return $1; }
;
s
: /* empty */
{ $$ = 0; }
| "LBRACKET" s "RBRACKET" s
{ $$ = 1 + $2 + $4; }
;
Now consider the following four strings:
First, convince yourself that all of these strings are in the language defined by this grammar. Second, answer the following question: what are the values returned by the interpreter when fed these strings in the order given above?
First, make sure to understand the grammar only: disregard the JavaScript annotations.
Once you understand the structure of the generated strings, try to correlate that structure with the single value that is computed at each step.