Обнаружение синтаксических ошибок в зубрах с производством ошибок и макросом YYERROR_VERBOSE - PullRequest
0 голосов
/ 11 января 2020

Я сделал java - фитон-транспортер, используя инструменты flex и bison. Правила бизонов относятся к ограничению Java грамматики. Я создал дерево абстрактного синтаксиса в качестве промежуточного представления для управления анализом semanti c и перевода источника java в pyhton. Все работает, но я хотел бы получить разъяснения по поводу обнаружения синтаксических ошибок, генерируемых Bison. Я использовал макрос YYERROR_VERBOSE и добавил вывод ошибок для обнаружения синтаксических ошибок в фигурных скобках и точках с запятой (используя соответствующие действия semanti c yyclearin и yyerrok). Это полный синтаксический анализатор: parser.y Это простой пример источника java:

public class ball{

   int b = 7;
   int a = 22;

   int operazione (){

      int f = 4;
      int g;

   }
}

Если я сделаю синтаксическую ошибку в точках с запятой и фигурных скобках, ошибка будет правильно определен следующим образом:

public class ball{

   int b = 7;
   int a = 22 //error here

   int operazione (){

      int f = 4 //error here
      int g;

   }
}

 Console: 
 >>Error: syntax error, unexpected INT, expecting SEMICOLON or COMMA alla linea 6
 >>Error: syntax error, unexpected INT, expecting SEMICOLON or COMMA alla linea 9

В то время как для других ошибок, например для круглых скобок, с использованием простого макроса YYERROR_VERBOSE, они обнаруживаются следующим образом:

public class ball{

   int b = 7;
   int a = 22 

   int operazione ){ //error here

      int f = 4 
      int g;

   }
}

 Console:
  >>Error: syntax error, unexpected RRBRACKET, expecting SEMICOLON or COMMA alla linea 6
  >>Error: syntax error, unexpected RRBRACKET alla linea 6
  >>Error: syntax error, unexpected LBRACE, expecting $end alla linea 6

Правильно ли Bison обнаруживает эти ошибки с YYERROR_VERBOSE? Или есть какие-то меры предосторожности, которые можно предпринять, чтобы улучшить их обнаружение? (Избегайте вставки дальнейших ошибок)

РЕДАКТИРОВАТЬ:

Я загрузил новый синтаксический анализатор Parser.y и в отличие от предыдущего я управлял токеном NEWLINE (\ n) (прежде чем он был проигнорирован лексером). Я изменил различные производства, добавив в конце их производство NewlinePlus (рекурсия токенов NEWLINE).

Это пример:

 public class Stampa{ 

  int c  //error line 5

   int operazione (){ 

       int i [] = 5,54; //error line 7

       it b = 0; // error line 9

       for(i = 0; i < 5; i = i+ 1){

          System.println(i); //error line 13

          b = (i *3) + 1;
       }

       if( b > 8 ){ 

          int f = b 2; //error line 21

          System.out.println (f); 

       } else {

          float v = b  3; //error line 27

          System.out.println (v) ;

       } 

   return b // error  line 35
   }

}

public class Main {
  public static void main (String [] args){

     Stampa stringa = new Stampa () //error line 44
     stringa.operazione();
  }
}

Это связанные ошибки, обнаруженные с помощью новый синтаксический анализатор, который управляет \ n:

Errore: syntax error, unexpected NEWLINE, expecting SEMICOLON or COMMA alla linea 5
Errore: syntax error, unexpected NUMBER, expecting NEW or LBRACE alla linea 7
Errore: syntax error, unexpected SEMICOLON, expecting COMMA or RBRACE alla linea 7
Errore: syntax error, unexpected NUMBER, expecting NEW alla linea 9
Errore: syntax error, unexpected PRINTLN, expecting OUT alla linea 13
Errore: syntax error, unexpected NUMBER, expecting SEMICOLON or COMMA alla linea 21
Errore: syntax error, unexpected NUMBER, expecting SEMICOLON or COMMA alla linea 27
Errore: syntax error, unexpected NEWLINE, expecting SEMICOLON alla linea 35
Errore: syntax error, unexpected NEWLINE, expecting SEMICOLON alla linea 44

Вместо этого это относительные ошибки, обнаруженные старым парсером:

Errore: syntax error, unexpected INT, expecting SEMICOLON or COMMA alla linea 5
Errore: syntax error, unexpected NUMBER, expecting NEW or LBRACE alla linea 7
Errore: syntax error, unexpected SEMICOLON, expecting COMMA or RBRACE alla linea 7
Errore: syntax error, unexpected ID, expecting SEMICOLON or COMMA alla linea 9
Errore: syntax error, unexpected NUMBER, expecting NEW alla linea 9
Errore: syntax error, unexpected NUMBER, expecting RBRACE alla linea 9
Errore: syntax error, unexpected SEMICOLON alla linea 9
Errore: syntax error, unexpected FOR, expecting $end alla linea 11

Казалось бы, обнаружение ошибок более эффективно с парсером который управляет \ n.

. Правильно ли вставлять символ конца строки (\ n) в конце продукций или это необычно по сравнению с предыдущим парсером, который игнорировал \ n?

...