2012-07-29 12 views

Odpowiedz

9

To wydaje się działać:

%syntax_error { 
     int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]); 
     for (int i = 0; i < n; ++i) { 
       int a = yy_find_shift_action(yypParser, (YYCODETYPE)i); 
       if (a < YYNSTATE + YYNRULE) { 
         printf("possible token: %s\n", yyTokenName[i]); 
       } 
     } 
} 

Próbuje wszystkich możliwych znaków i wypisuje te, które są stosowane w obecnym stanie parsera.

Należy zauważyć, że gdy pojawi się niepoprawny token, parser nie od razu wywołuje funkcję syntax_error, ale próbuje zmniejszyć to, co na stosie, mając nadzieję, że token zostanie później przesunięty. Dopiero gdy nic innego nie może zostać zredukowane, a bieżący token nie może zostać przesunięty, parser wywołuje funkcję syntax_error. Obniżki zmienią stan parsera, co oznacza, że ​​możesz zobaczyć mniej żetonów, niż byłoby to możliwe przed redukcją. Powinno to jednak wystarczyć do zgłaszania błędów.

+2

Dokładnie o co prosiłem! Jednak zapomniałeś "yypParser" jako pierwszego parametru yy_find_shift_action_ :) –

1

Nie ma bezpośredniej metody generowania takiej listy w Lemon. Ale możesz spróbować zrobić to za pomocą wyjścia debugowania narzędzia Lemon i śledzenia debugowania wygenerowanego analizatora składni. Po wywołaniu funkcji ParseTrace wygenerowany parser wypisuje listę zmian i zmniejsza ją do strumienia wejściowego. Ostatni błąd przed błędem składni zawiera numer bieżącego stanu przed błędem. Znajdź ten stan w pliku * .out dla swojego analizatora składni i zobacz listę oczekiwanych tokenów dla niego.

Powiązane problemy