pyparsing - 如何解析逗号以在函数中使用

pyparsing - How to parse commas to use in functions

所以我正在制作 ,但程序不解析逗号。例如:

>>> evaluate("round(pi)")
3

>>> evaluate("round(pi, 2)")
SyntaxError: Expected {{[- | +] {{{{{{{W:(ABCD..., ABCD...) Suppress:("(") : ...} Suppress:(")")} | 'PI'} | 'E'} | 'PHI'} | 'TAU'} | {Combine:({{W:(+-01..., 0123...) [{"." [W:(0123...)]}]} [{{'E' [W:(+-)]} W:(0123...)}]}) | Combine:({{{[W:(+-)] "."} W:(0123...)} [{{'E' [W:(+-)]} W:(0123...)}]})}}} | {[- | +] Group:({{Suppress:("(") : ...} Suppress:(")")})}}, found ','  (at
char 8), (line:1, col:9)

程序如何解析函数中使用的逗号?我的 objective 是像 round(pi, 2) returns 3.14log(10, 10) returns 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 = delimitedList(expr)
atom = ((Optional(oneOf("- +")) +
        (Word(alphas, alphas + nums + "_$") + lpar + exprlist + rpar | CaselessLiteral("PI") | e | CaselessLiteral("PHI") | CaselessLiteral("TAU") | fnumber).setParseAction(self.__push_first__))
        | Optional(oneOf("- +")) + Group(lpar + exprlist + rpar)
        ).setParseAction(self.__push_minus__)

而不是:

expr = Forward()
atom = ((Optional(oneOf("- +")) +
                 (ident + lpar + expr + rpar | pi | e | tau | fnumber).setParseAction(self.__push_first__))
                | Optional(oneOf("- +")) + Group(lpar + expr + rpar)
                ).setParseAction(self.__push_minus__)

然后,在 __evaluate_stack__(self, s) 方法中,我尝试了:

if op in self.fn:
    if op == "round":
        try:
            op2 = self.__evaluate_stack__(s)
        except IndexError:
            op2 = 0   # Default value of second argument of round() function
        op1 = self.__evaluate_stack__(s)
        return self.fn[op](op1, int(op2))
    return self.fn[op](self.__evaluate_stack__(s))

问题是 round(pi)(没有第二个参数)引发 SyntaxError,并且 round(pi, 4, 5) returns 4 而不是抛出 SyntaxError .有什么问题吗?