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