如果我像普通对象访问一样定义令牌:
[$_a-zA-Z]+[.] { return ACCESS; }
[$_a-zA-Z]+ { return ID; }
[+] { return PLUIS; }
野牛语法规则:
Accesses
: Accesses ACCESS { /*do something...*/ }
| ACCESS { /*do something...*/ }
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
我想在源代码中允许此类内容:
moduleA.valueB.valueC + valueD
在示例中,如果我不将空规则放在Accesses
中,则像valueD
这样的单个ID
变量是非法的。但是如果我把空规则放进去,Accesses
会引起严重的 S/R 冲突,它匹配的文本会变得奇怪。
而且,我认为复制Expression
中的规则不是一个好主意,例如:
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
| ID PLUS Accesses ID { /*do something...*/ }
| Accesses ID PLUS ID { /*do something...*/ }
| ID PLUS ID { /*do something...*/ }
我可以找到其他方法来解决这个问题吗?
编辑:好的,感谢您的回答注意到我这个简单的语法没有冲突。至少你让我知道真正的问题可能隐藏在其他地方(对于编译器新手来说真是一团糟!
你可以这样做:莱 克 斯:
[$_a-zA-Z]+ {return WORD;}
"." {return DOT;}
"+" {return PLUS;}
野牛:
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...*/ }
;
没有冲突。