Я сделал 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?