一种高效的通用型自然语言语法分析器系统设计

一种高效的通用型自然语言语法分析器系统设计
一种高效的通用型自然语言语法分析器系统设计

第36卷 第6期厦门大学学报(自然科学版)V o l.36 N o.6 1997年11月Jou rnal of X iam en U n iversity(N atu ral Science)N ov.1997 

一种高效的通用型自然语言语法

分析器系统设计①

李堂秋 卢 伟

(厦门大学计算机科学系 厦门 361005)

摘要 阐述一个基于合一算法的高效的通用型语法分析器系统的设计原理和方法.着重说明:一种基于功能文法的语法规则的表示形式;基于树的合一算法的原理及其分析;以及如何使系统既具有运行的高效性又具有调试的方便性的总体设计方案.

关键词 机器翻译,语法分析,辞典功能文法,功能合一文法,树的合一算法

中国图书分类号 T P311.11

大多数实用自然语言处理系统都需要一定形式的语法处理器,特别是基于知识的机器翻译这样大规模的应用系统需要对所处理的文本有一定程度的理解,才能保证翻译的高质量.这就要求对原文语句的语法和语义做系统分析.

为此,需要有高效的和使用方便的语法分析器,它要满足一定的要求:

1)它在不同的语言之间要有通用性.也就是说,它能处理多种语言而不是一种特定的语言,处理不同的语言只需配上相应语言的语法规则.而且规则是描述性的,使得设计各种语言的语法规则远比整个系统的重新设计容易得多.

2)这种语法分析器应当是多用途的,它不仅可以用于机器翻译本身,而且可以用于多种多样的自然语言处理系统,如数据库和专家系统的自然语言接口等.

3)不同语言的语法不同,其语法和语义的依赖关系也不同.通用型语法分析器应使语法设计者可根据情况,方便地把语法、语义和词典等不同知识源以适当方式组合.

4)不管是语法、语义还是辞典的知识,表示的明晰性和符合语言学表示的规范是非常重要的.这种规范的表示方法容易为用户特别是语言学家所理解和使用.

5)系统运行的高效性是评判一个系统优劣的最主要的指标之一,特别是许多应用系统都有很强的实时性要求,象交互式的机器翻译,数据库和专家系统的接口等都要求系统在一定的时间内做出实时的响应.

本文阐述如何设计一个基于合一算法的通用型语法分析器,使之尽可能同时满足上述诸多要求.基本思路和做法是:在基于条件归结的短语结构文法的语法分析器[1]的基础上引进功能文法的表示形式和基于合一算法的运行机制.这样不仅保持了原有系统的高效灵活的特性,而且使系统表示的形式化更好,更符合计算语言学的表示规范.系统分为调试与运行两个部分,相互配合,使系统使用方便.

①本文1997203225收到; 福建省自然科学基金资助项目

1 句子语法结构知识的表示

用功能文法的表示形式表达句子的结构.它的基本原理是用句子成分的语法功能来描述句子的结构关系.它与一般句子结构的语法树形式最主要的不同之处是它更注重句子成分在句中的语法功能而不是位置关系.语法界普遍认为这种表示形式更具有一般性,它适合于各种语言,不管这种语言的语序关系在这种语言中的作用大小.当前世界上比较著名的功能文法主要有功能合一文法[3],词典功能文法[4]和词头驱动的功能文法[5]等.它们在句子成分功能分析的侧重点和分析方法上有所不同,但在语法结构的表示形式上都着重句子成分的功能的表达.考虑到表示的明晰性和实现的高效性,我们在句法知识表示方面采用词典功能文法的表示方法,而在文法分析方面采用功能合一的算法机制.

根据词典功能文法理论,句子句法表示分两个层次,一个层次是成分结构即C 2结构,另一个是功能即F 2结构.C 2结构相当于上下文无关文法的语法树,大部分读者对此比较熟悉,这里不再赘述.F 2结构可用如下的BN F 公式表示:

 ::=

::=(3)

::=()

::=

::=

::=

::=::=

::=(3o r 33)

::=(3m u lti p le 33)

::=(3no t 33)

这里的是一个句子或短语中各有关成分的语法功能名,如sub j ,ob j ,m ood ,roo t ,cat ,

num ber 等,而是这些功能的对应值

.值可以是原子,字符串,或复杂的表达式,如F 2结构.因此F 2结构是递归定义的,它可以嵌套到任意的层次.从结构上看,它是非常一般化的框架表达式,除了可以表示F 2结构以外,也可以表示语义框架等具有框架结构的知识,这就大大地增加了这种表示方法的灵活性.

下面给出一个例句(T he car is parked on the street .)的F 2结构:

 ((roo t "p ark ")(cat v )(m ood dec )(valence tran s )(p assive +)

(sub j ((roo t "car ")(num ber sg )(cat n )

(det ((roo t "the ")(cat det )))))

(pp ((cat p )(roo t "on ")

(ob j ((roo t "street ")(cat n )

(det ((roo t "the ")(cat det )))))))))

?

038? 厦门大学学报(自然科学版) 1997年

2 语法规则的一般形式

本系统的语法规则基本上采用词典功能文法规则的表示法,它包含两个部分:首先是一个上下文无关文法规则,紧接着的是一系列语法功能具体化方程式

 (lh s <==(rh s 1rh s 2...rh sn )

(equati on 1equati on 2...equati onm ))

