2014-01-26 36 views
6

我剛開始pyparsing和我有換行的問題。pyparsing和換行符

我的語法是:

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) 

現在,當我分析如下:不出所料

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

結果:

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

但是當第二行可以被解析作爲第一行的尾部,第一個\n被捲走了?

代碼:

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

實際結果:

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

預期結果:

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

其實我不想分析器自動加入語句。

1.什麼是我做錯了什麼?

2.我怎樣才能解決這個問題?

3.引擎蓋下面發生了什麼導致這種行爲(這肯定是明智的,但我只是看不到點)?

回答

8

「\ n」爲通常跳過作爲空白字符。如果你想「\ n」是顯著,那麼你必須調用setDefaultWhitespaceChars刪除「\ n」作爲可跳過空白(你必須確定你的任何pyparsing表達式之前做到這一點):

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

是什麼這裏發生的是解析器在默認情況下忽略任何空格。您需要添加以下代碼行定義任何元素的前面:

ParserElement.setDefaultWhitespaceChars(" \t") 

正常的默認空白字符「\ t \ r \ n」,我相信。

編輯:保羅打我給它。吃完一頓後,我應該清醒過來。 :)