0

Jison (javascript パーサー) で非常に単純な言語を定義することによって、解析のコツをつかもうとしています。バイソンと同じ/非常によく似た構文を受け入れます。

これが私の文法です:

%token INT TRUE FALSE WHILE DO IF THEN ELSE LOCATION ASSIGN EOF DEREF

%left "+"
%left ">="

/* Define Start Production */
%start Program 

/* Define Grammar Productions */
%%

Program
    : Statement EOF
    ;

Statement
    : Expression
    | WHILE BoolExpression DO Statement
    | LOCATION ASSIGN IntExpression
    ;

Expression
    : IntExpression
    | BoolExpression
    ;

IntExpression
    : INT IntExpressionRest
    | IF BoolExpression THEN Statement ELSE Statement
    | DEREF LOCATION
    ;   

IntExpressionRest
    : /* epsilon */
    | "+" IntExpression
    ;

BoolExpression
    : TRUE
    | FALSE
    | IntExpression ">=" IntExpression
    ;

%%

シフト/削減の競合が 1 つ発生しています。ジソンの出力は次のとおりです。

Conflict in grammar: multiple actions possible when lookahead token is >= in state 6
- reduce by rule: Expression -> IntExpression
- shift token (then go to state 17)

States with conflicts:
State 6
  Expression -> IntExpression . #lookaheads= EOF >= THEN DO ELSE
  BoolExpression -> IntExpression .>= IntExpression #lookaheads= EOF DO THEN ELSE >=
4

2 に答える 2

1

>=が非終端記号のフォロー セットにあるため、shift reduce の競合が検出されましたExpression。これは基本的に、 a が であり、で終わるStatement可能性があるという事実によって引き起こされます。次の入力を考えてみましょう。あいまいさをなくすために括弧があれば、これは と の両方として解釈できます。shift は reduce よりも優先されるため、reduce が選択されます。ExpressionIntExpressionstatementIF c THEN S1 ELSE S2 >= 42(IF c THEN S1 ELSE S2) >= 42IF c THEN S1 ELSE (S2 >= 42)

于 2013-04-14T00:33:16.260 に答える
-1

あなたの問題はから来ています

 IF BoolExpression THEN Statement ELSE Statement

THEN の後のステートメントに IF が含まれている場合、ELSE が最初の IF に属しているのか 2 番目の IF に属しているのかをどのように知ることができますか? 詳細については、こちらを参照してください: http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html

唯一の 100% あいまいでない修正方法は、if/else ステートメントの前後にある種の区切り文字を要求することです (ほとんどの言語では、括弧 "{" と "}" が使用されます)。元、

 IF BoolExpression THEN '{' Statement '}' ELSE '{' Statement '}'
于 2013-04-11T13:51:12.303 に答える