mehrere Parser haben, ist das kein Problem, überprüfen Sie bitte die PLY documenation (hier http://www.dabeaz.com/ply/ply.html#ply_nn37)
lexer = lex.lex() # Return lexer object
parser = yacc.yacc() # Return parser object
Weiter Stellen Sie beim Parsen sicher, dass Sie der Funktion parse() einen Verweis auf den Lexer geben, den sie verwenden soll. Zum Beispiel:
parser.parse(text,lexer=lexer)
Wenn Sie vergessen, dies zu tun, wird der Parser den letzten Lexer erstellt verwenden - was nicht immer ist das, was Sie wollen.
so können Sie einige Attribute
Im Parser enthalten, die "Lexer" und "Parser" Attribute beziehen sich auf die Lexer und Parser-Objekte sind.
def p_expr_plus(p):
'expr : expr PLUS expr'
...
print p.parser # Show parser object
print p.lexer # Show lexer object
Weitere Details finden Sie hier
http://www.dabeaz.com/ply/ply.html#ply_nn37
Ja, wir können das tun, aber vorstellen, dass die Luft zu sprengen in der Anzahl der Codezeilen gefunden. Wir können auch verschiedene Markierungen für jede Reihe verwenden. Ich wollte wissen, ob es eine Variable wie eine Regel gibt, die sagt, welche Regel verwendet wurde. Trotzdem danke. –
Ah, ich verstehe, Entschuldigung! Ich fürchte, ich kenne keine Variable, um zu sagen, welche Regel verwendet wurde. (Ich denke, Sie erwarten Code-Blow-Up, da Sie sehr ähnlichen Code für die verschiedenen Regeln haben. Vielleicht könnten Sie eine Hilfsfunktion aufrufen, um ähnliche Regeln zu parsen und dann wäre der Overhead der Aufspaltung in verschiedene Funktionen nicht so kostspielig?) –
Das hat gewonnen Im Falle einer komplizierteren Grammatik, bei der Regeln mit unterschiedlichen Prioritäten "% pred" benötigen, um Konflikte zu reduzieren, werden Konflikte vermieden, da diese Regeln auf der gleichen Ebene sein müssen. – dionyziz