0

プログラミング言語のパーサーを生成するために 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;

%%

どんな助けでも大歓迎です

4

1 に答える 1

1

これはどう:

program: expression;

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase;

expression: expressionBase 
    | expressionBase expression;

expressionBase低レベルの概念 ( など) と高レベルの概念 ( など)を混在させずに、文法を下から上に構築する必要がありますexpression。高レベルのものは低レベルのもので構築されます。逆に必要な場合は、以下のように、大まかな概念を括弧などで明確に区切る必要があります。

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase
    | LeftParen expression RightParen;

実際のルールはかなり複雑ですが、これで始めることができます。

于 2011-05-31T05:46:41.137 に答える