我正在为我的计算语言测试学习,有一个概念让我难以理解。
我知道正则语法更简单且不能包含歧义,但无法处理编程语言所需的大部分任务。我也知道上下文无关语法允许歧义存在,但可以处理编程语言中一些必要的东西(如回文)。
我不明白的是,如何通过知道正则语法非终结符可以映射到终结符或终结符和非终结符的组合、或者上下文无关语法非终结符可以映射到任意终结符和非终结符的组合,来推导出上述所有内容。
能否有人帮助我将所有这些内容整合起来?
我正在为我的计算语言测试学习,有一个概念让我难以理解。
我知道正则语法更简单且不能包含歧义,但无法处理编程语言所需的大部分任务。我也知道上下文无关语法允许歧义存在,但可以处理编程语言中一些必要的东西(如回文)。
我不明白的是,如何通过知道正则语法非终结符可以映射到终结符或终结符和非终结符的组合、或者上下文无关语法非终结符可以映射到任意终结符和非终结符的组合,来推导出上述所有内容。
能否有人帮助我将所有这些内容整合起来?
正则文法要么是右线性的,要么是左线性的,而上下文无关文法基本上是终结符和非终结符的任意组合。因此您可以看到,正则文法是上下文无关文法的子集。
因此,例如回文就是这种形式:
S->ABA
A->something
B->something
很明显,回文串不能用正则语法表示,因为它必须是右线性或左线性的,因此不能在两侧使用非终结符。
由于正则文法是无歧义的,对于给定的非终结符只有一条产生式规则,而在上下文无关文法的情况下可以有多个产生式规则。
正则文法:包含以下产生式的文法是RG:
V->TV or VT
V->T
其中V代表变量,T代表终端
RG可以是左线性文法或右线性文法,但不是中间线性文法。
我们知道所有的RG都是线性文法,但只有左线性或右线性文法才是RG。
正则文法可能是有歧义的。
S->aA|aB
A->a
B->a
歧义语法:对于一个字符串x,可能存在多个左最深推导或多个右最深推导或多个解析树或一个左最深推导和一个右最深推导但是它们产生不同的解析树。
S S
/ \ / \
a A a B
\ \
a a
V->@ where @ belongs to (V+T)*
DCFL:- 我们知道所有的DCFL都是LL(1)文法,而所有的LL(1)文法都是LR(1),因此它永远不会有歧义。因此,DCFG永远不会有歧义。
我们还知道所有的RL都是DCFL,所以RL永远不会有歧义。请注意,RG可能存在歧义,但RL不会。
CFL: CFL可能有歧义,也可能没有。
Note: RL从本质上来说永远不会有歧义。
正则表达式
上下文无关文法
如果所有的产生式规则都具有以下形式:A (即,产生式规则的左侧只能是一个变量;右侧没有限制,可以是任何终结符和变量序列),则语法是上下文无关的。
我们可以将语法定义为一个四元组,其中V是一个有限集(变量),T是一个有限集(终结符),S是起始变量,R是一组有限规则,每个规则都是一个映射V
。
正则语法要么是右线性的,要么是左线性的,而上下文无关语法基本上是终结符和非终结符的任意组合。因此,我们可以说正则语法是上下文无关语法的子集。
在这些属性之后,我们可以说上下文无关语言集也包含正则语言集。
基本上,常规语法是上下文无关语法的一个子集,但我们不能说每个上下文无关语法都是一般语法。主要的上下文无关语法是有歧义的,而常规语法可能也是有歧义的。
一个正则文法从不会有歧义,因为它要么是左线性的,要么是右线性的,所以我们不能为正则文法制作两个决策树,因此它总是无歧义的。但除了正则文法之外,其他文法可能是正则的也可能不是。
A->a | c
和B->b
,那么这个语法允许非回文字符串。例如,我可以生成:S->ABA->aBA->abA->abc
。问题在于我们不想在第一条规则中生成两个变量,而应该是两个终结符。一个允许回文字符串的语法可能是:S -> aSa | bSb | a | b
。 - gdiazcS -> aSa | e
和a(aa)*a
都描述了一个正则语言。这表明,即使违反左线性或右线性,CFG也可以描述正则语言。不可否认,这是一个不太明显的回文。 - Martijn