2

私の文法には次の規則があります。

block:                  TLBRACE statements TRBRACE
                        | TLBRACE TRBRACE
                        ;


statements:             statement 
                        | statements statement 
                        ;

statement:              TIF TLPAREN expression TRPAREN TTHEN statement
                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement
                        | TWHILE TLPAREN expression TRPAREN statement 
                        | TDO statement TLPAREN expression TRPAREN 
                        | TFOR TLPAREN forinits TSEMICOLON expression TSEMICOLON expressions TRPAREN statement 
                        | block 
                        | declaration TSEMICOLON
                        | expression TSEMICOLON
                        ;

私はダングリングelseの問題を認識しています。そのため、文法ファイルの先頭に「%left TELSE」を指定しました。とにかく、Bison に TELSE トークンを優先するように指示しても、shift/reduce 競合が発生します。「%left TELSE」コマンドも削除しようとしましたが (違いがあるかどうかを確認するためだけに)、何も変わりません。私は常に同じシフト/削減の競合を抱えています。

--verbose フラグを Bison に指定した場合の出力は次のとおりです。

State 117

   32 statement: "if" "(" expression ")" "then" statement .  ["identifier", "string value", "double", "int", "lint", "message", "string", "double value", "int value", "(", "{", "}", "-", "do", "else", "for", "if", "while", "binary not"]
   33          | "if" "(" expression ")" "then" statement . "else" statement

    "else"  shift and going to state 122

    "else"    [reducing with rule 32 (statement)]
    $default  reducing with rule 32 (statement) 
4

3 に答える 3

1

を使用してこの問題を解決する最善の方法%nonassoc

%nonassoc THEN

%nonassoc ELSE

%%


statement:              TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN

                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement


%%

ここで、パーサーはトークンをスタックにプッシュします。IF式がプッシュされ、次のトークンがELSEである場合、競合が発生します。

if_statementパーサーはルールに従って IF 式を削減するか、次のELSEトークンをスタックにシフトする必要があります。ルールの優先度を決定する必要があります。この場合、トークンにandを使用するELSEよりも優先度を高くする必要があります。の優先度は よりも大きく、 の優先度を使用することでは よりも小さくなり、競合は解決されます。if_statement%nonassoc%prec%nonassocELSETHEN%precif_statmentif_else_statment

于 2017-12-28T08:23:19.173 に答える