我正在与 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"
我希望在生成的“AST”中得到两个条目,但我只得到第一个。任何帮助将不胜感激。