lh s 是上下文无关文法的左部非终结符,箭头<==是规则的一部分,表示归结的方向,括在一对括号中的rsh 1,...,rshn 是上下文无关文法规则的右部非终结符或特殊符号%,equa 2

ti on 1,...,equati onm 是一组括在另一对括号内的语法功能具体化方程式

.这里的方程式与词典功能文法的语法功能具体化方程式非常相似,只不过它用x 0,

x 1,...,xn 代替词典功能文法语法功能方程式中的上下箭头

.x 0代表上箭头,即上下文无关文法的左部非终结符所代表的语法功能结构.x 1代表右部第一个非终结符号处的下箭头,x 2表示右部第二个非终结符号处的下箭头,以此类推.这种表示方法与PA TR 2II [6]和General 2

ized L R Parser [7]等采用的表示方法基本相同,下面是语法规则的一个简单例子:

(<==()

(((x 1case )=nom inative )

((x 1agr )=(x 2agr ))

((x 0sub j )=x 1)

(x 0=x 2)))

可以看出,每一个方程式的结构如下

1)方程式的左边即第一项是一个路径,一个路径是:一个变量(即x 0,x 1,...,xn 等);或一个变量后跟任意个表示语法功能或特征的标识符,如x 0的主语(x 0sub j ),x 1的一致性特征(x 1agr ),x 2的句子补足语的主语(x 2xcom p sub j )等.

2)方程式中的等号表示方程式的左边与右边要进行合一运算.

3)方程式的左边即第三项可以是如下的结构:

一个路径;或一个带引号或不带引号的字符串;或一个F 2结构;或一个表结构,它的第一项是宏运算符,后跟任意个标识符或F 2结构,如(3o r 3p ast p astp artici p le )等,在采用树的合一算法时(见第5节),右部甚至可以是任意合法的lisp 表达式值.

这些方程式的作用有两个,一是检查上下文无关文法右部各短语所对应F 2结构是否符合特定的语法约束,如上述的((x 1case )=nom inative ),((x 1agr )=(x 2agr )).前者检查x 1即的F 2结构的格是否是主格,后者检查x 1与x 2,即的F 2结构的人称和数是否相同.只要这些约束条件有一个没能得到满足,这条规则就无法成功地归结而放弃.因此方程式可以用以防止不正确的归结和不正确中间结果的生成.另一个作用是把右边所代表的短语的功能结构与左边所代表的短语的功能结构相合一,建立适当共享的F 2结构.如上述的((x 0sub j )=x 1)和(x 0=x 2),前者将的F 2结构中的sub j 的特征值与x 1值相合一,后者把的F 2结构与的F 2结构相合一.合一是求出等号左右两边表达式特征结构的并集的过程.合一过程的结果无非有两种,一种是成功,一种是失败:当等号左右两边表达式特征结构可合一(兼容)时合一成功,生成两个特征集合的并集.当等号左右两边表达式特征结构不可合一(不兼容)时合一失败,所以上述的约束和构造两个作用都可以用合一这个统一的算法过程来实现(详见第4节),这是功能合一文法算法漂亮之处.

?138?第6期 李堂秋等:一种高效的通用型自然语言语法分析器系统设计

图1

 系统结构原理图

F ig .1 T he A rch itecture of the system

3 通用语法分析器的结构

通用的语法分析器是一种多用途语法分析器,适用于多种语言和多种领域.不同语言分析时需要有不同的语法知识,不同的应用领域往往有自身的特殊语法规定,为了保证系统的通用性和可扩充性,通用的语法分析器不把某一种特定的语法做死在语法分析器中,而把按一定法则书写的任何一种语言的语法规则作为一种输入数据,不同的输入就使系统具有不同的分析功能.如果从专家系统的观点看,通用的语法分析器实际上是专家系统的一种框架,当输入不同领域的专家知识时,它便成为了那个领域的专家系统.

这个系统能接受的语法规则的书写格式如第2节所述.由于这种规则表达能力强,可读性好,书写和修改语法规则都非常容易.任何熟悉词典功能语法的人经过短期的学习和训练都容易掌握使用.不过直接使用这些规则,系统运行效率可能会很差.实用的系统既要求好的调试的功能又要求高的运行效率.如图1所示,为了协调这两个矛盾的需求,主要采用如下措施:

1)对语法进行多级编译.L FG 规则是建立在lisp 之上的一种提供人类使用的抽象语言,不太适于机器的直接运行.为了形成高效的可运行系统,本系统采用多级编译的方法.首先,第一级编译将每一条L FG 规则编译成一条扩展的上下文无关文法规则,将规则原有的一组方程式编译成可执行的lisp 程序.这种格式可直接作为系统调试环境的输入.为进一步提高效率,这种格式可用第二级编译器即上下文无关文法编译器生成扩展的L R 语法分析表,其结果可作为运行环境的输入,以便对输入文句进行高效的分析.最后一级,可用lisp 程序编译器对整个系统进行编译,进一步提高系统的运行效率.

2)把系统分成调试环境和运行环境,根据环境的不同要求分别采用不同算法.最后形成的系统采用一种适用于自然语言语法分析的高效算法,通常称Tom ita 算法[8].Tom ita 算法是一种L R 算法,为了提高系统在线分析的运行效率,必须预先生成L R 分析表.由于应用系统的语法规则多,生成分析表往往需要很长的时间.当有一条规则要修改时,所有的规则都要从新编译.虽然有一定的措施可避免全部语法规则的重新编译,但部分的编译仍需相当长的时?

