我是第一次接触SableCC和语法定义。我有以下语法(其中的一部分):
query =
{atop} attroperator |
{query_par} l_par query r_par |
{query_and} [q1]:query logic_and [q2]:query |
{query_or} [q1]:query logic_or [q2]:query |
{query_not} logic_not query ;我有以下错误:
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TRPar in {
[ PQuery = PQuery * TRPar ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TRPar (reduce)
}
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TLogicAnd in {
[ PQuery = PQuery * TLogicAnd PQuery ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TLogicAnd (reduce)
}
shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on
TLogicOr in {
[ PQuery = PQuery * TLogicOr PQuery ] (shift),
[ PQuery = TLogicNot PQuery * ] followed by TLogicOr (reduce)
}我通过将l_par和r_par添加到所有替代方案中解决了这些问题,顺便说一句,这应该会增加可读性,但是有没有一种方法可以以一种优雅的方式做到这一点呢?
谢谢。
发布于 2010-07-27 02:14:20
所以,我已经解决了这个问题。我所做的基本上是定义了三个级别的关联性。
query =
{query_or} query logic_or term |
{query_term} term ;
term =
{term_and} term logic_and factor |
{term_factor} factor ;
factor =
{atop} attroperator |
{query_not} logic_not attroperator |
{query_par} l_par query r_par ;它是经典的结合性方案+,*,带有一元运算符,如- where + = logic_or,* = logic_and,- = logic_not。
https://stackoverflow.com/questions/3190100
复制相似问题