在Bison声明结构中的OR条件

时间:2012-12-04 10:27:44

标签: bison flex-lexer

我有以下Bison文件 -

%union
{
    int integer_value;
    double double_value;
    char* string_value;
}

%token <integer_value> INTEGER
%token <string_value> VAR
%token <string_value> INTEGER_DECLARATION
%token <double_value> DOUBLE
%token <string_value> DOUBLE_DECLARATION


%%

program:
        program statement '\n'
        |
        ;

statement:
        | INTEGER_DECLARATION VAR '=' INTEGER {//implementation} 

        | INTEGER_DECLARATION VAR '='  DOUBLE {//implementation as above}                            

%%

由于INTEGER_DECLARATION VAR '=' INTEGERINTEGER_DECLARATION VAR '=' DOUBLE中的实现相同,是否可以在语句结构中使OR条件为bw INTEGERDOUBLE

我尝试INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE但提示warning: rule useless in parser due to conflicts: statement: DOUBLE,实际上忽略了对DOUBLE的引用。

1 个答案:

答案 0 :(得分:1)

您发布的主要代码段尽可能简明扼要。 statement: INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE试图说statement只能包含DOUBLE

你可以这样写:

program:
      program statement '\n'
    |
    ;

statement:
      decl_part INTEGER {//implementation uses info in $1} 
    | decl_part DOUBLE {//implementation as above}                            
    ;

decl_part:
      INTEGER_DECLARATION VAR '=' {//partial implementation passes some info via $$}
    ;

但这是否会改善你已经拥有的东西是值得商榷的。

或者你可以写:

program:
      program statement '\n'
    |
    ;

statement:
      INTEGER_DECLARATION VAR '=' number
    ;

number:
      INTEGER
    | DOUBLE
    ;

当您稍后想要扩展语言(例如,支持十六进制常量)时,此技术具有优势。

另一个注意事项:我认为你不想在statement的作品中使用第一个替换符号。你拥有它的方式,programstatement都可以是epsilon(空),我相信这会导致解析器冲突。