238? 厦门大学学报(自然科学版) 1997年

间.这对于语法调试是非常不方便的.因此,本系统将整个系统分成调试环境和运行环境两个部分.调试环境采用与Tom ita 算法相类似的算法,称为自上而下的活动图语法分析,这种算法是以E rlay 的算法[9]为基础的.它与Tom ita 算法最根本不同之处是它不预先生成分析表.这样当一条规则修改以后,我们只要对这条被修改的规则进行单独编译处理.这就避免了

Tom ita 算法由于某一条规则的修改不得不对所有的语法规则进行从新编译的问题

.系统在调试时使用调试环境,只有当所有的规则工作正常以后再进一步编译,转入运行状态.

4 规则的编译与树的合一算法

语法规则中的一组功能具体化方程式要编译成lisp 程序,才能在语法规则归结时正确地执行.编译时要把每一个方程式编译成等号左右两边功能表达式的合一运算.方程式与方程式之间是与的关系.所以运算的顺序是从上到下或从左到右对方程逐一合一求值.如果有一个合一运算失败则整个运算失败,否则依次运算直到成功.所以整个运算的基础是合一算法.传统的基于合一的文法理论使用的是一种图合一算法[6].它使用一种称为无环路的有向图来表示语言学知识.图合一的结果往往导致图结构的共享,不同部分的图共享一个子图也就意味着多个节点可能指向同一个节点,即引起节点的重进入问题.图的共享还导致与此相关的其他问题,这些问题使得图合一算法效率低,很难实用.例如

1)在可重入的图中进行合一时,在建立节点的等价类时需要检查两个图的所有节点等价关系,这使得可重入的图的合一是一个代价非常高的操作.

2)合一的过程是一个破坏性的操作,为了保存回溯的现场,在合一中需要经常拷贝F 2结构.而拷贝F 2结构使得图的合一在时间和间上的开销都很大.

3)结构中或规则中往往带有析取关系,有人指出,在含有析取关系时,图合一是一个N P 2完全性问题[10,11].

本系统采用一种树的合一算法.这种算法是用树表示F 2结构,所以合一的对象是树而不是图.树是有向图的一种特例,树中不可能有多个节点指向同一个节点,也就没有重进入的问题,树的合一算法过程要比图合一简单的多,从而克服了图的合一算法中影响运算效率的主要问题,下面是这种树的合一算法的描述:

树的合一算法(T 1,T 2)

a )如果T 1为空,返回T 2;否则,如果T 2为空,返回T 1

b )如果T 1,T 2均为叶结点且相等,返回T 1

c )否则,如果T 1,T 2中有一个为叶结点,返回3FA I L 3

d )那么,T 1与T 2均为非空树

d 1)求出T 1与T 2中共同具有的弧的集合S 1

d 2)求出仅在T 1中或仅在T 2中出现的弧的集合S 2

d 3)建立一个新结点N

d 4)对于S 1中的每一条弧C ,执行

d 4.1)求出弧C 在T 1中的对应结点N 1

d 4.2)求出弧C 在T 2中的对应结点N 2

d 4.3)递归调用树的合一算法于N 1,N 2得结果R

d 4.4)如果R 为3FA I L 3返回3FA I L 3,否则从N 到R 建立弧线C

d 5)对于S 2中的每一条弧C ,执行

?338?第6期 李堂秋等:一种高效的通用型自然语言语法分析器系统设计

从N 到C 在对应树上所指向的结点(假定为X )之间建立弧C

d 6)返回N

从上述树的合一算法可以看出,树的合一在效率方面带来了很多的好处.例如,由于参加合一的是树结构,没有重进入问题,当一个分支仅出现在一个树中时,就不必象图合一中一样要对它进行遍历,因为这两个树绝对不会因为这个子树的合一而产生任何联系.避免了遍历无疑会减少合一中的开支.再者,在图的合一中,有比较简单的减少拷贝的优化算法可以判断是否需要拷贝.如果其中一棵树的分支不在另一棵树中出现的话,这个分支就不必拷贝,因为这个分支在后来的合一中绝不会受到影响的.

另一方面,F 2结构中析取结构的合一也比较容易处理.在遇到析取项时,可以把两边析取项的成员一一交叉配对,然后对每一对分别调用树的合一算法过程,再把所有成功的合一过程的返回值合起来做为析取项返回.它是可解的,而且不需要有更复杂的处理机制.可见采用树合一算法,可以使图合一算法中的几个主要的困难问题都得到解决.

但是必须指出,树的合一与图的合一结果有时不一定完全相同.在图的合一中,由于结构共享,整个方程式组的执行的结果与方程式的执行顺序无关,这是这个算法优点.而树的合一,无结构共享,整个方程式组的执行结果与方程式的执行顺序有关.为了得到正确结果,在树的合一中要注意方程式的排列顺序.对此,必须加以注意.尽管树的合一算法有过程性特点,但仍不失为一种实用的合一算法.只要我们对它的特点有充分理解并加以合理利用,反而会改善系统的运行效率和灵活性.实践表明,这正是大型系统所需要的.

5 系统的实现,特点与将来的努力方向

