繁体   English   中英

Bison/Flex 解析问题

[英]Bison/Flex parsing issue

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

我无法确定问题的根源。 我没有使用 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");};

   %%

这是我的弹性语法:

    {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返回。 此外,这是未定义的行为,因为您没有指定yylex应该return的值。 (使用-Wall编译可能会遇到这个问题。)

所以当扫描器读取一个空格时,它会返回一些未指定的值给调用者( yyparse )。 自然,这不会按预期工作。

改变(例如)

[ ]             {return;}

[ ]             ;

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

[[:space:]]+    ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM