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.14
或 log(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
.有什么问题吗?
所以我正在制作
>>> 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.14
或 log(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
.有什么问题吗?