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

时间:2010-10-23 15:49:27

标签: yacc

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 个答案:

答案 0 :(得分:1)

您的语法证明有效文件只包含一个VARIABLE。要拥有多个,您需要引入recursive rule

%start vars

%%

var: VARIABLE {printf($1);};

vars: var
    | vars var;

%%