簡體   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