Возникла проблема с грамматикой YACC - PullRequest
0 голосов
/ 30 апреля 2018

Код, который я написал, кажется, не в состоянии обнаружить функцию. Я перепробовал много правок, но, похоже, ничего не работает.

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;
}

Я получаю эти сообщения об ошибках:

Локальная переменная int, объявленная в строке 3.
Локальная переменная int, объявленная в строке 3.
Локальная переменная int, объявленная в строке 3.
Локальная переменная с плавающей точкой p объявлена ​​в строке 5.
Локальная переменная int main объявлена ​​в строке 6.
синтаксическая ошибка в строке 6, соответствует: (
Локальная переменная int, объявленная в строке 6.
синтаксическая ошибка в строке 6, соответствует:)

1 Ответ

0 голосов
/ 01 мая 2018

Ваше правило function_decl настаивает только на одном параметре и не допускает его имя.

...