基于pyparsing的BNF上下文无关语法中的power合并

2024-04-24 16:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我有一个语法能够解析表达式与共同中缀运算符,函数,括号,数字和标识符,并转换成一个堆栈。你知道吗

我的问题是-(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)

Tags: selfoptionalwordatomfactorexpridentsuppress