2011-06-24 17 views
8

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

8

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 &.

+2

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? –

+1

@ 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! –

2

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.