当前位置: 首页 > 面试题库 >

使用pyparsing解析嵌套函数调用

彭雨华
2023-03-14
问题内容

我正在尝试使用pyparsing以下形式解析函数调用:

f(x, y)

这很容易。但是,由于它是递归下降的解析器,因此解析起来也应该很容易:

f(g(x), y)

那就是我无法得到的。这是一个简化的示例:

from pyparsing import Forward, Word, alphas, alphanums, nums, ZeroOrMore, Literal

lparen = Literal("(")
rparen = Literal(")")

identifier = Word(alphas, alphanums + "_")
integer  = Word( nums )

functor = identifier

# allow expression to be used recursively
expression = Forward()

arg = identifier | integer | expression
args = arg + ZeroOrMore("," + arg)

expression << functor + lparen + args + rparen

print expression.parseString("f(x, y)")
print expression.parseString("f(g(x), y)")

这是输出:

['f', '(', 'x', ',', 'y', ')']
Traceback (most recent call last):
  File "tmp.py", line 14, in <module>
    print expression.parseString("f(g(x), y)")
  File "/usr/local/lib/python2.6/dist-packages/pyparsing-1.5.6-py2.6.egg/pyparsing.py", line 1032, in parseString
    raise exc
pyparsing.ParseException: Expected ")" (at char 3), (line:1, col:4)

为什么我的解析器将内部表达式的函子解释为独立标识符?


问题答案:

的定义arg应在左侧以另一个开头的项目进行排列,因此应优先匹配:

arg = expression | identifier | integer


 类似资料:
  • 问题内容: 我最近几周正在学习PyParsing。我计划使用它从SQL语句获取表名。我看了http://pyparsing.wikispaces.com/file/view/simpleSQL.py。但是我打算使语法保持简单,因为我不是在试图解析select语句的每个部分,而是在寻找表名。同样,为任何市售的现代数据库(如Teradata)定义完整的语法也很费劲。 这里值得一提。我使用“ SkipT

  • 问题内容: 我有以下代码: 有什么方法可以在函数外部调用函数?我试过调用,但我认为它仅在父函数内部可见。 问题答案:

  • 问题内容: 我有一堆嵌套数据,其格式类似于JSON: 有许多不同的参数具有不同的深度级别-这只是一个很小的子集。 还可能值得注意的是,当创建新的子数组时,总是有一个等号,后跟一个换行符,然后是一个空心括号(如上所示)。 是否有任何简单的循环或递归技术将此数据转换为系统友好的数据格式,例如数组或JSON?我想避免对属性名称进行硬编码。我正在寻找可以在Python,Java或PHP中使用的东西。伪代码

  • 问题内容: 我有一个方法,我已经分解成一些较小的嵌套函数来分解代码库: 有没有一种方法可以单独运行其中一个嵌套函数。例如: 编辑: 我正在尝试在使用pyramid_breaker构建的Web服务器上设置缓存 这是我的理解可能不准确: 现在我有这个原因是因为装饰器用来创建缓存键的名称空间是从函数和争论中产生的。因此,您不能仅将装饰器放在getThis上,因为请求变量是唯一的,并且缓存是无用的。所以我

  • 问题内容: 我正在尝试使用具有以下结构的Java中的gson解析一些JSON数据,但是通过在线查看示例,我找不到任何能完成此工作的东西。 有人可以协助吗? 问题答案: 您只需要创建一个Java类结构即可表示JSON中的数据。为了做到这一点,我建议您将JSON复制到此在线JSON Viewer中 ,您会发现JSON的结构更加清晰… 基本上,您需要这些类(伪代码): 请注意,您的类中的属性名称必须与J

  • 问题内容: 我正在尝试从上述JSON检索邮政编码。我正在用gson解析它。我是JSON的新手,从我在这里的所有文章中读到的内容(有些与此类似),我都知道字段名称应保持原样。所以我知道我必须做出4类,即响应,视图,结果和地址。我使它们成为静态嵌套类,但是我只得到空值作为输出。在下一个JSON中,我有多个地址。但是我只停留在这个单一的回应上。 举一个简短的例子,我尝试使用此代码检索Timestamp,

  • 我想做的是使用Gson将嵌套的json数据解析为Java对象,并使用自定义的toString()将其打印出来。 Json内容 POJO类:示例 POJO类:JsonFormatter 我的POJO还有其他类,我试图将其解析为Gson的方式是: 但是当我试图打印出它的子值时,比如 我得到了错误: 我想实现的是将上面的json内容打印成这样: 谁能帮我解决这个问题吗?提前谢谢!

  • 问题内容: PHP中有一个非常糟糕的限制:如果您调用某个调用a2()的函数a1(),又调用了a3 …,那么何时调用将看到 致命错误:达到最大功能嵌套级别‘100’,正在中止! 有什么方法可以将100个嵌套调用的限制增加到500或10000吗? 这对我来说至关重要,因为我正在开发一个带有很多回调的基于事件的系统。 问题答案: 此错误消息专门来自XDebug扩展。PHP本身没有函数嵌套限制。更改php