Compilation 对YACC语法有问题
我编写的代码似乎无法检测函数。我尝试了许多编辑,但似乎没有任何效果Compilation 对YACC语法有问题,compilation,grammar,bison,yacc,Compilation,Grammar,Bison,Yacc,我编写的代码似乎无法检测函数。我尝试了许多编辑,但似乎没有任何效果 program : function-decl | decl | function-def ; decl : kind var-list SEMICOLON { tok_type = "variable"; } ; kind : KW_INT {integer = true; floatType = false;} | K
program : function-decl | decl | function-def
;
decl : kind var-list SEMICOLON
{
tok_type = "variable";
}
;
kind : KW_INT {integer = true; floatType = false;}
| KW_FLOAT {integer = false; floatType = true;}
;
var-list : ID varmany
{
tok_type = "variable";
t.check_token (tok_type, $1, line_no, bodyCheck, parameter);
}
;
varmany : /*empty*/ | varmany COMMA ID
{
tok_type = "variable";
t.check_token (tok_type, $3, line_no, bodyCheck, parameter );
}
;
function-decl : kind ID LPAR kind RPAR SEMICOLON
{
current_func = $2;
declaration = true;
parameter= false;
tok_type= "function";
t.check_token (tok_type, current_func, line_no, bodyCheck, parameter );
current_func ="";
}
;
function-def : kind ID LPAR kind ID RPAR body
{
current_func = $2;
paramName = $5;
declaration = false;
parameter= false;
tok_type= "function";
t.check_token (tok_type, current_func, line_no, bodyCheck, parameter );
tok_type = "variable";
parameter=true;
t.check_token(tok_type, paramName, line_no, bodyCheck, parameter);
current_func ="";
}
;
例如,对于文本输入:
int main (int DUMMY) {
int x,y,z;
float p;
int main (int x){x = y;}
p = -z * (x/345+y*1.0) + - 300;
p = -z * (x/345+y*1.0) + -300;
while (p>=-(x+y)*3.45/6-z)
z = z + 3;
}
我收到以下错误消息:
第3行中声明的局部int变量y。第3行中声明的局部int变量z。
第3行中声明的局部int变量x。
第5行中声明的局部浮点变量p。
第6行声明了局部int变量main。
第6行出现语法错误,匹配:(
第6行中声明的局部int变量x。
第6行出现语法错误,匹配:)
你的
函数decl
规则只坚持一个参数,不允许其名称。我得到的野牛(Mac上的v2.3)不会接受规则名称中的破折号,如函数decl
;它们必须替换为下划线。您使用的是哪个版本?这真的是你的代码吗?它不是MCVE(),因为您尚未定义body
的规则,并且没有提供任何支持函数。你能解决这些问题吗?它不必提供表达式支持——事实上,MCVE不应该这样做。问题是否与函数decl
和函数def
之间的长公共前缀有关?您是否已在启用调试的情况下编译(-DYYDEBUG
,或类似情况下进行了双重检查)?您是否仔细查看了-v
(y.output
或类似文件名)的输出?您是否检查过词法分析器是否返回了正确的标记?示例代码是说明问题的最小代码吗?@Johnathan:这是一个相当古老的bison版本(我相信是2005年)。也许你应该考虑安装一个更现代化的版本。我认为符号中的破折号是在2009年左右添加的。当前的bison手册中说:“符号名称可以包含字母、下划线、句点、非首字母数字和破折号。符号名称中的破折号是GNU扩展,与POSIX Yacc不兼容。句点和破折号使符号名称与命名引用一起使用不太方便,需要在这些名称周围加括号…”