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

时间:2014-09-19 17:01:54

标签: bison dsl context-free-grammar jison

我正在与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;但我只是第一个。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您不希望解析器返回第一个rule,请不要:

 {return $1}

或者,就此而言:

 {return [$1, $2]}

将在第二条规则之后返回。

当您看到EOF时,您需要做的是返回,因此您需要终止生产:

 program: set EOF { return $1; }