2014-07-23 61 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