处理完一个令牌后,Bison中的语法错误

时间:2011-04-27 15:47:20

标签: syntax-error bison token

我正在努力加快Flex和Bison的速度。我可以用一个非常简单的“语言”解析一个令牌,但是在第二个令牌失败时,即使令牌是合法的。

test.l:

%{
#include <stdio.h>
#include "test.hpp"
%}

%%
[0-9]+ {printf("Number entered\n"); return INTEGER_NUMBER;}
[a-zA-Z]+ {printf("plain text entered: '%s'\n",yytext); return PLAIN_TEXT;}
[ \t]   ;
.       ;
%%

test.y

%{
#include <stdio.h>

extern "C" {
  int yyparse(void);
  int yylex(void);
  int yywrap() { return 1; }
  extern int yylineno;
  extern char* yytext;
  extern int yylval;
}

/* #define YYSTYPE char * */

void yyerror(const char *message)
{
  fprintf(stderr, "%d: error: '%s' at '%s', yylval=%u\n", yylineno, message, yytext, yylval);
}

main()
{
  yyparse();
}

%}

%token PLAIN_TEXT INTEGER_NUMBER

%%
test : text | number;

text : PLAIN_TEXT
        {
          /*printf("plain text\n");*/
        };

number : INTEGER_NUMBER
        {
          /*printf("number\n");*/
        };

%%

结果:

$ ./test
cat
plain text entered: 'cat'

dog
plain text entered: 'dog'
1: error: 'syntax error' at 'dog', yylval=0

$ ./test
34
Number entered

34
Number entered
1: error: 'syntax error' at '34', yylval=0

为什么我会收到此语法错误?

1 个答案:

答案 0 :(得分:3)

你的test.y似乎缺少多个test的案例的语法 继续。 那么,如何添加语法如下?

%%
tests : test | tests test; /* added */

test : text | number;

...