javascript に似た言語用に、lemon を使用して単純なパーサーを作成しようとしています。競合エラーを解決できません。解決できない問題だと思います。
競合は、次の文法の間にあります。
{x = 10;}
と
{x:10};
1 つ目は代入ステートメントを含むステートメント ブロックで、2 つ目はオブジェクトを定義する式ステートメントです。
それらの両方を解析する文法は、競合を引き起こします。最小限のコードは次のとおりです。
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.
out ファイルには次のように表示されます。
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
これを解決する方法についての提案は、ありがたく受け入れられます。ありがとう。