我正在尝试使用柠檬编写一个简单的解析器,用于类似 javascript 的语言。我无法解决冲突错误,我怀疑这是一个无法解决的问题。
冲突发生在以下语法之间:
{x = 10;}
和
{x:10};
第一个是包含赋值语句的语句块,第二个是定义对象的表达式语句。
解析它们的语法会导致冲突。最小代码如下:
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.
输出文件显示以下内容:
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
任何有关我如何解决此问题的建议将不胜感激。谢谢。