Bison 野牛上下文优先似乎不起作用

Bison 野牛上下文优先似乎不起作用,bison,lex,text-parsing,Bison,Lex,Text Parsing,我正在尝试编写一个bison解析器,上下文优先级似乎不起作用 我的一个作品(简化并使用c代码)如下: %precedence RANGE_SEPARATOR %precedence BIN_ASSIGNMENT BIN_INCASSIGN BIN_DECASSIGN BIN_TIMESASSIGN BIN_DIVASSIGN BIN_MODASSIGN BIN_BANDASSIGN BIN_BXORASSIGN BIN_BORASSIGN

我正在尝试编写一个bison解析器,上下文优先级似乎不起作用

我的一个作品(简化并使用c代码)如下:

%precedence  RANGE_SEPARATOR
%precedence  BIN_ASSIGNMENT BIN_INCASSIGN BIN_DECASSIGN BIN_TIMESASSIGN 
            BIN_DIVASSIGN BIN_MODASSIGN BIN_BANDASSIGN BIN_BXORASSIGN BIN_BORASSIGN 
            BIN_LLSHIFTASSIGN BIN_LRSHIFTASSIGN BIN_ALSHIFTASSIGN BIN_ARSHIFTASSIGN
%left  BIN_LIMPLICATION BIN_LEQUIVALENCE
%left  CONDITIONAL_OPERATOR
%left  BIN_LOR
%left  BIN_LAND
%left  BIN_BOR
%left  BIN_BXOR BIN_BXNOR
%left  BIN_BAND
%left  BIN_LEQUALS BIN_LNEQUALS BIN_CEQUALS BIN_CNEQUALS BIN_WEQUALS 
    BIN_WNEQUALS
%left  BIN_RLT BIN_RGT BIN_RLE BIN_RGE
%left  BIN_LLSHIFT BIN_LRSHIFT BIN_ALSHIFT BIN_ARSHIFT
%left  BIN_APLUS BIN_AMINUS
%left  BIN_AMULT BIN_ADIV BIN_AMOD
%left  BIN_AEXP
%precedence  UNARY_PLUS UNARY_MINUS UNARY_LNOT UNARY_LRNOT UNARY_LRAND 
            UNARY_LRNAND UNARY_LROR UNARY_LRNOR UNARY_LRXOR UNARY_LRXNOR UNARY_INC 
            UNARY_DEC
%precedence  PARENTHESIS BRACKETS SCOPE DOT
正如您所看到的,一个常量\内部\表达式可以是两个常量\表达式之间的一个操作,我需要将一些表达式优先于其他表达式

我的优先规则如下:

%precedence  RANGE_SEPARATOR
%precedence  BIN_ASSIGNMENT BIN_INCASSIGN BIN_DECASSIGN BIN_TIMESASSIGN 
            BIN_DIVASSIGN BIN_MODASSIGN BIN_BANDASSIGN BIN_BXORASSIGN BIN_BORASSIGN 
            BIN_LLSHIFTASSIGN BIN_LRSHIFTASSIGN BIN_ALSHIFTASSIGN BIN_ARSHIFTASSIGN
%left  BIN_LIMPLICATION BIN_LEQUIVALENCE
%left  CONDITIONAL_OPERATOR
%left  BIN_LOR
%left  BIN_LAND
%left  BIN_BOR
%left  BIN_BXOR BIN_BXNOR
%left  BIN_BAND
%left  BIN_LEQUALS BIN_LNEQUALS BIN_CEQUALS BIN_CNEQUALS BIN_WEQUALS 
    BIN_WNEQUALS
%left  BIN_RLT BIN_RGT BIN_RLE BIN_RGE
%left  BIN_LLSHIFT BIN_LRSHIFT BIN_ALSHIFT BIN_ARSHIFT
%left  BIN_APLUS BIN_AMINUS
%left  BIN_AMULT BIN_ADIV BIN_AMOD
%left  BIN_AEXP
%precedence  UNARY_PLUS UNARY_MINUS UNARY_LNOT UNARY_LRNOT UNARY_LRAND 
            UNARY_LRNAND UNARY_LROR UNARY_LRNOR UNARY_LRXOR UNARY_LRXNOR UNARY_INC 
            UNARY_DEC
%precedence  PARENTHESIS BRACKETS SCOPE DOT
当我尝试解析一个表达式时,例如使用GLR算法解析2+3*5,我会得到一个歧义错误,因为GLR解析器会创建两个分支,而其中的一个分支会消失。注意,我并不是说应该用%dprec丢弃一个分支,重点是应该只创建一个分支

另一方面,如果我将优先上下文标记替换为实际标记,例如,我将BIN_APLUS替换为t_PLUS,将BIN_AMULT替换为t_ASTERISK,那么解析器可以正常工作,并且可以正确构建一个可能不明确的表达式,如2+3*5。然而,由于我的标记可以根据上下文具有不同的含义和优先级,我真的需要避免这种方法。。。这让我相信我的规则很好

有没有人遇到过类似的情况

编辑: 正如rici指出的,这个问题已经在这个问题上提出:


抱歉,在发布我的之前我没有找到它

您没有为任何运算符标记定义优先级,因此不存在优先级关系。请阅读,我认为这是一个重复的问题evrn,尽管您使用的是不同的yacc-导数。谢谢@rici,我确实认为这就是我想要的,但是,如果优先级始终在生产和终端之间,请想象我在堆栈中有以下内容:exp t_加exp,并且t_星号正在等待移入。我想告诉解析器优先于t_星号的移位,因为它是一个乘法,但是我不能以上下文的方式将t_星号优先于t_加号,因为t_星号必须为标记本身定义一个优先级,该优先级应该是什么?星号可能意味着不同的东西,这取决于它的上下文…优先机制有一些限制。例如,有些运算符优先文法的优先关系是不可传递的,因此不能简化为数值比较。这些案例在实践中是罕见的。但我不认为这是你的问题。一个显示两种上下文的完整(尽管减少了)示例会有所帮助。