我如何在JISON中获得许多规则实例



我正在与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; }

最新更新