【问题标题】:Can the shunting yard algorithm parse POSIX regular expressions?调车场算法能解析POSIX正则表达式吗?
【发布时间】:2010-11-12 04:14:12
【问题描述】:

乍一看,shunting yard algorithm 似乎适用于 POSIX 正则表达式解析,但由于我在编写解析器方面没有太多经验(或理论背景),所以我想在开始写东西之前问一下 SO只是半途而废。

也许这个问题的一个更复杂的版本是:对于可以应用调车场算法的问题类别,什么是好的正式陈述?

澄清:这个问题是关于你是否可以使用分流算法的基本原理将POSIX re语法解析成抽象语法树,而不是你是否可以使用正则表达式来实现分流算法。抱歉,我说得不够清楚!

【问题讨论】:

  • 当您谈论解析正则表达式时,您的意思是对描述常规语言的字符串进行标记吗?还是您的意思是执行它所代表的有限状态自动机?还是别的什么?
  • 我的意思是构建一个表示正则表达式的 AST。我知道,将 AST 转换为自动机以匹配正则表达式是另一个问题。

标签: c regex algorithm parsing


【解决方案1】:

我相当肯定它可以。如果你看一下 Henry Spencer 的正则表达式包:

regexp.shar.Z

这是 Perl 正则表达式的基础,你会注意到他将程序描述为“铁路正常形式”。

【讨论】:

    【解决方案2】:

    我认为您会遇到一些问题,因为不同的字符在不同的上下文中具有不同的含义,例如

    ^[^a-z][asd-]
    

    ^ 有两种不同的含义,- 也是如此。我想我会选择递归下降解析器。

    【讨论】:

    • 我一开始也是这么想的,但是如果可以从堆栈/队列状态中有效地确定上下文,那么处理这些特殊应该没什么大不了的吧?
    • 顺便说一下,[^a-z][asd-] 都是单独的令牌。没有理由在解析器级别将它们视为更复杂的东西。在建立 FA 时,他们有机会变得特别。
    • @R.. 我并不是说这是不可能的,甚至真的很难,但是一旦你发现自己不得不走堆栈,你可能走错了路。我只是认为它作为递归下降解析器会更干净。
    • @R.. :如果您在该级别进行标记,那么我的问题可能会消失,并且分流算法的实现变得相当简单。
    • 我喜欢调车场的地方在于其非常可预测的性能和内存使用情况。这一切都在一个缓冲区中(4*strlen(regex) 应该足够了)并且失败情况纯粹是初始分配失败或无效语法。不会出现堆栈使用失控或在失败时回溯和释放部分构建的 AST 的可能性。
    【解决方案3】:

    我不明白为什么它不适合。查看一些旧代码,似乎我对我的最后一个正则表达式解析器使用了完全不同的解析策略,但是(本质上,从一开始就进行演练,在你进行的过程中构建生成的自动机表示,并带有一些前瞻和递归调用以实现正则表达式的分组)。

    【讨论】:

      【解决方案4】:

      我会说,您的问题的答案是“不,您不能使用正则表达式实现调车场算法。”这与您无法使用正则表达式解析任意 HTML 的原因相同。归结为:

      正则表达式没有堆栈。因为调车场算法依赖于堆栈(在从中缀转换为 RPN 时推送和弹出操作数),所以正则表达式不具备执行此任务的计算“能力”。

      这掩盖了许多细节,但“正则表达式”是定义正则语言的一种方式。当您“使用”正则表达式时,您是在要求计算机说:“查看一段文本并告诉我这些字符串中是否有任何字符串是我的语言。我使用正则表达式定义的语言。”我将指向this most excellent answer which you and everyone reading this should upvote 了解更多关于常规语言的信息。

      所以现在您需要一些数学概念来增强“常规语言”,以便创建更强大的语言。如果您要将调车场算法描述为计算能力模型的实现,那么您可能会说该算法将被描述为context-free grammar(嘿,您知道吗,该链接使用表达式解析树作为例如。)一个push-down automata。有堆栈的东西。

      如果您对自动机理论和复杂性类不太熟悉,那么如果不从头开始解释这些维基百科文章可能就没有多大帮助。

      重点是,您可以使用正则表达式来帮助编写调车场。但是正则表达式不太擅长进行具有任意深度的操作,而这个问题就是这样。所以我不会花太多时间在正则表达式上解决这个问题。

      【讨论】:

      • 我认为您误读了我的问题。我不是要求用正则表达式实现调车场。我在问是否可以使用分流算法的变体来解析正则表达式(到 AST)。
      • 不管怎样,你已经写了一个很好的答案,虽然是针对不同的问题,所以我希望你不要直接删除它!
      • @poundifdef,这是对您的好答案的致敬问题。提示提示:stackoverflow.com/questions/9298076/…
      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      相关资源
      最近更新 更多