2012-03-23 13 views
3

In Lage wie können wir unterscheiden zwischen denen Regel verwendet wurde -Python PLY mehrere Regeln

Beispiel: - ''‘ p: a b | c | d '' ' Also nehmen wir an, wir müssen anderen Code für verschiedene Regeln schreiben. Dann gibt es einen eleganten Weg dazu. Eine Möglichkeit, wie im Handbuch beschrieben, besteht darin, eine Kombination von Regeln und Token zu verwenden, die aber nicht immer klickt.

Antwort

-1

Brechen Sie den Ausdruck einfach in mehrere Regeln auf, wobei für jeden Code eine Regel gilt.

z.B. (Von http://www.dabeaz.com/ply/ply.html#ply_nn25)

def p_expression(p): 
    '''expression : expression PLUS term 
       | expression MINUS term''' 
    if p[2] == '+': 
     p[0] = p[1] + p[3] 
    elif p[2] == '-': 
     p[0] = p[1] - p[3] 

auch als

geschrieben werden können
def p_expression_plus(p): 
    'expression : expression PLUS term' 
    p[0] = p[1] + p[3] 

def p_expression_minus(t): 
    'expression : expression MINUS term' 
    p[0] = p[1] - p[3] 
+1

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

+0

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

+0

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

-1

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

+0

Er fragt nicht nach mehreren Lexern und mehreren Parsern - die Frage betrifft mehrere Grammatikregeln in einem einzelnen Parser. – dionyziz