将函数解析添加到简单的 pyparsing 算术语法
Add function parsing to simple pyparsing arithmetics grammar
我有这个代码:
import pyparsing as pp
point = pp.Literal(".")
number = pp.Combine(pp.Word(pp.nums) + pp.Optional(point + pp.Word(pp.nums)))
lpar = pp.Literal("(").suppress()
rpar = pp.Literal(")").suppress()
plus = pp.Literal("+")
minus = pp.Literal("-")
mult = pp.Literal("*")
div = pp.Literal("/")
exp = pp.Literal("^")
mod = pp.Literal("%")
idiv = pp.Literal("//")
comma = pp.Literal(',')
ident = pp.Combine(pp.Word(pp.alphanums) + pp.Literal("_") + pp.Word(pp.nums))
expr = pp.Forward()
atom = number | ident | pp.Group(lpar + expr + rpar)
factor = pp.Forward()
factor <<= pp.Group(atom + pp.ZeroOrMore(exp + factor))
term = pp.Group(factor + pp.ZeroOrMore((mult | idiv | div | mod | exp) + factor))
expr <<= pp.Optional(plus | minus) + term + pp.ZeroOrMore((plus | minus) + term)
为 expr
中的简单算术表达式提供解析器。我怎样才能改变它,以便解析器也接受函数调用(例如 1 + max(1 + 2, var_14 / 3)
)作为其输入的数学表达式的一部分?我考虑在语法中包含这样的内容:
arglist = atom | pp.Combine(arglist + comma + atom)
func = ident + lpar + arglist + rpar
在此语法中,函数调用与变量引用或数字文字处于同一级别,因此我将其添加为 atom
定义的一部分:
function_call = Group(ident + lpar + Group(Optional(delimitedList(expr))) + rpar)
atom = number | function_call | ident | pp.Group(lpar + expr + rpar)
另请注意使用 delimitedList
代替 expr + ZeroOrMore(comma + expr)
。
我有这个代码:
import pyparsing as pp
point = pp.Literal(".")
number = pp.Combine(pp.Word(pp.nums) + pp.Optional(point + pp.Word(pp.nums)))
lpar = pp.Literal("(").suppress()
rpar = pp.Literal(")").suppress()
plus = pp.Literal("+")
minus = pp.Literal("-")
mult = pp.Literal("*")
div = pp.Literal("/")
exp = pp.Literal("^")
mod = pp.Literal("%")
idiv = pp.Literal("//")
comma = pp.Literal(',')
ident = pp.Combine(pp.Word(pp.alphanums) + pp.Literal("_") + pp.Word(pp.nums))
expr = pp.Forward()
atom = number | ident | pp.Group(lpar + expr + rpar)
factor = pp.Forward()
factor <<= pp.Group(atom + pp.ZeroOrMore(exp + factor))
term = pp.Group(factor + pp.ZeroOrMore((mult | idiv | div | mod | exp) + factor))
expr <<= pp.Optional(plus | minus) + term + pp.ZeroOrMore((plus | minus) + term)
为 expr
中的简单算术表达式提供解析器。我怎样才能改变它,以便解析器也接受函数调用(例如 1 + max(1 + 2, var_14 / 3)
)作为其输入的数学表达式的一部分?我考虑在语法中包含这样的内容:
arglist = atom | pp.Combine(arglist + comma + atom)
func = ident + lpar + arglist + rpar
在此语法中,函数调用与变量引用或数字文字处于同一级别,因此我将其添加为 atom
定义的一部分:
function_call = Group(ident + lpar + Group(Optional(delimitedList(expr))) + rpar)
atom = number | function_call | ident | pp.Group(lpar + expr + rpar)
另请注意使用 delimitedList
代替 expr + ZeroOrMore(comma + expr)
。