Dies ist eher eine "im Prinzip" als eine praktische Frage. Ist die Reihenfolge, in der Yacc Produktionen reduziert, und liest neue Token aus dem definierten Lexer. Das heißt, wenn ich den folgenden Satz von Token hatte:Ist die Reihenfolge der Reduktion in Yacc definiert?
INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE
Kann Yacc, im Rahmen ihrer Semantik, lesen Sie die LESS_THAN
Token aus dem Lexer, bevor es INTEGER BEGIN INTEGER_VALUE
auf eine einzige Sache reduziert, da eine Reihe von Produktionen wie:
expr : expr LESS_THAN expr
| integer
integer : INTEGER_BEGIN INTEGER_VALUE
Machen Sie die Regeln für diese Änderung, wenn diese mit semantischen Aktionen definiert sind?
Gibt es einen Weg zu wissen, ob das passiert ist? –
http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html enthält eine vollständige Beschreibung der Semantik der Standardreduktionen, und, wie Sie bemerkten, verursacht einen verzögerten Aufruf des Lexers. –
In einigen Versionen von Bison können Sie in der Aktion "if (yychar == YYEMPTY)" überprüfen, um zu sehen, ob Sie sich in einer Standardreduktion befinden (also wurde kein Lookahead gelesen), aber das ist nicht schrecklich portabel. –