我正在与JISON合作(http://zaach.github.io/jison)我边走边学。我遇到了一个问题,解析器在第一个匹配之后停止并且没有继续;我想。这是我的语法定义:
/* lexical grammar */
%lex
%%
ns{4} return 'INDENT'
n+ return 'NL'
[st]+ /* 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"
我本想在我的"AST"中得到两个条目,但我只得到了第一个。如有任何帮助,我们将不胜感激。
如果您不希望解析器返回第一个rule
,请不要:
{return $1}
或者,就这一点而言:
{return [$1, $2]}
其将在第二规则之后返回。
您需要做的是在看到EOF
时返回,因此您需要终止生产:
program: set EOF { return $1; }