编译原理:第三节

来源:互联网 发布:define宏定义与数组 编辑:程序博客网 时间:2024/04/28 15:26

形式语言与自动机原理

什么是语言?

我们知道世界上存在很多种语言:我们可以把他们分为自然语言(人们日常交流的工具)和程序设计语言。自然语言复杂且难以描述,程序设计语言结构规整,便于处理。
但两者又有共性,即核心都由语法和语义两部分组成。那什么是语言呢??
首先来看一下字母表定义:字母表是元素的非空有穷集合。字母表包含了语言中允许出现的全部符号。例如:英语的字母表包含了英文字母,数字,标点符号等。C语言的字母表
是一切可打印字符组成的集合。
给出语言的定义:语言是确定其字母表上字符串的任何集合。例如:C语言就是符合C语法的程序组成的集合。

什么是文法?

想要分析语言,就要知道语言的结构,文法就是一种能够用有限规则来展现出语言的结构的形式。文法可以说是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),我们熟知的正则表达式也是文法的一种形式。
一个文法G是一个四元组:G= ( VN,VT,S,P )
VN:非终结符号(或语法实体,或变量)集
VT::终结符号集,组成语言的不可再分的基本符号集
S:文法的开始符号或识别符号,亦称公理
P:产生式集,即文法的规则。其形式为a—> β
例如:设有语句 ”  小孩子吃大西瓜 "
其汉语文法可表示为:
VN = { 句子,主语,谓语,宾语,形容词,名词,动词 }
VT = {小,大,孩子,西瓜,吃 }
S = 句子
P = {
<句子> —> <主语> <谓语>
<主语> —> <形容词><名词>
<谓语> —> <动词><宾语>
<宾语> —> <形容词><名词>
<形容词> —> 小 | 大
<名词> —> 孩子 | 西瓜
<动词> —> 吃
}

什么是推导?

我们用符号 => 来表示直接推导。依照上面给出的例子,有:
<句子>  =>  <主语> <谓语>
     =>  <形容词><名词><谓语>
     =>  小 <名词><谓语>
     =>  小孩子<谓语>
     =>  小孩子<动词><宾语>
     =>  小孩子吃<宾语>
     =>  小孩子吃<形容词><名词>
     =>  小孩子吃大<名词>
     =>  小孩子吃大西瓜    //至此,所得到的符号串都由终结符组成,即产生了语言的一个字符串
最左推导:在推导过程中,总是对字符串中最左边的非终结符进行替换
最右推导:在推导过程中,总是对字符串中最右边的非终结符进行替换
上面的例子就是最左推导,如果我们先对谓语进行替换。。。依次取最右边的进行替换就成为了最右推导。
例:已知文法:G [ S ] :S  —> dAB
    A  —> aA | a
    B  —> b
        求G [ S ] 产生的语言是什么?
解:
=> dAB => dab
 或 => dAB => daAb => daab
 或 => dAB => daAb => daaAb => daaab
...........
最后得到 danb  (a的n 次方) 其中 n 为大于等于1 的整数

什么是语法分析树?

语法分析树的每个中间结点都标记着非终结符,每个叶子结点都标记着终结符。语法分析树的每一棵子树都描述了句子中一个抽象的实例。
例如:A = B * (A + C )的语法分析树为:

其实我们在上面进行的推导过程的每一步都可以用一棵分析树来表示。例如对于上面的 => dAB => dab 用语法树来表示:

什么是二义性?

在自然语言中,我们经常碰到二义性。在汉语中对于一个句子断句不同都会产生各种歧义,这也是汉语难以成为计算机程序设计语言的原因之一。下面给出二义性的形式化表示:
对文法G,如果至少存在一个句子,对应两棵(及以上)不同的分析树,则称该句子是二义性的。也可以这样定义:若文法中存在某个句子,它有两个不同的最左(右)推导,则这个文法是二义的。
例如:
对于G [ S ] : S—> AB
    A—> a
    B—> b
其分析树一样,即不存在不同的分析树,所以其不是二义性的。





0 0
原创粉丝点击