Bison 野牛错误报告解释
我收到运行时消息:语法错误,意外变量,应为“:”或“\n” 我想这是因为我的野牛来源不对,但怎么了? 在我的莱克斯资料里我有Bison 野牛错误报告解释,bison,Bison,我收到运行时消息:语法错误,意外变量,应为“:”或“\n” 我想这是因为我的野牛来源不对,但怎么了? 在我的莱克斯资料里我有 'mod' return MOD; [-+()=/*\n:] { return *yytext; } 但是,虽然a=55/4运行正常,但a=55mod4会退出,之前会编写错误报告。 谢谢你的预约。 这是我完整的野牛档案: %{ #include <stdio.h> void yyerror(char *); int
'mod' return MOD;
[-+()=/*\n:] { return *yytext; }
但是,虽然a=55/4运行正常,但a=55mod4会退出,之前会编写错误报告。
谢谢你的预约。
这是我完整的野牛档案:
%{
#include <stdio.h>
void yyerror(char *);
int yylex(void);
#include "y.tab.h"
#include "bas.h"
#define YYDEBUG 1
#define YYERROR_VERBOSE 1
#define YYTOKEN_TABLE 1
%}
%debug
%error-verbose
%token INTEGER VARIABLE PRINT
%left '+' '-'
%left '*' '/'
%left MOD
%%
program:
program statement ':' {
if (stackptr>0)
{
printf("stack underflow !\n");
}
else if (stackptr<0)
{
printf("stack overflow !\n");
}
}
|
program statement '\n' {
if (stackptr>0)
{
printf("stack underflow !\n");
}
else if (stackptr<0)
{
printf("stack overflow !\n");
}
else {
/* send basictoken[] array to micro*/
printf("OK.\n");
debugprint();
}
resetbuffer();
stackptr=0;
}
| /* NULL */
;
statement:
expression
| VARIABLE '=' expression {
put_token(avr_tovar);
put_token($1);
stackptr--;
}
| PRINT expression {
put_token(avr_tos);
stackptr--;
}
;
expression:
INTEGER {
put_token(avr_const);
put_token(yylval);
stackptr++;
}
| VARIABLE {
put_token(avr_fromvar);
put_token(yyval);
stackptr++;
}
| expression '+' expression {
put_token(avr_add);
stackptr--;
}
| expression '-' expression {
put_token(avr_sub);
stackptr--;
}
| expression '*' expression {
put_token(avr_mul);
stackptr--;
}
| expression '/' expression {
put_token(avr_div);
stackptr--;
}
| expression MOD expression {
put_token(avr_mod);
stackptr--;
}
| '(' expression ')'
;
%%
void yyerror(char *s)
{
fprintf(stderr, "%s\n", s);
}
%{
#包括
无效错误(字符*);
int yylex(无效);
#包括“y.tab.h”
#包括“bas.h”
#定义调试1
#定义YYERROR\u详细信息1
#定义表1
%}
%调试
%错误详细
%令牌整数变量打印
%左'+''-'
%左'*''/'
%左模
%%
节目:
程序语句“:”{
如果(堆栈ptr>0)
{
printf(“堆栈下溢!\n”);
}
否则如果(堆栈ptr0)
{
printf(“堆栈下溢!\n”);
}
else if(stackptr我猜您的lex
文件也有如下规则:
[[:digit:]]+ INTEGER
[[:alpha:]][[:alnum:]]* VARIABLE
在这种情况下,MOD4
将作为变量进行词法分析,而不是作为MOD
进行词法分析,因为lex
总是选择最长的匹配
如果您不想在输入中的MOD
后面加空格,那么您必须更聪明地指定变量Flex/lex不支持单引号表示字符串,它为此使用双引号。因此,您的扫描器实际上正在等待您输入a=55'MOD'4
单引号,或使用双引号
另外,不要在解析器的操作中使用yylval
,使用$1
等等。我不知道您的代码是否有效,但如果有效,那纯粹是运气:yylval
是关于前瞻的,它不需要与最后一个缩减符号相同