代码之家  ›  专栏  ›  技术社区  ›  evgeniy44

为什么在示例程序中调用函数yyerror()

  •  1
  • evgeniy44  · 技术社区  · 14 年前
    curs.l :
    %{
    #include <stdlib.h>
    #include "tree.c"
    #include "yycurs.h"
    %}
    
    L [a-zA-Z_]
    
    D [0-9]
    
    D4 [0-3]
    
    IDENTIFIER ({L})({L}|{D})*
    
    INT4 {D4}+'q'
    
    INT {D}+
    
    %%
    
    {IDENTIFIER} {return VARIABLE;}
    
    %%
    
    int yywrap(void){
       return 0;
    }
    
    
    
    curs.y:
    %{
    #include stdio.h
    
    
    void yyerror(char*);
    int yylex(void);
    %}
    
    %token VARIABLE INTEGER
    
    %%
    
    var: VARIABLE {printf($1);};
    
    %%
    
    void yyerror(char *s){
       fprintf(stderr, "11\n");
       fprintf(stderr, "%s\n", s);
    }
    
    int main(void){
       yyparse();
       return 0;
    }
    

    当我运行我编译的程序时,我得到了这样的结果:

    ./curs 
    
    ff  //I introduced
    
       //result
    
    ff //I introduced
    
    11 //result
    
    syntax error //result
    
    evgeniy@evgeniy-desktop:~/documents/compilers$ 
    

    谁能解释一下为什么会出现“语法错误”? 提前谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Rudi    14 年前

    你的语法不允许一个有效文件只包含一个变量。要想拥有更多,你需要引入一个 recursive rule .

    %start vars
    
    %%
    
    var: VARIABLE {printf($1);};
    
    vars: var
        | vars var;
    
    %%