正则表达式是吗?


16

如果我有Type 3语法,则可以在下推式自动机上表示它(无需对堆栈进行任何操作),因此我可以使用上下文无关的语言表示正则表达式。但是我是否可以知道类型3语法是否为,,等,而无需构造任何解析表?LR(1)LL(1)SLR(1)

Answers:


15

所有常规语言都有LL(1)语法。要获得这样的语法,可以将任意DFA用作正则语言(也许通过对从正则表达式获得的NFA进行子集构造),然后将其转换为右递归正则语法。则该语法为LL(1),因为同一非终结符的任何成对对都以不同的符号开头,或者一个产生ε并以$作为超前标记。因此,所有常规语言也是LR(1),因为任何LL(1)语法都是LR(1)。此外,使用本文的重要结果,您可以证明任何LR(1)语言都具有SLR(1)语法,这意味着任何常规语言都具有SLR(1)语法。

但是,常规语言并不都是LR(0)。LR(0)语言具有非常特殊的属性-特别是它们必须不带前缀。因此,常规语言{a,aa}不是LR(0),尽管它显然是常规的(regex a |(aa))。但是,LR(0)语言未正确包含在常规语言中。{0 n 21 n | n≥1}是LR(0),但语言不规则:

S -> E
E -> 0E1 | 2

希望这可以帮助!


2
右规则语法完全接受规则语言集的事实通常是在课堂上(甚至是练习)完成的,因此答案就更加直接了。
拉斐尔

2

(简单地说)正则表达式语法(您说过“表示形式”)是LR(0)。您不需要任何前瞻即可解析表示正则表达式的字符串。您可以通过在正则表达式的语法上运行解析器生成器来轻松地决定这一点:-}您还可以轻松地为正则表达式编写简单的递归下降(LL(0))解析器;LL(0)是LR(0)。

我不知道像Perl这样的更复杂的所谓“ regexps”的语法是否像这样;但是Perl的正则表达式严格比正则表达式更强大,因此它们不是普通的正则表达式。

要确定语法是否具有某些属性,您必须运行某种谓词。若要确定是否为(S)LR(k),必须运行可以检查该属性的谓词。实际上,由于定义这些表的方式,任何这样的谓词实际上都必须构建解析表。


Perl正则表达式适用于NFA

问题不是关于Perl正则表达式如何工作的。这是关于(Perl?)正则表达式是否可以由某些技术解析的。我可以相信Perl正则表达式使用NFA进行匹配,以及其他一些上下文相关的数据捕获,但是我认为与这个问题无关。

3
-1正则表达式不是 LR(0)。LR(0)语言必须无前缀,但是正则表达式a|(aa)描述的语言不是无前缀的。此外,LR(0)语言无法处理带有epsilon的语法,因此常规语言{epsilon,a}不是LR(0)。但是,常规语言 LL(1),因为您可以将它们编写为常规语法,因此它们都是LR(1)。由于任何LR(1)语言都具有SLR(1)语法,因此这意味着所有常规语言都是SLR(1)。
templatetypedef

1
关于LL(0),这是另一回事:LL(0)语言是常规语言的适当子集。请注意,LL(0)表示您不必在不同的派生之间进行前瞻性确定-这基本上意味着没有任何决策,并且语言由单个单词组成。相反,LR(0)是有用的类-再次,您无需使用先行决策(此处用于缩减),但由于移位可以区分不同的生产,因此仍然存在一些多样性。

1
@ IraBaxter-正则表达式的语法也不是LR(0),因为正则表达式不是没有前缀的。它们也不是LL(0),因为LL(0)语言只能包含单个字符串(或没有字符串)。
templatetypedef
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.