Parsing 如何使用0或1+;没有S/R冲突的代币?
如果我定义了像普通对象访问这样的令牌:Parsing 如何使用0或1+;没有S/R冲突的代币?,parsing,compiler-construction,bison,yacc,lex,Parsing,Compiler Construction,Bison,Yacc,Lex,如果我定义了像普通对象访问这样的令牌: [$\u a-zA-Z]+[.]{返回访问;} [$\u a-zA-Z]+{return ID;} [+]{返回冥王星;} 野牛语法规则: 访问 :访问访问{/*执行操作…*/} |访问{/*做点什么…*/} 表情 :访问ID加上访问ID{/*做点什么…*/} 我想在源代码中允许这样的内容: moduleA.valueB.valueC+value 在本例中,如果我没有将空规则放入访问,那么像值这样的单个ID变量是非法的。但是如果我将空规则放入,访问将
[$\u a-zA-Z]+[.]{返回访问;}
[$\u a-zA-Z]+{return ID;}
[+]{返回冥王星;}
野牛语法规则:
访问
:访问访问{/*执行操作…*/}
|访问{/*做点什么…*/}
表情
:访问ID加上访问ID{/*做点什么…*/}
我想在源代码中允许这样的内容:
moduleA.valueB.valueC+value
在本例中,如果我没有将空规则放入访问
,那么像值
这样的单个ID
变量是非法的。但是如果我将空规则放入,访问
将导致严重的S/R冲突,匹配的文本将变得奇怪
而且,我不认为在表达式中复制规则是个好主意,例如:
表达式
:访问ID加上访问ID{/*做点什么…*/}
|ID PLUS访问ID{/*做点什么…*/}
|访问ID加ID{/*做点什么…*/}
|ID加ID{/*做点什么…*/}
我能找到其他方法来解决这个问题吗
编辑:谢谢你的回答,我注意到这个简单的语法没有冲突。至少您让我知道,真正的问题可能隐藏在其他地方(对于一个编译器新手来说,这真是一团糟!) 您可以这样做:
法律:
野牛:
Expression : Value PLUS Value;
Value : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList : AccessElement|AccessList AccessElement;
在您的示例中仅使用epsilon生成并没有错:
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
;
Accesses
: Accesses ACCESS { /*do something...*/ }
| { /*do something...*/ }
;
没有冲突…如果将访问规则更改为允许epsilon,则表达式规则中没有shift-reduce冲突,因此您遇到的问题一定在别处。。。
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
;
Accesses
: Accesses ACCESS { /*do something...*/ }
| { /*do something...*/ }
;