Python pyparsing-如何解析要在函数中使用的逗号

Python pyparsing-如何解析要在函数中使用的逗号,python,python-3.x,parsing,pyparsing,Python,Python 3.x,Parsing,Pyparsing,所以我做了一个,但是程序不解析逗号。例如: 评估(“四舍五入(pi)”) 3. >>>评估(“四舍五入(pi,2)”) (以下:::)以下:::::::::::::)以下::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::))))))警察警察警察的:::::::::::::::::::::::::::::::::{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{(((((((((((({{{{{{{{{{{

所以我做了一个,但是程序不解析逗号。例如:

评估(“四舍五入(pi)”) 3. >>>评估(“四舍五入(pi,2)”) (以下:::)以下:::::::::::::)以下::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::))))))警察警察警察的:::::::::::::::::::::::::::::::::{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{(((((((((((({{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{(以下以下::::::::::::::::::::::::::::::)]}W:(0123…}]}}}}}{[-}+]群:({{抑制:(“(”):…}抑制:(“”“)}}},找到“,”(位于 字符8),(第1行,第9列)
程序如何解析函数中使用的逗号?我的目标是
round(pi,2)
之类的函数返回
3.14
,或者
log(10,10)
返回
1.0

,如果您有一个解析器解析括号中的单个整数,如:

LPAR, RPAR = map(Suppress, "()")
integer = Word(nums)
int_values = LPAR + integer + RPAR
如果要将其更改为接受整数列表,则可以编写:

int_values = LPAR + delimitedList(integer) + RPAR
您也可能会使用Group将这些解析的值逻辑地保存在一起:

int_values = LPAR + Group(delimitedList(integer)) + RPAR
所以,我用了:

expr=Forward()
exprlist=分隔符列表(expr)
atom=((可选(“-+”之一)+
(单词(alphas,alphas+nums+“$”)+lpar+exprlist+rpar | CaselessLiteral(“PI”)| e | CaselessLiteral(“PHI”)| CaselessLiteral(“TAU”)| fnumber)。设置语法动作(自推优先)
|可选(一个(“-+”))+组(lpar+exprlist+rpar)
).setParseAction(自推减)
而不是:

expr=Forward()
atom=((可选(“-+”之一)+
(ident+lpar+expr+rpar | pi | e | tau | fnumber).setParseAction(self.uu push_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
|可选(一个(“-+”))+组(lpar+expr+rpar)
).setParseAction(自推减)
然后,在
\uuuu evaluate\u stack\uuu(self,s)
方法中,我尝试了:

如果操作在self.fn中:
如果op==“四舍五入”:
尝试:
op2=自评估堆栈
除索引器外:
op2=0#round()函数第二个参数的默认值
op1=自我评估堆栈
返回self.fn[op](op1,int(op2))
返回self.fn[op](self.\uu求值\u堆栈)

问题是
round(pi)
(没有第二个参数)会引发
SyntaxError
,而
round(pi,4,5)
会返回
4
,而不是抛出
SyntaxError
。有什么问题吗?

问题在于,函数调用的定义仅适用于采用单个参数的函数。如果函数的参数数量可变,那么计算函数将变得格外困难,因为您不知道要从堆栈中弹出多少个值。事实上,一旦你在一个函数中支持多个参数,你就必须跟踪哪些函数使用1个参数,哪些函数使用2个参数,等等。因为这是你的解析器,我建议你不要支持变量参数。在解析器中找到解析函数的位置,并将单个参数
expr
更改为带分隔符的
expr
s列表。我之前的评论已经回答了这个问题,但您必须阅读它,理解它,并使用pyparsing的有用方法应用它。我想让你自己开始用这个做更多的努力。您已经有了一个受支持函数的dict(我已经非常熟悉),考虑一下,如果您希望一些函数支持多个参数,如何将其添加到此dict中。然后,您将知道要为特定函数从堆栈中弹出多少个参数。如果这对Python来说太高级了,那么您应该学习一些教程。尝试在
exprlist
上添加一个解析操作来增加列表的长度。然后计算器可以先弹出那个数字,然后弹出那么多参数。你真的越来越近了!请注意,现在您所有的函数都需要弹出这个arg计数,即使您知道的那些函数也只接受1 arg。@PaulMcG谢谢,但我该怎么做呢?我是否使用
exprlist=delimitedList(expr).setParseAction(self.\uu push\uuuuu first)
?我试着使用:
def\uu push\u list(self,strg,loc,toks):self.exprStack.append(tuple(toks))
,然后使用
exprlist=delimitedList(expr).setParseAction(self.\uu push\u list\uus)
,但它不起作用。事实上,当我尝试
round(pi,4)
时,我得到:
namererror:function('pi',4')没有定义。
可能更好的名称是
\uuuupush\u list\u length\uuu
,因为您不想推送整个列表-列表元素已经作为其自身解析操作的一部分被推送。您只需要将列表的长度附加到exprStack。然后在求值时,在求值之前从堆栈中取出参数的数量。