如果我有Type 3语法,则可以在下推式自动机上表示它(无需对堆栈进行任何操作),因此我可以使用上下文无关的语言表示正则表达式。但是我是否可以知道类型3语法是否为,,等,而无需构造任何解析表?
如果我有Type 3语法,则可以在下推式自动机上表示它(无需对堆栈进行任何操作),因此我可以使用上下文无关的语言表示正则表达式。但是我是否可以知道类型3语法是否为,,等,而无需构造任何解析表?
Answers:
所有常规语言都有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
希望这可以帮助!
(简单地说)正则表达式语法(您说过“表示形式”)是LR(0)。您不需要任何前瞻即可解析表示正则表达式的字符串。您可以通过在正则表达式的语法上运行解析器生成器来轻松地决定这一点:-}您还可以轻松地为正则表达式编写简单的递归下降(LL(0))解析器;LL(0)是LR(0)。
我不知道像Perl这样的更复杂的所谓“ regexps”的语法是否像这样;但是Perl的正则表达式严格比正则表达式更强大,因此它们不是普通的正则表达式。
要确定语法是否具有某些属性,您必须运行某种谓词。若要确定是否为(S)LR(k),必须运行可以检查该属性的谓词。实际上,由于定义这些表的方式,任何这样的谓词实际上都必须构建解析表。
a|(aa)
描述的语言不是无前缀的。此外,LR(0)语言无法处理带有epsilon的语法,因此常规语言{epsilon,a}不是LR(0)。但是,常规语言是 LL(1),因为您可以将它们编写为常规语法,因此它们都是LR(1)。由于任何LR(1)语言都具有SLR(1)语法,因此这意味着所有常规语言都是SLR(1)。