2014-01-26 5 views
6

Ich habe gerade mit pyparsing gestartet und ich habe Probleme mit Zeilenumbrüchen.pyparsing und Zeilenumbrüche

Meine Grammatik ist:

from pyparsing import * 

newline = LineEnd() #Literal ('\n').leaveWhitespace() 
minus = Literal ('-') 
plus = Literal ('+') 
lparen = Literal ('(') 
rparen = Literal (')') 
ident = Word (alphas) 
integer = Word (nums) 

arith = Forward() 
parenthized = Group (lparen + arith + rparen) 
atom = ident | integer | parenthized 

factor = ZeroOrMore (minus | plus) + atom 
arith << (ZeroOrMore (factor + (minus | plus)) + factor) 

statement = arith + newline 
program = OneOrMore (statement) 

Wenn ich jetzt analysieren folgendes:

print (program.parseString ('--1-(-a-3+n)\nx\n')) 

Das Ergebnis ist wie erwartet:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', 'x', '\n'] 

Aber wenn die zweite Zeile analysiert werden kann als Schwanz der ersten Zeile, die erste \n ist wegmagiert?

Code:

print (program.parseString ('--1-(-a-3+n)\n-x\n')) 

Tatsächliches Ergebnis:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '-', 'x', '\n'] 

Erwartetes Ergebnis:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', '-', 'x', '\n'] 

Eigentlich will ich nicht den Parser automatisch Aussagen zu kommen.

1. Was mache ich falsch?

2. Wie kann ich das beheben?

3. Was geschieht unter der Haube, die dieses Verhalten verursacht (was sicherlich sinnvoll ist, aber ich sehe es einfach nicht)?

Antwort

8

'\ n' wird normalerweise als Whitespace-Zeichen übersprungen. Wenn Sie möchten, ‚\ n‘ signifikant sein, dann müssen Sie setDefaultWhitespaceChars rufen ‚\ n‘ als überspringbare Leerzeichen zu entfernen (Sie müssen dies tun, bevor irgendwelche Ihrer pyparsing Ausdrücke definieren):

from pyparsing import * 
ParserElement.setDefaultWhitespaceChars(' \t') 
1

Was ist passiert hier, dass der Parser standardmäßig alle Leerzeichen ignoriert. Sie benötigen die folgende Codezeile hinzuzufügen, bevor Sie Elemente definieren:

ParserElement.setDefaultWhitespaceChars(" \t") 

Die normalen Standard Leerzeichen sind „\ t \ r \ n“, glaube ich.

Edit: Paul hat mich dazu geschlagen. Ich hätte mich nach dem gemeinsamen Abendessen erfrischen müssen. :)