私はlemonを使って、javascriptのような言語のための簡単なパーサを書こうとしています。私は競合エラーを解決することができませんし、それは解決できない問題であると思われます。最初は、代入文を含む文ブロックであり、第二は、オブジェクトを定義する式ステートメントであるレモンパーサーの競合を取得する
{x = 10;}
と
{x:10};
:
競合がための文法の間です。
両方を解析する文法が矛盾します。次のように最小限のコードは次のとおりです。
State 4:
(3) rStmtList ::= LCURLY *
rObj ::= LCURLY * rObjItemList RCURLY
rObjItemList ::= * rObjItemList COMMA rObjItem
rObjItemList ::= * rObjItem
rObjItem ::= * ID COLON rExpr
ID shift 8
ID reduce 3 ** Parsing conflict **
rObjItemList shift 6
rObjItem shift-reduce 8 rObjItemList ::= rObjItem
{default} reduce 3 rStmtList ::= LCURLY
私はこれを解決する方法上の任意の提案を感謝して受け入れられる:
rMod ::= rStmt.
rStmt ::= rStmtList RCURLY. {leaveScope();}
rStmtList ::= rStmtList rStmt.
rStmtList ::= LCURLY. {enterScope();}
rStmt ::= rExpr SEMI.
rExpr ::= rObj.
rObj ::= LCURLY rObjItemList RCURLY.
rObjItemList ::= rObjItemList COMMA rObjItem.
rObjItemList ::= rObjItem.
rObjItem ::= ID COLON rExpr.
rExpr ::= ID.
rExpr ::= NUM.
アウトファイルには、以下を示しています。ありがとう。
素晴らしいありがとう。私はおそらく第3の選択肢に行くでしょう。 ASTのポストパーズトラバーサル。 –
あなたはどのバージョンのレモンを使っていますか?私のレモンは '|'のルールをサポートしていません – kravemir
@kravemir:まあ、ありがとう。それを私が直した。以前のものはバイソン形式から不完全に変換されていました。 – rici