这个系统是在XMM T 原有的CR PSG [1]框架上发展起来的,它引进了L FG 语法的功能具体化方程式和基于树的合一的算法机制.同时还增加了系统的调试环境,使系统更趋完善.整个系统用Comm on L isp 语言实现,可以运行于任何具有Comm on lisp 语言环境的机器上,其中包括486以上的微型机.它是通用型的语法分析器,只要配上不同的语法,就可以适用于多种语言和多种应用领域的语法分析器.当前已经应用在基于知识的英汉机器翻译的实验性系统中.并正在进行汉英机器翻译系统的试验研究.

另一方面,系统采用的L FG 的F 2结构的表示框架是fram e .由于fram e 是一个非常通用的表示形式,它适合于表示语义文法等其他语法.这使得这个系统具有很大的灵活性,因为有些象中文这样的语言,句子结构与句子的语义有着非常紧密的联系,是否可能从句子的分析直接得出句子的语义关系而不是先得出语法关系再映射成语义关系?答案只在于你能否找出句子的表层结构与语义的直接映射关系而不在于语法生成器本身.

这个系统的另一个重要的特点是它既可以生成以词为输入单位的语法分析系统,也可以生成以字符为单位的系统.这对于象中文,日文等一些没有明显词边界的语言的处理有着特别的重要意义.在以字为输入单位的语法分析系统里,分词,词形分析和语法分析等步骤可以结合起来.使这些语言的处理非常方便.

将来的研究方向有两个:一个是如何利用句子以外的上下文的知识;另一个是如何应用语言学的统计知识.当前的系统只能处理孤立的简单句或复杂句,只能利用本句中上下文约束关系,但利用句子以外的上下文知识十分重要.例如,在句子中代词指代关系和句子省略成分的消解以及歧义消解都需要句子以外的上下文知识.

如何利用统计知识是另一个重要问题,例如词的搭配关系知识有一定的统计规律.现在有?

438? 厦门大学学报(自然科学版) 1997年

大量的联机文献可用,可以用统计得到一些词共现频度的数据以代替手工的方法.不过这两个问题的解决,不仅需要特殊的语法规则设计,而且需要系统控制机制的调整.

本论文是在福建省自然科学基金资助项目F 94017研究基础上写成的,由第一作者执笔,感谢蔡经球教授阅读了全文并提出宝贵的意见.感谢课题组其它成员的共同努力.

参 考 文 献

1 李堂秋,高庆狮,倪子伟等.一种基于机器翻译系统的高效语法分析器.见:陈肇雄主编.中国的机器翻译

研究与发展.1990:155~161

2 李堂秋,高庆狮,倪子伟.X MM T 英汉机器翻译系统.中文信息学报,1992,6(3):21~26

3 Kay M .Functi onal unificati on gramm ar :a fo r m alis m fo r m ach ine translati on .In :10th International Con 2

f erence on Co m p u tational L in

g u istics ,Stanfo rd ,1984,July :75

~784 B resnan J ,Kap lan R .L exical 2functi onal gramm ar :a fo r m al system fo r gramm atical rep resentati on .T he M ental R ep resentation of G ramm atical R elations .Cam bridge ,M assachusetts :M IT P ress ,1982:1732281.5 Kay M .H ead 2d riven p arsing ,p roceed ing s of the f irst international w orkshop on p arsing technolog ies ,Carnegie 2M ellon U niversity ,1989

6 Sh ieber S .A n introducti on to unificati on 2Based app roaches to gramm ar .In :CSL I L ectu re N otes .Stan 2fo rd ,CA :Ch icago U niversity P ress ;1986,4

7 Tom ita M ,Carbonell J .T he universal parser arch itecture fo r know ledge based m ach ine translati on .In :P roceed ing s of 10th International J oint Conf erence on A rtif icial Intellig ence ,M ilano ,1987

8 Tom ita M .Ef f icient p arsing f or natu ral lang uag e .H ingham ,M assachusetts :K luw er A cadem ic Publish 2er ,1986

9 Earley J .A n efficient context 2free parsing algo rithm .Co mm unications of A CM ,1970,13:94~10210 Rounds W ,Kasper R .A comp lete logical calculus fo r reco rd structures rep resenting linguistic info r m a 2

ti on .In :P roceed ing s of the IE E E S ym p osium on L og ic in Co m p u ter S cience ,1986

11 Kasper R ,Rounds W .A logical sem antics fo r feature structures .In :P roceed ing s of the 24th A nnual

Conf erence of the A ssociation f or co m p u tational L ing u istics ,1986

A General Pu rpo se Parser Generato r fo r N atu ral L anguage

P rocessing Based on Functi onal U n ificati on

L i T angqiu L u W ei

(D ep t .of Co m p u .S ci .,X iam en U n iv .,X iam en 361005)

A bs tra c t A design schem e fo r a general pu rpo se parser generato r is p resen ted .

T he p rinci p le of the system design is based on the fo r m alis m of L ex icon Functi onal Gramm ar and a T ree U n ificati onal algo rithm .To strengthen the functi onality of the system ,the sys 2tem is divided in to tw o sub system s in th is design :a testing environm en t and operati onal en 2vironm en t ,bo th of w h ich adop t si m ilar bu t differen t con tro l schem es ,so that they can ob 2

tain differen t design goals at the sam e ti m e keep their coop erati on very w ell

.Ke y w o rds M ach ine tran slati on ,Parsing ,L ex icon functi onal gramm ar ,Func 2

ti onal un ificati on gramm ar ,T ree 2un ificati on ?538?第6期 李堂秋等:一种高效的通用型自然语言语法分析器系统设计

语法分析程序的要求

