2016-08-23 1 views
-1

Ich habe die Ply example calculator from Github ausprobiert.Ply Beispiel Rechner mehrere Ausdrücke

Wenn ich den Rechner laufen lasse, läuft es innerhalb einer REPL. Wie würde ich Ply verwenden, um zu ermöglichen, dass mehrere Ausdrücke nacheinander ausgewertet werden.

Zum Beispiel, wenn ich eingeben 3+4 der REPL tut dies:

calc > 3+4 
7 
calc > 

Wenn ich eingeben 4+3 6+2 der REPL tut dies:

calc > 4+3 6+2 
Syntax error at '6' 
2 
calc > 

Wie würde ich das Beispiel Rechner modifizieren, um die REPL zu ermöglichen Um dies zu tun:

calc > 4+3 6+2 
7 
8 
calc > 

Muss ich das Gramma ändern r, der Parser oder beides? Ich habe versucht, die Grammatik zu ändern, um es rekursiv zu machen, aber es scheint nicht zu funktionieren.

+0

Da die Probe Grammatik * bereits * linksrekursive, Ihre Aussage, dass Sie es versucht haben, zu modifizieren linksrekursive werden erfordert eine gewisse Aufklärung. (Und warum würden Sie denken, dass würde einen Unterschied machen?) – rici

+1

Zu weit gefasst: Sie haben im Wesentlichen eine Bibliothek eines Drittanbieters gefunden und Sie fragen, wie Sie sie für Ihre eigenen Zwecke ändern können, was nicht besser ist als "schreibe diesen Code für mich". –

+0

@ Two-BitAlchemist Ehrlich gesagt bin ich nicht. Ich versuche einen einfachen Interpreter mit Ply zu schreiben und mein Interpreter kann momentan nur einen Ausdruck/eine Aussage gleichzeitig auswerten. Ich wollte meinen Interpreter nicht posten, da er wesentlich länger ist als der Beispielrechner. Ich habe den Sample-Rechner gewählt, weil er die gleiche Beschränkung hat, die ich herausfinden möchte, und er ist viel kleiner. – Francis

Antwort

1

Die Grammatik des Beispielrechners erlaubt Ausdrücke wie - 42 (oder -(4*8)+7). Wenn ein solcher Ausdruck der zweite Ausdruck in einer Zeile wäre, würde dies zu einer Mehrdeutigkeit führen. Ist:

calc > 4 * 3 -(4*8)+7 

ein Ausdruck oder zwei?

Eine Möglichkeit, die Grammatik unzweideutig zu machen, besteht darin, mehrere Ausdrücke auf einer durch Komma getrennten Zeile zuzulassen. Sie könnten das tun, indem nur '.' in die Liste der literalen Token hinzugefügt, und platzieren Sie die Funktion

def p_line(p): 
    '''line : statement 
      | line ',' statement''' 
    pass 

als erste Parser-Funktion (dh kurz vor p_statement_assign

Mit dieser Änderung.

$ python calc.py 
Generating LALR tables 
calc > 2+3 
5 
calc > 2+3,4+6 
5 
10 
calc > 2,3 
2 
3 
calc > a=2,a+7 
9 
+0

Danke! Genau das habe ich gesucht! Ich wusste nie, dass Sie eine Zeile in der Grammatik ohne eine Parser-Aktion haben könnten. – Francis

+0

'pass' ist eine Aktion. Nur ein sehr fauler. – rici

Verwandte Themen