0

私は 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" に 2 つのエントリが表示されると予想されますが、取得できるのは最初の 1 つだけです。どんな助けでも大歓迎です。

4

1 に答える 1