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