2014-07-23 66 views
1

我想解析一個簡單的語言。麻煩來解析函數調用。我試圖告訴它,函數調用是一個表達式,後面跟着左括號,參數列表和右括號。我有這樣的事情:用PyParsing解析函數調用

expr = Forward() 
iden = Word(alphas+'_', alphanums+'_') 
integer = Word(nums) 
binop = operatorPrecedence(expr, ...) # irrevelant 
call = expr + Literal('(') + delimitedList(expr) + Literal(')') 
expr << call | integer | iden 

的問題是顯而易見的:expr是左遞歸。但是,我不知道該怎麼做才能解決這個問題。我對右遞歸式語法(a.k.a.PLY,Yacc等)有經驗,但我仍在試圖找出左遞歸語法。

+0

來解析立即左遞歸生產的LL解析器,你需要(一)將其轉換爲一個弱等效右遞歸生產,或(b)寫一個明確的歧義或縮減算法。 (或者,當然,你可以削弱產量,使得調用不能以任何'expr'開頭,只能使用'expr'的子產品。)我不知道'pyparsing'是否足夠了解if (b)是一種選擇。 – abarnert

+0

我認爲PyParsing的各種版本的Python的例子,基本上使用選項(c)。 IIRC,在2.x早期(這可能是最簡單的),一個'call'是一個'atom'(不是'expr'),後面跟着一個加括號的'arglist',併產生一個'power'(不是'expr' )。只要找出你想要調用表達式的優先級在哪裏,將operatorPrecedence組拆分成大約一半和低於一半的一半,然後明確地將調用放在兩者之間。 (但是,你知道,實際上看看pyparsing的例子或Python語法,而不是相信我的記憶。:)) – abarnert

+0

所以在這種語言中,「36(21)」是一個有效的函數調用? – PaulMcG

回答

1
Functionname = Word(alphanums + '_') 
functionbody = Forward() 
functionbody <<= Functionname + (Literal("(") + 
Optional(delimitedList (functionbody | Word(alphanums + '_') | "''"),'') 
+ Literal(")")) 
+0

哈哈,我忘記了這個問題!無論如何,謝謝你的回答。 ; d – refi64