2011-04-27 43 views
2

我想要加快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 

为什么我会得到这个语法错误?

回答

3

您的test.y似乎缺少几个test s 继续的情况下的语法。 那么,如何添加像下面这样的语法呢?

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

test : text | number; 

... 
+1

哦,伊势,那很美。当你看到它时,这是非常明显的,但我不认为我会一个人去那里。我不得不做一个小小的mod来编译它。我不得不把'测试'这一行的右边放在一个'|'的行上,在行的开始。 (我尝试将每行加上4个空格作为代码添加,但不能保留换行符。) – 2011-04-27 19:28:12