0

この質問に基づいて、このBisonコードのシフト/削減の競合はどこから来ていますか? 次のような構文の文法を作成しようとしています。

-10 + 3 - 2または+4 - 2 + 1。最初の整数には明らかに符号があります。

これは私がすでに持っているものです:

%token INT
...
Term: INT;
TermOps: "+" | "-";
SignedTerm: TermOps Term | Term;
reminder: /* EPS */ | TermOps TermList;
TermList: SignedTerm reminder;

あいまいさを生み出すため、 のルールSignedTermが明らかに間違っていることはわかっていますが、どうすればそれを解決できますか?

4

1 に答える 1

1

Bison は LALR パーサーを生成するため、文法を LL アルゴリズムで解析可能なバージョンにワープする必要はありません。

文法は単に言語の構造を反映する必要があります。この単純なケースでは、言語は用語が整数であり、場合によってはその前に符号が付くことを指定し、式は左から右にグループ化されます。(これは私の推測ですが、通常の慣例です。)

それは簡単に書くことができます:

term: INT
    | '+' term
    | '-' term

expr: term
    | expr '+' term
    | expr '-' term

これらの定義は、説明から直接得られます。

于 2015-12-08T15:46:05.823 に答える