2012-07-29 11 views

Antwort

9

Dies scheint zu funktionieren:

%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]); 
       } 
     } 
} 

Es wird versucht, alle möglichen Token und druckt diejenigen, die in der aktuellen Parser-Zustand anwendbar sind.

Beachten Sie, dass wenn ein falsches Token kommt, der Parser syntax_error nicht sofort aufruft, sondern versucht, den Stack zu reduzieren, in der Hoffnung, dass der Token danach verschoben werden kann. Nur wenn nichts anderes reduziert werden kann und das aktuelle Token nicht verschoben werden kann, ruft der Parser syntax_error auf. Die Reduzierungen ändern den Parserstatus, was bedeutet, dass Sie möglicherweise weniger Token sehen, als vor den Reduzierungen anwendbar gewesen wären. Es sollte jedoch für die Fehlerberichterstattung ausreichen.

+2

Genau das, wonach ich gefragt habe! Sie haben jedoch einen 'yypParser' als ersten Parameter von yy_find_shift_action vergessen :) –

1

Es gibt keine direkte Methode, um solche Liste in Lemon zu erzeugen. Sie können dies jedoch mit der Debug-Ausgabe des Lemon-Tools und der Debug-Verfolgung des generierten Parsers versuchen. Nach dem Aufruf von ParseTrace generiert der erzeugte Parser eine Liste von Verschiebungen und Reduzierungen, die auf den Eingabestrom angewendet werden. Der letzte Shift-vor-Syntaxfehler enthält die Nummer des aktuellen Zustands vor dem Fehler. Finden Sie diesen Status in der * .out-Datei für Ihren Parser und sehen Sie sich die Liste der erwarteten Token an.

Verwandte Themen