这是我的thermo.l文件
%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+ return NUMBER;
heat return TOKHEAT;
on|off return STATE;
target return TOKTARGET;
temperature return TOKTEMPERATURE;
\n /* ignore end of line */;
[ \t]+ /* ignore whitespace */;
%%
这是我的thermo.y文件
%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"error: %s\n",str);
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
}
%}
%token NUMBER TOKHEAT STATE TOKTARGET TOKTEMPERATURE
这是y.tab.h文件
commands: /* empty */
| commands command
;
command:
heat_switch
|
target_set
;
heat_switch:
TOKHEAT STATE
{
printf("\tHeat turned on or off\n");
}
;
target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tTemperature set\n");
}
;
我试图编译我的THERMO.Y文件,但它给了我一个错误。 “错误:语法错误,文件意外结束” *请注意我正在使用野牛。
flex thermo.l
bison -y -d thermo.y
gcc -g -c lex.yy.c y.tab.c
gcc -g -0 thermo.n lex.yy.o y.tab.0 -ll
有人可以帮我吗?
答案 0 :(得分:2)
您的语法应该是.y
文件的 part ,如bison
manual中的示例所示:
%{
Prologue
%}
Bison declarations
%%
Grammar rules
%%
Epilogue
需要第一个%%
和至少一个语法规则;如果你没有它们,你将会收到意外的EOF错误。
恕我直言,你不应该使用-y
标志,但如果你这样做,你会发现bison
会覆盖你的y.tab.h
文件。