语法分析程序大作业 一、作业目的和要求 通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如LL(1)、递归下降分析法、LR、算符优先分析法)等,作为编制语法分析程序的依据,对词法分析器所提供的单词序列进行语法检测和结构分析,实现并进一步掌握常用的语法分析方法。 二、作业内容 选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象(例如表达式、if、while、for等等),给出其文法规则描述(注意,文法规则的描述要符合所选分析方法的要求,比如用LL(1)分析法,文法必须是LL(1)文法),设计并实现一个完整的语法分析程序。 输入:源程序以文件的形式输入。 输出:对于输入的源程序,如果输入源程序是给定文法定义的合法程序,则输出”success”,如果不是,即输入源程序有错误,则输出“Error”,并且尽可能指出出错位置和原因。 三、作业要求 1、说明语法分析的源语言是什么? 能分析的语法成分有哪些(比如if、while、表达式、switch等等)。 给出每个语法规则的文法描述。(可以自定义语法成分,设计合理的语法规则。) 2、说明选择的语法分析方法是哪种?描述总体设计思路和主要的流程图。 3、编程实现,程序中编写的各种函数,需要给出注释,说明函数的作用。 四、结果分析 1、输入正确的源程序截图: 输出结果截图: 2、输入错误的源程序截图: 输出结果截图: 3、总结(自己的心得体会、你编写的语法分析程序的优缺点) 作业分工 上交内容:将以下文件打包压缩,压缩包命名:班级学号姓名_语法分析大作业 学号姓名以组长名字命名即可 1、本报告 2、语法分析程序代码 3、编译生成可执行程序 4、用于测试的源程序代码文件。

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

编译原理-语法分析器-(java完美运行版) - 副本

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

统计自然语言处理--概率句法分析

概率句法分析
哈工大信息检索研究室 2004年春

PCFG (Probabilistic Context Free Grammars)

Chomsky hierarchy
? 0-型(无约束文法)
– 无限制
? 1-型(上下文相关文法)
– αAβ -> αγβ
? 2-型(上下文无关文法)
– A -> γ
? 3-型(正规文法)
– A -> aB – A -> a

Motivation
? N-gram和HMM只能处理线性序列 ? 用这些方法对句子进行分析时,面临这 一些问题 ? The velocity of the seismic waves rises to ? 如何解决这种“矛盾”?

Motivation
? The velocity of the seismic waves rises to
? 自然语言是一种非线性的符号序列 ? 句子结构表现为复杂的嵌套性

Context Free Grammar
? ? ? ? ? ? (a) S NP, VP. (b) NP Det, Noun. (c) VP Verb, NP. (d) VP VP, PP. (e) PP Prep, NP. (f) Det [the]. (g) Det [a]. (h) Noun [boy]. (i) Noun [dog]. (j) Noun [rod]. (k) Verb [hits]. (l) Prep [with].

编译原理词法分析器语法分析器实验报告

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

语法分析器实验报告

语法分析器的设计实验报告 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分 别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。 对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。

