我正在为我的计算语言测试而学习,并且有一个主意我无法解决。
我知道常规语法更简单,不能包含歧义,但是不能完成编程语言所需的许多任务。我还了解到,无上下文语法允许模棱两可,但是允许编程语言(例如回文集)需要一些必要的东西。
我遇到的麻烦是,通过了解常规语法非终结符可以映射到一个终端或一个非终结符,然后再一个终结符,或者上下文无关的非终结符可以映射到终端和非终结符的任何组合,来理解上述所有方法。
有人可以帮我把所有这些放在一起吗?
我正在为我的计算语言测试而学习,并且有一个主意我无法解决。
我知道常规语法更简单,不能包含歧义,但是不能完成编程语言所需的许多任务。我还了解到,无上下文语法允许模棱两可,但是允许编程语言(例如回文集)需要一些必要的东西。
我遇到的麻烦是,通过了解常规语法非终结符可以映射到一个终端或一个非终结符,然后再一个终结符,或者上下文无关的非终结符可以映射到终端和非终结符的任何组合,来理解上述所有方法。
有人可以帮我把所有这些放在一起吗?
Answers:
规则语法是右线性的或左线性的,而上下文无关的语法基本上是末尾和非末尾的任何组合。因此,您可以看到常规语法是无上下文语法的子集。
例如,对于回文式来说,
S->ABA
A->something
B->something
您可以清楚地看到回文式不能以规则的语法表示,因为它必须是左右线性的,因此不能在两面都具有非终结符。
由于规则语法是无歧义的,因此对于给定的非终结式语法只有一条生产规则,而在无上下文语法的情况下可以有多个规则。
A-> a | c
,B->b
那么该语法将允许使用非回文法。例如,我可以产生:S->ABA->aBA->abA->abc
。问题是我们不想在第一条规则中产生两个变量,而是两个终端。允许回文的语法的可能性是:S -> aSa | bSb | a | b
S -> aSa | e
并且a(aa)*a
都描述了常规语言。这表明CFG可以描述常规语言,即使它违反了左右线性关系。诚然,这是一个不那么明显的回文..
我认为您想考虑的是各种抽油烟。普通语言可以通过有限的自动机识别。上下文无关的语言需要一个堆栈,上下文相关的语言需要两个堆栈(这相当于说它需要一台完整的图灵机。)
因此,如果我们考虑常规语言的抽水式引理,那么它的本质就是将任何常规语言都可以分解为三个部分x,y和z,其中该语言的所有实例都为xy * z(其中*是Kleene重复,即y的 0个或多个副本。)您基本上有一个可以扩展的“非终结符”。
现在,上下文无关的语言呢?对于上下文无关的语言,有一个类似的抽取引理,它将语言的字符串分为五个部分uvxyz,其中语言的所有实例都在uv i xy i z中,且i≥0。现在,您有两个 “非终端” 只要您具有相同的编号,就可以复制或抽取。
常规语法与上下文无关语法的区别: (N,Σ,P,S):终端,非终端,产生式,起始状态终端符号
●正式语法定义的语言的基本符号
●abc
非终结符号(或语法变量)
●根据生产规则,用端子符号组代替
●ABC
常规语法:右或左常规语法右常规语法,所有规则均服从形式
离开常规语法,所有规则都服从形式
上下文无关文法(CFG)
○形式语法,其中每个生产规则的形式为V→w
○V是单个非终结符号
○w是一连串的终端和/或非终端(w可以为空)
常规语法:-包含产生式的语法为RG:
V->TV or VT
V->T
其中V =变量而T =终端
RG可以是左线性语法或右线性语法,但不能是中间线性语法。
众所周知,所有RG都是线性语法,但只有左线性或右线性语法才是RG。
常规语法可能是不明确的。
S->aA|aB
A->a
B->a
歧义语法:-对于一个字符串x,它们存在多个LMD或多个RMD或多个解析树或一个LMD和一个RMD,但两者都产生不同的解析树。
S S
/ \ / \
a A a B
\ \
a a
此语法之所以含糊不清,是因为两个语法分析树。
CFG:- 如果语法形式为CFG,则称为CFG:
V->@ where @ belongs to (V+T)*
DCFL: -我们知道所有DCFL都是LL(1)语法,所有LL(1)都是LR(1),所以它永远不会模棱两可。因此DCFG永远不会模棱两可。
我们也知道所有RL都是DCFL,因此RL永远不会模棱两可。请注意,RG可能不明确,而RL可能不明确。
CFL:CFL可能会或可能不会模棱两可。
注意: RL永远不会固有地含糊。
如果所有生产规则都具有以下形式,则语法是上下文无关的:A(也就是说,规则的左侧只能是单个变量;右侧是不受限制的,并且可以是终端和变量的任何序列)。我们可以将语法定义为4元组,其中V是有限集(变量),_是有限集(终端),S是起始变量,R是有限规则集,每个规则都是映射V
正则语法为右线性或左线性,而上下文无关的语法基本上是最终和非最终的组合。因此我们可以说规则语法是无上下文语法的子集。在这些属性之后,我们可以说上下文无关语言集也包含常规语言集
规则语法永远不会模棱两可,因为它要么是左线性的,要么是右线性的,所以我们不能为规则语法形成两个决策树,因此它始终是模棱两可的。但是除了规则语法之外,所有语法都可能是规则的,也可能不是规则的