簡體   English   中英

將函數解析添加到簡單的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM