0

私は LiveScript 言語のパーサーに取り組んでおり、両方のオブジェクト プロパティ定義フォームを一緒に解析するのに問題がありkey: valueます(+|-)key。例えば:

prop: "val"
+boolProp
-boolProp
prop2: val2

私はkey: valueこれで動作するフォームを持っています:

Expression ::= TestExpression
    | ParenExpression
    | OpExpression
    | ObjDefExpression
    | PropDefExpression
    | LiteralExpression
    | ReferenceExpression

PropDefExpression ::= Expression COLON Expression

ObjDefExpression ::= PropDefExpression (NEWLINE PropDefExpression)*

// ... other expressions

しかし、 orに追加しよ("+"|"-") IDENTIFIERうとすると、左再帰の使用に関するエラーが発生します。これを行う(正しい)方法は何ですか?PropDefExpressionObjDefExpression

4

2 に答える 2

0

あなたが投稿した文法フラグメントはすでに左再帰的です。つまり、(+|-)boolprop を追加しなくても、非終端の「式」は、「式」が左端の記号として再表示される形式を導出します。

Expression -> PropDefExpression -> Expression COLON Expression

そして、それは単に左再帰的であるだけでなく、あいまいです。例えば

Expression COLON Expression COLON Expression

は、2 つの異なる方法で導出できます (大まかに言うと、左結合と右結合)。

コロンの左側でより制限されたものを使用することで、これらの問題を両方とも解消できます。

PropDefExpression ::= Identifier COLON Expression

また、別のあいまいさ: Expression は、直接および ObjDefExpression を介して、2 つの異なる方法で PropDefExpression を派生させます。私の推測では、直接派生を削除できます。

これらのことを処理したら、エラーなしで (+|-)boolprop を追加できるはずです (表示されていない他の種類の式のいずれかと競合しない限り)。

http://livescript.netの例を見ると、従来の文法でどれだけのことを把握できるか疑問です。ただし、サブセットのみを使用する場合は、問題ない可能性があります。

于 2015-03-02T23:57:01.783 に答える