我在试着了解一下吉森。不过,我有点麻烦。以下解析器总是返回[],不管您给它什么。
%lex
%%
"data"\s* return 'DATA'
[A-Za-z][A-Za-z0-9_]* return 'IDENTIFIER'
[0-9]+("."[0-9]+)?\b return 'NUMBER'
"=" return 'ASSIGN'
("<-"|"<+-") return 'REACT'
"+" return '+'
"-" return '-'
"*" return '*'
"/" return '/'
"^" return '^'
\n+ return 'NL'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
%token NL
/* operator associations and precedence */
%left ASSIGN
%left REACT
%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS
%start program
%% /* language grammar */
program
:
{return [];}
| program statement
{return $1.concat([$2]);}
| program statement EOF
{return $1.concat([$2]);}
;
statement
: assign NL
{return $1;}
;
assign
: IDENTIFIER ASSIGN expression
{return ['assign', $1, $3];}
| IDENTIFIER REACT expression
{return ['react', $1, $2, $3];}
;
expression
: NUMBER
{return +$1;}
| IDENTIFIER
;问题显然在我对非终端program的定义中。怎样才是正确的申报方式呢?
发布于 2015-04-15 20:02:24
正如Aadit M. Shah在评论中指出的那样,问题是在解析完成之前,不能在jison语法操作中使用return。如果解析器规则执行return,解析器本身将返回。您需要为$$分配语义值。
发布于 2016-01-20 20:18:03
尝试:
%start program
%% /* language grammar */
program
: EOF
{ return []; }
| statements EOF
{ return $1; }
;
statements
: statement
{ $$ = [$1]; }
| statements statement
{ $1.push($2); $$ = $1; }
;另外,将返回替换为"$$ =“
statement
: assign NL
{ $$ = $1; }
;
assign
: IDENTIFIER ASSIGN expression
{ $$ = ['assign', $1, $3]; }
| IDENTIFIER REACT expression
{ $$ = ['react', $1, $2, $3]; }
;
expression
: NUMBER
{ $$ = $1; }
| IDENTIFIER
{/*add something here like $$ = $1 to keep the original value*/}
;https://stackoverflow.com/questions/29655780
复制相似问题