文法相关

来源:互联网 发布:无用神力兄弟会 知乎 编辑:程序博客网 时间:2024/05/01 05:58

0.文法
文法即语言中的每个句子可以用严格定义的规则来构造.
多用在编译程序和语言处理等领域,例如在编译程序中,根据一些指定的规则,来确定编程语言的语法,从而实现编译器的功能。
E -> T+E | T-E | T
T -> F*T | F/T | F
F -> (E) | i
它可以推导出任何一个算述表达式,例如这样一个表达式(i + i) * i,可以通过如下的文法推导获得:
E => T => F * T => (E) * T => (T + E) * T => (F + E) * T => (i + E) * T => (i + T) * T => (i + F) * T => (i + i) * T => (i + i) * F => (i + i) * i
文法形式
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。
文法分类
自从乔姆斯基(Chomsky)于1956年建立形式语言的描述以来,形式语言的理论发展很快。这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
乔姆斯基把文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别在于对产生式施加不同的限制。
多数程序设计语言的单词的语法都能用正规文法或3型文法来描述。
3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。

1.乔姆斯基文法
乔姆斯基文法体系共分为4类:
0型文法:也叫短语结构文法或无限制文法,其描述能力相当于图灵机,可使用任何的语法描述形式;
1型文法:也叫上下文有关文法,其描述能力相当于线性有界自动机,语法形式如下:
xSy -> xAy
也就是说,S推导出A是和上下文x, y相关的,即S只有在上下文x, y的环境中才能推导出A;
2型文法:也叫上下文无关文法,其描述能力相当于下推自动机,语法形式如下:
S -> A
S可以无条件的推导出A,和上下文无关,上下文无关文法因此得名;
3型文法:也叫正则文法,等价于正则表达式,其描述能力相当于有穷自动机,语法形式如下:
S -> Aa
其中最后一个a必须为非终结符。

2.正则文法和上下文无关文法
对于文法G=(V, T, S, P),如果产生式的形式如下:
A -> xB
A -> x
其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:
A -> Bx
A -> x
则称为左线性文法。右线性文法和左线性文法统称为正则文法。
正则表达式的表达能力等价于正则文法,正则表达式的定义如下:
字母表中的任意字母是正则表达式,空串和空集也是正则表达式;
如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。
正则表达式的扩展:
r+:一个或多个重复
. :任意字符
[a-z]:字符范围
[^abc]:不在给定集合中的任意字符
r?:可选
正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。
像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。
BNF的元符号:

::= 表示“定义为 ”,有的书上用–>
| 表示“或者”
< > 尖括号用于括起非终结符。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(”)引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
BNF的扩展EBNF:
可选项被括在元符号“[”和“]”中
重复项(零个或者多个)被括在元符号“{”和“}”中
仅一个字符的终结符用引号(”)引起来,以和元符号区别开来
上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。
如上所述,上下文无关文法的递归性,对其分析方法也有很大影响。首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。
在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。
如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:
U =>* xUy
那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

0 0
原创粉丝点击