gpt4 book ai didi

Bison错误报告解读

转载 作者:行者123 更新时间:2023-12-01 15:29:12 25 4
gpt4 key购买 nike

我收到运行时消息:语法错误,意外的变量,需要 ':' 或 '\n'我想这是因为我错误的 Bison 来源,但这是怎么回事?在我的 lex 源代码中我有

'mod'       return MOD;
[-+()=/*\n:] { return *yytext; }

但是当 a=55/4 运行良好时,a=55mod4 退出并在之前写入错误报告。感谢您的预约。这是我的完整 Bison 文件:

%{
#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);
}

最佳答案

Flex/lex 不支持单引号来表示字符串,为此它使用双引号。所以你的扫描仪实际上是在等待你输入a=55'mod'4。要么删除单引号,要么使用双引号。

此外,不要在解析器的操作中使用 yylval,请使用 $1 等等。我不知道您的代码是否有效,但如果有效,那纯属运气:yylval 与前瞻有关,它不需要与最后一个简化符号相同。

关于Bison错误报告解读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com