遇到YACC语法问题

时间:2018-04-30 18:31:54

标签: 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;} 
     | 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行的语法错误,匹配:)

1 个答案:

答案 0 :(得分:0)

您的function_decl规则只保留一个参数,但不允许使用其名称。