Flex和bison中的逻辑表达语法

Logical expression Grammar in Flex and bison

本文关键字:语法 bison Flex      更新时间:2023-10-16

我正在为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

分析错误。

我应该如何更改语法以适用于多个关系表达式?

它在做你让它做的事情,不是吗?

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                 
            ;