プログラミング言語のパーサーを生成するために GPPG (基本的に C# の bison) を使用しています。本当に厄介な部分を除いて、すべてが順調に進んでいます。私たちが解析している言語には、一種の「暗黙の比較」規則があり、「式式」は「式 == 式」として解釈されます。
たとえば、これは完全に有効なステートメントです。
If SomeValue False Then
EndIf
これにより、パーサーの生成中にあらゆる種類の競合が明らかに発生します。それらを解決するための私の最初の試みは、これらの線に沿ったものでした(簡潔にするために編集しました)。ルールのリファクタリングを試みたところ、もはやあいまいではないように見えますが、明らかな何かが欠けているに違いありません。
これは、私が抱えている競合を示す非常に小さな文法であり、それを解決しようとした方法はうまくいきません
%start program
%token <Token> Plus
%token <Token> Times
%token <Constant> Constant
%left Plus
%left Times
%left IMPLICIT_COMPARISON
%%
program: expression;
expressionBase: Constant
| expression Plus expression
| expression Times expression;
expression: expressionBase
| expression expressionBase %prec IMPLICIT_COMPARISON;
%%
どんな助けでも大歓迎です