【问题标题】:How do I improve my parsing technique?如何改进我的解析技术?
【发布时间】:2011-03-07 20:47:08
【问题描述】:

我正在为自定义语言编写一个 pythonic 解析器,到目前为止我有这样的东西:

re1 = re.compile(r"...")
re2 = re.compile(r"...")
re3 = re.compile(r"...")
re4 = re.compile(r"...")
...
...

现在我正在读取输入文件,并且对于每一行,如果我找到一个特定的关键字,那么我正在使用一个特定的正则表达式。显然,这让我的生活变成了地狱,因为我正在做这样的事情:

if line.find("keyword1") >= 0
  # Uses re1 to match the string
  invoke_handler1() 
elif line.find('keyword2") >= 0
  # Uses re2 to match the string
  invoke_handler2() 
...

同时,我不想将给定的行与所有可能的正则表达式匹配,因为那样会浪费。在不丢弃我之前写的所有内容的情况下,有没有一种优雅的方法可以解决这个问题并使其更高效和可读?

【问题讨论】:

  • 你考虑过使用真实的parser吗?
  • 这个解析器是干什么用的?你能详细说明你正在解析的文本/代码的复杂性吗?
  • @nmichaels:我想我需要进一步研究。谢谢! @Nicolas Buduroi:我正在解析字节码反汇编。
  • 正则表达式不能计数,也不能解析像x = (a + (a+b)*c)*d这样的嵌套结构。您可能想阅读一些有关语言理论的内容,以及常规语言在一般情况下的排名。

标签: python regex programming-languages parser-generator


【解决方案1】:

您可以查看可用于 Python 的many parser libraries 之一,而不是使用您自己的解析器。

【讨论】:

    【解决方案2】:

    我认为这不是您正在寻找的答案,但我认为您会更好地使用实际的 Lexer 和 Tokenizer 来解析您的语言。我建议查看并学习使用PLY 来完成此类任务。

    【讨论】:

      【解决方案3】:

      您可能希望创建一个将关键字映射到 RE 的数据结构。但老实说,我会尝试将快速失败的 RE 作为首要任务,然后循环遍历它们。

      快速失败 RE 的一个示例是以“^Sometext”开头的 RE,就好像第一个字符与“S”不匹配,然后不评估 RE 的其余部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2010-12-25
        相关资源
        最近更新 更多