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...*/ }
;