Używam bison + flex do analizy pliku. W przypadku błędu wywoływana jest funkcja yyerror(). Jak mogę uzyskać numer linii lub łańcuch, który narusza reguły, aby wydrukować go z komunikatem o błędzie?bison/flex: wydrukuj błędną linię
Odpowiedz
Numer linii jest łatwy: yylineno
to numer linii. Określ %option yylineno
u góry pliku .l.
Cóż, prawie łatwe. Przegrywanie może czasami spowodować, że numer linii będzie wyłączony o jeden. Zamiast powiedzieć coś w rodzaju "Błąd występujący w linii #xxx" możesz powiedzieć, że błąd wystąpił w pobliżu linii #xxx.
Jeśli chodzi o resztę, to zależy od Ciebie. Będziesz musiał uchwycić niezupełnie poprawną składnię i wywołać odpowiednie ostrzeżenie lub procedurę obsługi błędów. Zobacz książkę O'Reilly "flex & bizona", aby uzyskać szczegółowe informacje; ma cały rozdział na temat komunikatów o błędach. Cały rozdział jest nieco za dużo do odtworzenia na tej stronie Q &.
yylineno
daje lineno przetwarzanego
Można również poinformować użytkownika, co tekst dał błąd z yytext w giętkiej strony:
0|([1-9]{DIG}*) {
String msg("some error with number: "); msg.append(yytext);
yyerror(msg.c_str());
}
yytext zawiera tylko tekst dla dopasowanego reguła.
Jeśli chcesz podać całą linię, musisz zrobić to samodzielnie, otwierając plik szukając numeru wiersza yylineno
i wydrukować go, dobrym miejscem na to jest zapewnienie własnej implementacji funkcji yyerror
.
- 1. Wydrukuj pustą linię?
- 2. Wydrukuj tylko pasujące słowo, nie całą linię przez grep
- 3. Java: Obliczenia zwracające błędną odpowiedź?
- 4. Wydrukuj do pliku XPS, a następnie wydrukuj go na drukarce.
- 5. Jak wyszukać słowo w pliku tekstowym i jeśli zostanie znalezione, wydrukuj całą linię
- 6. wydrukuj przyczynę niepowodzenia segmentacji
- 7. Jersey: Wydrukuj aktualne żądanie.
- 8. Wydrukuj ślad stosu wyjątku
- 9. lsof wydrukuj numeryczne porty
- 10. Wydrukuj drzewo wyników pyparsingu
- 11. Wydrukuj wartości postów
- 12. prolog - wydrukuj wartość zmiennej
- 13. Wydrukuj mapę w LeafletJS
- 14. Gmail wysyła e-mail z błędną nazwą
- 15. C# Math.cos (podwójne) zwraca błędną wartość
- 16. Django request.is_secure zwraca błędną wartość przekierowanych metod
- 17. Konwersja ciąg byte [] zwraca błędną wartość (kodowanie?)
- 18. Jak naprawić błędną długość klucza AES?
- 19. Suma elementów tablicy zwraca błędną wartość
- 20. wydrukuj resztę pól w awk
- 21. Ładnie wydrukuj macierz w matematyce
- 22. Wydrukuj zawartość DIV przez JQuery
- 23. Wydrukuj określoną część strony internetowej
- 24. Wydrukuj nazwę zmiennej target-C
- 25. cmake, wydrukuj komendy kompilacji/linku
- 26. Wydrukuj hierarchię wyjątków/błędów Pythona
- 27. Wydrukuj mapę z własną warstwą
- 28. Wydrukuj dyktat posortowany według wartości
- 29. Wydrukuj konfigurację Grunt.js podczas kompilacji
- 30. Wydrukuj maks. 4 miejsca dziesiętne
Dzięki za szybką odpowiedź. "Jeśli chodzi o resztę, to zależy od ciebie":) cóż, to jest kwestia mojego pytania - jak uchwycić linię naruszającą to? –
@ user497208: Spóźniona odpowiedź na ostatnie pytanie: Jesteś (nieumyślnie) prosząc mnie o napisanie książki lub rozdziału książki. Pisanie książki, a nawet rozdziału lub części książki, jest nieco poza zakresem internetowych stron pytań i odpowiedzi, takich jak Stack Overflow. Podałem nazwę książki, która szczegółowo omawia ten temat. Przeczytaj to! –