【问题标题】:BNF to regular ExpressionsBNF 到正则表达式
【发布时间】:2009-01-14 12:18:52
【问题描述】:

如何描述语言

A → AA | ( A ) | ε

使用正则表达式生成?

【问题讨论】:

  • 这是作业吗?您能告诉我们您自己为解决这个问题所做的努力,以及您没有得到什么吗?

标签: regex bnf


【解决方案1】:

正则表达式接受来自正则语言的字符串。 FSM 也可以接受常规语言。

在您的语言中,您必须匹配的括号数量可能无限多。这意味着您需要一个无限状态,这在任何 Finite 状态机中显然是不可能的。因此,您的语言不规则,无法与正则表达式匹配。

【讨论】:

    【解决方案2】:

    正则表达式不能匹配嵌套括号。

    【讨论】:

    • @jm:如果你完整阅读了这篇文章,Steve 写道,只有“大括号总是平衡的,并且大括号嵌套的级别不超过 1”,“常规”正则表达式才能匹配括号。使用像平衡组 (blog.stevenlevithan.com/archives/balancing-groups) 这样的扩展语法,这似乎是一种创建递归体面解析器的聪明方法,这对我来说并不重要。
    【解决方案3】:

    我不确定您如何标记该语言,但该语言不是常规语言,正如可以使用常规语言的抽引引理所示(因此,它不能被正则表达式记录)。一个直观的解释是,接受该语言中的单词将要求 FDA “记住”每次开始读取右括号时它刚刚读取的左括号的数量,而这对他们来说是不可能的,因为他们没有“记忆” '。另一方面,下推式自动机......

    对于任何 n,该语言是否可以记为 {(n)n}*

    【讨论】:

      【解决方案4】:

      您不能 - 正则表达式只能识别一小部分可能的语言。特别是,非正式地,任何需要无限量内存才能识别的语言都是不可识别的。

      在这里,您需要无限量的内存来记住您看到了多少个左括号,以确保右括号的数量相同。

      您需要一些能够解析上下文无关语法的机制,以便能够识别 BNF 描述的一般语言。现代解析器在这方面非常擅长!

      【讨论】:

        【解决方案5】:

        正如其他人所说,您不能使用单个正则表达式来执行此操作,但是您可以使用两个“\(”和“\)”对其进行标记。看到您的语言中只能有括号,但我不确定这是否非常有用。

        注意:您还需要一名传球手来确保括号正确配对。所以“(()()”会分词但不会解析。

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 2016-09-28
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多