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不兼容。句点和破折号使符号名称与命名引用一起使用不太方便,需要在这些名称周围加括号…”