Bison/Flex 解析问题

Bison/Flex parsing issue

我正在使用 bison 和 flex,目前遇到了一些问题。当前第一个字符被读取并传递给 Bison,但立即抛出 yyerror()。它应该打印 1,因为 'w' 是我的 Flex 规则定义的 Ident。

我无法确定问题的根源。我没有使用 Bison 的经验。

这是我的 bison 解析规则:

    %%

   Prog : StmtSeq               {printf("13");};
   StmtSeq : Stmt StmtSeq           {printf("12");};
   StmtSeq :                        {printf("11");}; 
   Stmt : Id ':' Expr       {printf("10");}; 
   Expr : Expr '+' Term     {printf("9");}; 
   Expr : Term                  {printf("8");}; 
   Term : Term '*' Factor   {printf("7");};
   Term : Factor                {printf("6");};
   Factor   : '(' Expr ')'          {printf("5");}; 
   Factor   : '{' Expr '}'          {printf("4");}; 
   Factor   : Id                    {printf("3");}; 
   Factor   : SetLit                {printf("2");};
   Id       : Ident                 {printf("1");};

   %%

这是我的 flex 语法:

    {letter} {return Ident;}
    (\{\})|(\{{letter}(\,{letter})*\}) {return SetLit;} 
    \( {return '(';}
    \) {return ')';}
    \* {return '*';}
    \+ {return '+';}
    \{ {return '{';}
    \} {return '}';}
    \: {return ':';}
    [ ]             {return;}
    \t              {return;}
    \r              {return;}
    \n              {return;}
    . {writeIndicator(getCurrentColumnNum()); writeMessage("Illegal Character in lex"); }

输入是一个 .txt 文件,其中包含:

  w: {f,x,a,b,c,d,e}
  x: {f,a,b,c,d,e}
  y: {}
  z: {x}
  a: {f,x,a,b,c,d,e}
  b: {}  

如果您希望 lex 忽略一个记号,那么匹配该记号的模式应该什么也不做。 return 什么都不做;它导致 yylex 到 return。此外,这是未定义的行为,因为您没有指定 yylex 应该 return 的值。 (用 -Wall 编译可能会发现这个问题。)

因此,当扫描器读取 space 时,它 return 向调用者提供了一些未指定的值 (yyparse)。当然,这并没有像预期的那样工作。

改变(例如)

[ ]             {return;}

[ ]             ;

或者,更好的是,将冗余规则序列替换为

[[:space:]]+    ;