我正在与JISON(http://zaach.github.io/jison)合作,我正在学习。我遇到了一个问题,即解析器停止并且不会在第一场比赛之后继续;我认为。这是我的语法定义:
/* lexical grammar */
%lex
%%
\n\s{4} return 'INDENT'
\n+ return 'NL'
[\s\t]+ /* ignore whitespace */
"(" return 'PAREN_OPEN'
")" return 'PAREN_CLOSE'
"AND"|"OR" return 'LOGIC'
"=="|"!=" return 'OPERATOR'
">="|"<="|">"|"<" return 'OPERATOR'
"IN"|"NOTIN" return 'OPERATOR'
"IF" return 'START'
"true"|"false" return 'VALUE'
[0-9]+("."[0-9]+)?\b return 'VALUE'
\"[^"]+\" return 'VALUE'
[a-zA-Z][_a-zA-Z0-9]+ return 'IDENTIFIER'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
/* language grammar */
%start set
%%
action
: INDENT IDENTIFIER VALUE
{$$ = [$2, $3];}
;
body
: action
| body action
{$$ = [$1, $2];}
;
condition
: group
| relation
| condition LOGIC relation
{$$ = [$1, $2, $3];}
;
end: NL|EOF;
group
: PAREN_OPEN condition PAREN_CLOSE
{$$ = {conditions: $2};}
;
relation
: IDENTIFIER OPERATOR VALUE
{$$ = [$1, $2, $3];}
;
rule
: START condition body NL
{$$ = {
conditions: $2,
statements: $3
};}
;
set
: rule
{return $1;}
| set rule
{return [$1, $2];}
;
...和我的示例输入:
IF Love > "Hate"
Live "life"
IF Evil < "Good"
Be "Happy"
我希望在我的结果中得到两个条目&#34; AST&#34;但我只是第一个。任何帮助将不胜感激。
答案 0 :(得分:1)
如果您不希望解析器返回第一个rule
,请不要:
{return $1}
或者,就此而言:
{return [$1, $2]}
将在第二条规则之后返回。
当您看到EOF
时,您需要做的是返回,因此您需要终止生产:
program: set EOF { return $1; }