三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量; (2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出& 的符号; (6)求某一符号能否推出‘& '; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW ; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M ; (13)句型判别算法; (14)一个用户调用函数; (15)主函数;下面是其中几部分程序段的算法思想:1、求能推出空的非终结符集 I、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c 为空符号 char temp[10]; 定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then 将该条产生式左部符号保存在临 时数组temp 中将临时数组中的元素合并到记录可推出& 符号的数组empty 中。 } U、求某一符号能否推出& int _emp(char c) { //若能推出& ,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt 里,标识此字符已查找其是否可推出空字如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为 c 的产生式 j=strlen(right[i]); //j 为c 所在产生式右部的长度 if右部长度为1且右部第一个字符在empty[]中.then返回1(A->B,B可推出空) if 右 部长度为 1 但第一个字符为终结符,then 返回0(A->a,a 为终结符) else

编译原理实验二语法分析器LL(1)实现

编译原理程序设计实验报告 ——表达式语法分析器的设计班级:计算机1306班姓名:张涛学号:20133967 实验目标:用LL(1)分析法设计实现表达式语法分析器 实验内容: ⑴概要设计:通过对实验一的此法分析器的程序稍加改造,使其能够输出正确的表达式的token序列。然后利用LL(1)分析法实现语法分析。 ⑵数据结构: int op=0; //当前判断进度 char ch; //当前字符 char nowword[10]=""; //当前单词 char operate[4]={'+','-','*','/'}; //运算符 char bound[2]={'(',')'}; //界符 struct Token { int code; char ch[10]; }; //Token定义

struct Token tokenlist[50]; //Token数组 struct Token tokentemp; //临时Token变量struct Stack //分析栈定义 { char *base; char *top; int stacksize; }; ⑶分析表及流程图

Begin PUSH(#),PUSH(E) POP(x) x ∈VT x ∈VN x=w end W=#n y NEXT(w) y n err 查LL (1)分析表空? n PUSH (i )err n y 逆序压栈 ⑷关键函数: int IsLetter(char ch) //判断ch 是否为字母 int IsDigit(char ch) //判断ch 是否为数字 int Iskey(char *string) //判断是否为关键字 int Isbound(char ch) //判断是否为界符 int Isboundnum(char ch) //给出界符所在token 值 int init(STack *s) //栈初始化 int pop(STack *s,char *ch) //弹栈操作 int push(STack *s,char ch) //压栈操作 void LL1(); //分析函数 源程序代码:(加入注释)

西安邮电大学编译原理语法分析器的制作

《编译原理》实验报告题目: 语法分析器的制作 学生姓名:江荣吉 班级: 学号: 指导教师: 成绩: 西安邮电大学计算机学院 2015 年 6 月 7 日

一:实验目的 熟悉语法分析的过程; 理解相关文法的步骤; 熟悉First集和Follow集生成 二:实验要求 对于给定的文法,试编写调试一个语法分析程序: 要求和提示: (1)可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、SLR(1)等)作为编制语法分析程序的依据。 (2)对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。 (3)能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情 况。 设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。 三:实验过程 1:文法: E->TE’ E’->+TE’|ε T->FT’ T’->*FT’|ε F->(E)|i: 2程序描述(LL(1)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。

NLG自然语言生成(搜集地内容)

1 自然语言生成 自然语言生成是人工智能和计算语言学的分支,它的重点在于建成一个计算机系统,这 个系统能生成用英语或其他人类语言表示的可理解文本,它的输入是一些非语言表示的信 息,它会利用相关的语言知识和领域知识来自动地生成文件,报告,说明,帮助信息,以及 其它类型的文本。(《buiding natrual language generation systems》)。 1.1 自然语言生成与自然语言理解 事实上,自然语言生成是自然语言处理的一部分,自然语言处理大体包括了自然语言理 解和自然语言生成两个部分:自然语言理解是需要消除输入语句的歧义来产生机器表示语 言,而自然语言生成的工作过程与自然语言理解相反,即它是从抽象的概念层次开始,决定如何用语言来表示这个抽象的概念,通过选择并执行一定的语义和语法规则生成文本。(《自然语言生成综述》) 自然语言处理,即实现人机间自然语言通信,或实现自然语言理解和自然语言生成是十 分困难的。(ambiguity)。 例如,一个中文文本从形式上看是由汉字(包括标点符号等)组成的一个字符串。由字 可组成词,由词可组成词组,由词组可组成句子,进而由一些句子组成段、节、章、篇。无 论在上述的各种层次:字(符)、词、词组、句子、段,……还是在下一层次向上一层次转 变中都存在着歧义和多义现象,即形式上一样的一段字符串,在不同的场景或不同的语境下,可以理解成不同的词串、词组串等,并有不同的意义。一般情况下,它们中的大多数都是可 以根据相应的语境和场景的规定而得到解决的。也就是说,从总体上说,并不存在歧义。这 也就是我们平时并不感到自然语言歧义,和能用自然语言进行正确交流的原因。但是一方面,我们也看到,为了消解歧义,是需要极其大量的知识和进行推理的。如何将这些知识较完整地加以收集和整理出来;又如何找到合适的形式,将它们存入计算机系统中去;以及如何有效地利用它们来消除歧义,都是工作量极大且十分困难的工作。这不是少数人短时期内可以 完成的,还有待长期的、系统的工作。以上说的是一个中文文本或一个汉字(含标点符号等)串可能有多个含义。它是自然语言理解中的主要困难和障碍。反过来,一个相同或相近的意义同样可以用多个中文文本或多个汉字串来表示,所以一个中文文本或一个汉字(含标点符号等)串可能有多个含义同样也是自然语言生成的主要困难和障碍。(《WAPEDIA》)因此,自然语言的形式(字符串)与其意义之间是一种多对多的关系。其实这也正是自然语言的魅力所在。从自然语言理解的角度看,我们必须消除歧义,即要把带有潜在歧义的自然语言输入转换成某种无歧义的计算机内部表示。而从自然语言生成的角度看,我们也要消除歧义,从抽象概念生成符合语义,语法,语用的无歧义文本,所以不论从哪方面看,自 然语言的魅力都给我们带来了巨大的困难。 历史上对自然语言理解研究得较多,而对自然语言生成研究得较少。但这种状况近年来已有所改变。 1.2 自然语言生成的研究 从20世纪40年代算起,自然语言处理的研究已经接近有70年的历史,而自然语言生成正是在自然语言处理的发展中逐渐清晰化的其中一个部分,大概兴起于70年代早期,在1983年~1993年这十年期间,自然语言生成的研究取得了令人瞩目的成就。 自然语言生成迄今已走过了近四十年的历程,在这段时间里,从事该领域研究的专家们 不断提出新的理论和方法,设计出新的生成模型,使语言生成的研究不断取得新的进展。目

语法分析器实验报告

实验三语法分析器 一、实验目的: 理解和掌握LL(1)语法分析方法的基本原理;根据给出的LL(1)文法,掌握LL(1)分析表的构造及分析过程的实现,掌握语法分析方法和程序设计方法。 二、实验要求: 对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与。产生式结构几乎是一致的,通过设计、编程、调试出一个具体语法分析程序。 三、实验原理: 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器的工作本质上是按文法的产生式,识别输入串是否是一个句子。自上而下分析法的主旨是,对任何输入串,试图用一切可能的方法,从文法开始符号出发,自上而下地为输入串建立一棵语法树。这种方法本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 对于一个文法满足以下三个条件,则称该文法为LL(1)文法。 文法不含有左递归。 对于文法中的每一个非终结符A的各个产生式的侯选首符集两两不相交。即,若A->Q1|Q2|…|Qn 则FIRST(Qi) ^FIRST(Qj)=null (i!=j) 对文法中的每个非终结符号A,若他存在某个侯选首符集包含空串,则FIRST(A)^FOLLOW(A)=null 对于一个文法满足LL(1)条件时,我们就可以对其输入串进行有效的无回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符号。 四、实验步骤: 1、功能描述: 根据给定的文法,由程序生成项集族和语法分析表,对输入的源程序进行词法分析,得到语法分析的输入串,经过语法分析后得到三个栈,它们分别是状态栈,字符栈,输入栈,从而分析出输入的源程序是否有语法错误。 2、构造自己设计的小语言的语法分析器: (1) 语言的语法描述(语法规则)的设计即文法的设计; (2) 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来; (3) 语法分析的数据输入形式和输出形式的确定;

词法分析器的设计与实现

目录 一.设计题目 (2) 二.设计要求 (2) 1. 词法分析器的定义 (2) 2. 设计要求 (2) 3. 本程序自行规定: (3) 三.设计作用与目的 (4) 1. 设计作用 (4) 2. 设计目的 (4) 四.运行环境及工具软件 (4) 五.系统设计 (5) 1. 系统总体设计 (5) (1)词法分析器的设计 (5) (2)总体设计框图 (6) (3)总程序流程图 (6) 2. 各子模块设计 (8) (1)字符的识别 (8) (2)关键字的识别 (8) (3)数字的识别 (8) (4)界符的识别 (10) (5)运算处理 (10) 3.相关函数分析 (11) 4. 源程序设计 (12) 六.实验调试结果 (29) 1. 调试工具 (29) 2. 调试步骤 (29) 3. 调试结果 (29) 七.设计中的问题及解决方法 (31) 八.设计心得 (32) 九.参考文献 (34)

词法分析器的设计与实现 一.设计题目 词法分析器的设计与实现 二.设计要求 1. 词法分析器的定义 词法分析顾名思义就是分词。它以程序设计语言编制的源程序作为输入,以单词序列作为输出。分词过程可以通过编制程序自动完成,我们通常称这个分词程序为词法分析器。词法分析器分析的源程序可以是现有的各类程序设计语言源程序也可以是人为给定的模型语言的源程序。本文中的源程序为后者。从词的角度来看,它涉及的内容较为简单,只包括几个较为常用的词类,词类的构成上也适当的作了一些简化。对词进行分析时,我们是按类型进行分析的。不同类型的词在后续的分析中所起的作用不同,相应的操作也各有不同,但同种类型中的词虽然单词的构成不同但从宏观上看它们的操作大体一致。模型语言中的单词可以分为“关键字”、“标识符”、“常数”、“分隔符”、“运算符”几类。一般,关键字在程序设计语言中人为给定 2. 设计要求 对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。另外,如果是算术表达式,则需要通过栈、运算符的优先级比较处理等从而计算出最终结果并显示。通过此次课程设计要求掌握从源程序文件中读取有效字符的方法,掌握词法分析的实现方法并上机调试编出的词法分析程序。 在处理表达式前,首先设置两个栈:一是运算符栈,用于在表达式处理过程中存放运算符。在开始时,运算符栈中先压入一个表达式结束符“#”。二是操作数栈,用于在表达式处理过程中存放操作数。然后从左到右依次读出表达式中的各个符号(运算符或操作数),每读出一个符号按以下原则进行处理:

lR语法分析器设计

LR分析程序设计 1实验目的 (1)构造LR 分析程序,利用它进行语法分析,判断给出的符号串是否为 该文法识别的句子; (2)了解LR分析方法是严格的从左向右扫描,和自底向上的语法分析方法。 2实验内容和实验要求 (1)LR分析器能够构造来识别所有能用上下文无关文法写的程序设计语言的结构。 (2)LR分析方法是已知的最一般的无回溯,移进-归约方法,它能够和其他移进-归约方法一样有效地实现。 (3)LR方法能分析的文法类是预测分析法能分析的文法类的真超集。 3 待分析的语法描述 E->vI:T I->I,i|i T->r 4算法描述 LR分析法基本思想 LR分析法是一种能够根据分析栈中的文法符号串(状态)和向右顺序查看第k个输入字符就能够唯一确定LR(k)分析器的动作是移进还是用哪一条产生式归约的分析方法。 采用LR(0)分析法进行本次实验,即无需向前查看输入符号就能够确定分析器的动作。 实现方法 LR(0)分析器由三个部分组成: (1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。 (2)分析表,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。由于它是总控程序的依据,所以在程序的第一部分就已经定义好。 (3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。 分析器的动作就是由栈顶状态和当前输入符号所决定。 (4)LR分析器及时察觉语法错误,快到自左向右扫描输入的最大可能。 为了使一个文法是LR的,只要保证当句柄出现在栈顶时,自左向右扫描的移进-归约分析器能够及时识别它便足够了。当句柄出现在栈顶时,LR分析器必须要扫描整个栈就可以知道这一点,栈顶的状态符号包含了所需要的一切信息。如果仅知道栈内的文法符号就能确定栈顶是什么句柄。由于LR分析表的转移函数本

编译原理语法分析器实验

语法分析器的设计 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

编译语言-语法分析器的设计

实验三语法分析器的设计 一、实验内容 设计、编写和调试构造LR(0)项目集规范簇或实现基于LR分析表对给定的符号串进行LR 分析的程序。以下两个内容任选其中一项: (1)对于给定的文法,实现构造识别该文法全部活前缀DFA的程序。 (2)对于给定的LR分析表和符号串,设计程序以实现所输入符号串是否为合法符号串。 要求用JAVA语言编程。(可参考实验指导书P149至P156) 二、程序代码 AnalysisOfGrammer.java package analysis; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.LinkedList; publicclass AnalysisOfGrammer extends JApplet{ private JFileChooser jfc = new JFileChooser(new File(".")); private JButton jbt1 = new JButton("打开文法文件"); private JButton jbt2 = new JButton("构造LR规范簇"); private JButton jbt3 = new JButton("构造LR分析表"); private JButton jbt4 = new JButton("清空"); private JButton jbt5 = new JButton("退出"); private JLabel jl1 = new JLabel("LR(0)项目集规范簇"); private JLabel jl2 = new JLabel("LR(0)分析表"); private JPanel p3 = new JPanel(); private JTextArea jta1 = new JTextArea(); private String[] grammer = new String[50]; privateint count = 0; private LinkedListlist = new LinkedList(); private Object content[][] = new Object[100][4]; int num1 = 0; String[][] cache = new String[50][100]; int[] location = newint[50]; int back = 0; publicvoid clear1(){ grammer = null; } publicvoid clear2(){ num1 = 0;

一种高效的通用型自然语言语法分析器系统设计

第36卷 第6期厦门大学学报(自然科学版)V o l.36 N o.6 1997年11月Jou rnal of X iam en U n iversity(N atu ral Science)N ov.1997  一种高效的通用型自然语言语法 分析器系统设计① 李堂秋 卢 伟 (厦门大学计算机科学系 厦门 361005) 摘要 阐述一个基于合一算法的高效的通用型语法分析器系统的设计原理和方法.着重说明:一种基于功能文法的语法规则的表示形式;基于树的合一算法的原理及其分析;以及如何使系统既具有运行的高效性又具有调试的方便性的总体设计方案. 关键词 机器翻译,语法分析,辞典功能文法,功能合一文法,树的合一算法 中国图书分类号 T P311.11 大多数实用自然语言处理系统都需要一定形式的语法处理器,特别是基于知识的机器翻译这样大规模的应用系统需要对所处理的文本有一定程度的理解,才能保证翻译的高质量.这就要求对原文语句的语法和语义做系统分析. 为此,需要有高效的和使用方便的语法分析器,它要满足一定的要求: 1)它在不同的语言之间要有通用性.也就是说,它能处理多种语言而不是一种特定的语言,处理不同的语言只需配上相应语言的语法规则.而且规则是描述性的,使得设计各种语言的语法规则远比整个系统的重新设计容易得多. 2)这种语法分析器应当是多用途的,它不仅可以用于机器翻译本身,而且可以用于多种多样的自然语言处理系统,如数据库和专家系统的自然语言接口等. 3)不同语言的语法不同,其语法和语义的依赖关系也不同.通用型语法分析器应使语法设计者可根据情况,方便地把语法、语义和词典等不同知识源以适当方式组合. 4)不管是语法、语义还是辞典的知识,表示的明晰性和符合语言学表示的规范是非常重要的.这种规范的表示方法容易为用户特别是语言学家所理解和使用. 5)系统运行的高效性是评判一个系统优劣的最主要的指标之一,特别是许多应用系统都有很强的实时性要求,象交互式的机器翻译,数据库和专家系统的接口等都要求系统在一定的时间内做出实时的响应. 本文阐述如何设计一个基于合一算法的通用型语法分析器,使之尽可能同时满足上述诸多要求.基本思路和做法是:在基于条件归结的短语结构文法的语法分析器[1]的基础上引进功能文法的表示形式和基于合一算法的运行机制.这样不仅保持了原有系统的高效灵活的特性,而且使系统表示的形式化更好,更符合计算语言学的表示规范.系统分为调试与运行两个部分,相互配合,使系统使用方便. ①本文1997203225收到; 福建省自然科学基金资助项目

语法分析C语言程序

实验内容: 可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器: (1)E→E+T | E-T | T (2)T→T*F | T/F | F (3)F→P^F | P (4)P→(E) | i 实验环境: Windows XP 实验分析: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分 实验程序: #include #include using namespace std; stack symbol; stack state; char sen[50]; char sym[12][6]={//符号表 {'s','e','e','s','e','e'}, {'e','s','e','e','e','a'}, {'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'s','e','e','s','e','e'}, {'r','r','r','r','r','r'}, {'s','e','e','s','e','e'}, {'s','e','e','s','e','e'},

{'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'r','r','r','r','r','r'} }; char snum[12][6]={//数字表 {5,1,1,4,2,1}, {3,6,5,3,2,0}, {2,2,7,2,2,2}, {4,4,4,4,4,4}, {5,1,1,4,2,1}, {6,6,6,6,6,6}, {5,1,1,4,2,1}, {5,1,1,4,2,1}, {3,6,5,3,11,4}, {1,1,7,1,1,1}, {3,3,3,3,3,3}, {5,5,5,5,5,5} }; int go2[12][3]={//goto表 {1,2,3}, {0,0,0}, {0,0,0}, {0,0,0}, {8,2,3}, {0,0,0}, {0,9,3}, {0,0,10}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }; void action(int i,char *&a,char &how,int &num,char &A,int &b)//action函数[i,a] { int j; switch(*a) { case 'i': j=0;break; case '+': j=1;break; case '*': j=2;break; case '(':

相关文档
最新文档