2011-04-27 52 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