第四章 语法分析——自上而下分析
- 格式:ppt
- 大小:103.50 KB
- 文档页数:15


第六章 研究学派与现代汉语语法
20世纪,语言学获得了长足的发展。1916年,费尔迪南•德•索绪尔的学生根据他生前的普通语言学课程讲稿整理出版了《普通语言学教程》。这部书开启了语言整体研究的新阶段。索绪尔成为现代语言学的重要奠基者,被后人尊称为“现代语言学之父”、“结构主义的鼻祖”。
1933年,布龙菲尔德出版《语言论》,宣告美国结构主义学派正式诞生。这部书制定了语言结构的基本原则和方法,成为该学派的理论指南,也成为此后20年间美国语言学家的必读书。 1957年,乔姆斯基的《句法结构》问世,它开创了探索人类语言普遍语法的新天地。乔姆斯基的理论是对当时居于美国主流地位的结构主义语言学的一大挑战。此后,乔姆斯基和布龙菲尔德成为两大对立学派的代表。其实这两个学派都注重对音义结合的语言符号系统的语言形式的研究,只是布氏结构主义着眼于具体的语言结构系统的分析,而乔氏语言学力求探索人类语言所共有的、高度概括而又十分简明的普遍规则。20世纪60年代中后期以后,逐步发展成为形式主义与功能主义两大学派的对立。两学派的基本区别如下:“形式主义认为语言学的中心任务是研究语法成分之间的形式关系,并不需要涉及这些成分的语义性质和语用性质。功能主义反对这样做,理由是形式必受意义影响,两者无法分开。这样来表述两者区别,基本上排除了存在与它们完全不同的第三条道路的可能性。”①
形式学派和功能学派不是简单的类别区分,它们内部也都还分有不同的流派。中国对外国语言学发展的关注在文革时期一度停滞,这也造成了我国学者长期以来对这两大学派的了解不够深入和细
① 徐烈炯《中国语言在十字路口》上海教育出版社,出版时间:2008年页码:203 致。因此,本章我们对当今两大学派只能做出大概的介绍,无法为读者提供过多的理论、方法与实例,只希望能让大家增加一些知识,扩大学术视野。
1.设有文法G[S]:
S→AB
A→bB|Aa
B→Sb|a
试消除该文法的左递归。
解:本题考查消除左递归的方法。
应用消除文法左递归的算法对文法G[S]消除左递归的过程如下:
(1) 将非终结符排序为:U1=S,U2=A,U3=B
(2) 进入算法排序:
i=1时,对文法无影响
i=2,j=1时:A→Aa有直接左递归,消去该直接左递归,得
A→bBA’
A’→aA’|ε
i=3,j=1时:改写文法,有
B→ABb|a
j=2时:改写文法,有
B→bBA’Bb|a无左递归。
(3) 所以文法G[S]消除左递归后变为:
G’[S]:S→AB
A→bBA’
A’→aA’|ε
B→bBA’Bb|a
2.设有文法G[E]:
E→Aa|Bb
A→cA|eB
B→bd
试按照递归子程序法为该文法构造语法分析程序。
解:本题考查递归子程序的构造方法。
首先判断文法是否满足递归子程序法对文法的要求,然后再构造递归子程序。
因为:
(1) 该文法无左递归。
(2) 文法的产生式E→Aa|Bb和A→cA|eB的右部有若干选项,判断这两条产生式右部各候选式的终结首符号集合是否两两互不相交。
对产生式E→Aa|Bb,有
FIRST(Aa)∩FIRST(Bb)={c,e}∩{b}=ø
对产生式A→cA|eB,有
FIRST(cA)∩FIRST(eB)={c}∩{e}=ø
文法中其他产生式都只有一个非空ε的右部。
综合(1)、(2),该文法可以采用自上而下分析方法进行语法分析而不会出现回朔和无限循环。
下面为该文法的每一个非终结符号构造递归子程序。
假设用READAWORD代表读下一个单词。用P(E)、P(A)、P(B)分别表示非终结符号E、A、B对应的子程序名。约定输入符号串以“#”作为输入结束符。
P(E)的递归子程序为:
PROCEDURE P(E);
BEGIN
IF WORD IN FIRST(Aa)
第四章 现代汉语句法分析
句法分析:找出句法结构中的句法成分、指明成分中词语类别和词、语、句的整体类型或格式等,也就是对语法单位与语法单位之间的语法关系和语法单位的类型的分析。
语言对每个人都十分重要。每个人都会感觉语言十分熟悉,因为人们自懂事以来,就一直在用语言来传递信息,接受信息;用语言来学知识、学文化;用语言来跟他人交往;用语言来巩固自己的认识成果……但是我们也不得不承认,语言又是陌生的,因为人们对语言,说实在的,了解得太少太少了,语言中任何一种现象,我们至今还难以给它作出十分明确而圆满的解释与说明。所谓“句法分析”,如本章开头所说,是指从句法的角度来解释说明种种语言现象。譬如说,为什么“咬死了猎人的狗”有歧义,而“咬死了猎人的鸡”没有歧义?“屋里放着鲜花”和“屋里跳着舞”,词类序列相同,都是“处所短语+动词+着+名词”,但是人们会明显地感到,前者表示存在,表静态,后者表示活动,表动态。人们的这种感觉对吗?为什么会有这样的差别?为什么我们可以说“温柔点儿!,“开心儿!”,但不能说“崇高点儿!”“伟岸点儿!”?这为什么?怎样解释这种现象?同样,为什么我们可以说“能人了” “老夫老妻了”,但似乎不说“战士了”“实习生了”“婴儿了”?这又为什么?怎样解释这种现象?再譬如,“打猎的猎人”和“打猎的工具”都是“定一中”偏正结构,而且都是由“打猎的”作定语。但是,前者在一定的语境里,中心语“猎人”可以省去不说,如“打猎的还没来”;后者中心语“工具”则在任何语境里都不能省去,“打猎的工具找不着了”,不能说成“*打猎的找不着了”。这是为什么?怎样来解释这种现象?诸如此类的问题多了。为了解释说明这些饶有趣味的现象,我们就得想出一些分析方法来,并尽可能从理论上来加以说明。从句法的角度来解释说明种种语言现象的分析方法,有常用的一些句法分析法,包括变换分析法,层次分析法,语义指向分析法。
第一节 层次分析法研究
实习二 语法分析-自上而下分析
一、 实验目的
使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。
二、 实验内容
1. 设计表达式的语法分析器算法(使用预测分析)
2. 编写一段代码并上机调试查看其运行结果
三、 实验要求
使用LL(1)分析算法设计表达式的语法分析器
LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。
实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。
预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。
1. 若X=a=“#”,则宣布分析成功,停止分析过程
2. 若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一个输入符号。
3. 若X是一个非终结符,则查看分析表。
四、 运行结果 (本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析)
五、 源程序实现
/*LL(1)分析法源程序,只能在VC++中运行 */
#include
#include
#include
#include
char A[20];
char B[20];
char v1[20]={'i','+','*','(',')','#'};/*终结符 */
char v2[20]={'E','G','T','S','F'};/*非终结符 */
int j=0,b=0,top=0,l;/*L为输入串长度 */
typedef struct type
{
char origin;/*大写字符 */
char array[5];/*产生式右边字符 */
int length;/*字符个数 */