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等)有經驗,但我仍在試圖找出左遞歸語法。
來解析立即左遞歸生產的LL解析器,你需要(一)將其轉換爲一個弱等效右遞歸生產,或(b)寫一個明確的歧義或縮減算法。 (或者,當然,你可以削弱產量,使得調用不能以任何'expr'開頭,只能使用'expr'的子產品。)我不知道'pyparsing'是否足夠了解if (b)是一種選擇。 – abarnert
我認爲PyParsing的各種版本的Python的例子,基本上使用選項(c)。 IIRC,在2.x早期(這可能是最簡單的),一個'call'是一個'atom'(不是'expr'),後面跟着一個加括號的'arglist',併產生一個'power'(不是'expr' )。只要找出你想要調用表達式的優先級在哪裏,將operatorPrecedence組拆分成大約一半和低於一半的一半,然後明確地將調用放在兩者之間。 (但是,你知道,實際上看看pyparsing的例子或Python語法,而不是相信我的記憶。:)) – abarnert
所以在這種語言中,「36(21)」是一個有效的函數調用? – PaulMcG