Flex和Bison中的逻辑表达式语法

时间:2016-05-02 14:18:40

标签: c++ parsing bison flex-lexer

我正在为flex和bison中的逻辑表达式编写一个简单的语法。 表达式是后缀表达式。这是我的yacc代码。

float_logic_expr:
                float_logic_expr
                | float_logic_exprs
                ;

float_logic_exprs:
                float_reln_expr
            | float_reln_expr float_reln_expr PP_AND                    
            | float_reln_expr float_reln_expr PP_OR                 
            ;

string_logic_expr:
              string_reln_expr
            | string_reln_expr string_reln_expr PP_AND              
            | string_reln_expr string_reln_expr PP_OR               
            ;

以上规则适用于以下声明。

if #a 40 >  #b 20 == && then

但是如果我给逻辑表达式多一个条件,它就会失败。

if #a 40 >  #b 20 == && #b 30 == && then

解析错误。

我应该将语法更改为多个关系表达式?

1 个答案:

答案 0 :(得分:0)

它做了你告诉它做的事,不是吗?

float_logic_exprs
            : float_reln_expr
            | float_reln_expr float_reln_expr PP_AND                    
            | float_reln_expr float_reln_expr PP_OR                 
            ;

这表示逻辑表达式是单个关系表达式或两个(确切)关系表达式,后跟ANDOR标记。但是您提供的示例表明您希望逻辑表达式能够将另一个逻辑表达式作为参数,而不仅仅是关系表达式。

此外,这是毫无意义的:

float_logic_expr:
                float_logic_expr
                | float_logic_exprs
                ;

由于生产float_logic_expr: float_logic_expr不可能有用(并且必须触发某种野牛警告)。

所有这些都应该表明你想要:

float_logic_expr
            : float_reln_expr
            | float_logic_expr float_logic_expr PP_AND                    
            | float_logic_expr float_logic_expr PP_OR                 
            ;