目前,我有一个语法能够解析表达式与共同中缀运算符,函数,括号,数字和标识符,并转换成一个堆栈。你知道吗
我的问题是-(2)^3被解析为类似于(-2)^3,而它应该类似于-(2^3)。我做错什么了?你知道吗
编辑:我们希望成为-2^3作为(-2)^3和-a^3作为-(a^3)
point = Literal(".")
e = CaselessLiteral("e")
fnumber = Combine(Optional("-") + Word(nums) +
Optional(point + Optional(Word(nums))) +
Optional(e + Word("+-" + nums, nums))).setParseAction(self.pushfirstfunc("number"))
ident = Word(alphas, alphas + nums + "_")
funcname = Word(alphas, alphas + nums + "_")
plus = Literal("+")
minus = Literal("-")
uminus = Literal("-")
mult = Literal("*")
div = Literal("/")
lpar = Literal("(").suppress()
rpar = Literal(")").suppress()
lparfunc = Literal("(").suppress()
rparfunc = Literal(")").suppress()
comma = Literal(",")
addop = plus | minus
multop = mult | div
expop = Literal("^")
self.expr = Forward()
atom_paren = (lpar + self.expr + rpar)
atom_ident = ident.setParseAction(self.pushfirstfunc("identifier"))
atom_func = (funcname + lparfunc + self.expr + ZeroOrMore(
(comma + self.expr).setParseAction(self.pushfirstfunc("argument"))) + rparfunc).setParseAction(
self.pushfirstfunc("function"))
atom = (fnumber |
atom_func | (uminus + atom_func).setParseAction(self.pushfirstfunc("unary-")) |
atom_ident | (uminus + atom_ident).setParseAction(self.pushfirstfunc("unary-")) |
atom_paren | (uminus + atom_paren).setParseAction(self.pushfirstfunc("unary-"))
)
factor = Forward()
factor << atom + ZeroOrMore((expop + factor).setParseAction(self.pushfirstfunc("infix")))
term = factor + ZeroOrMore((multop + factor).setParseAction(self.pushfirstfunc("infix")))
self.expr << term + ZeroOrMore((addop + term).setParseAction(self.pushfirstfunc("infix")))
self.bnf = self.expr + stringEnd
self.bnf.ignore(cStyleComment)
目前没有回答
相关问题 更多 >
编程相关推荐