当前位置:文档之家› 一种LR语法分析中的错误恢复方法_肖洋

一种LR语法分析中的错误恢复方法_肖洋

一种LR语法分析中的错误恢复方法_肖洋
一种LR语法分析中的错误恢复方法_肖洋

—193—

一种LR 语法分析中的错误恢复方法

肖 洋,姜淑娟

(中国矿业大学计算机科学与技术学院,徐州 221008)

摘 要:语法分析中的错误恢复是现代编译器中智能感知功能的重要组成部分,错误恢复的效果直接影响到智能感知功能的性能。在分析LR 语法分析中LR 分析表特性的基础上,提出了一种对LR 分析表中的Goto 表项进行改造来进行语法错误的诊断和恢复的方法。该方法充分利用了LR 分析表中的空闲表项,在不增加空间需求的情况下,提高了语法错误的诊断和恢复的效率和准确率。 关键词:语法分析;编译器;智能;LR 语法分析表;Action-Goto 表

An Error Recovery Approach in LR Syntax Analysis

XIAO Yang, JIANG Shujuan

(School of Computer Science & Technology, China University of Mining & Technology, Xuzhou 221008)

【Abstract 】Error recovery in syntax analysis is one of the most important parts of the intelligence in the compiler. The effect of error recovery influences intelligence and syntax analysis. This paper presents a new method of modifying the items of Goto table in correcting syntax error based on analyzing the items of LR syntax analysis table. It uses the leisure items in LR syntax analysis table. It can improve the efficiency and precision in diagnosing and correcting syntax error without requiring more space.

【Key words 】Syntax analysis; Compiler; Intelligence; LR syntax analysis table; Action-Goto table

计 算 机 工 程Computer Engineering 第33卷 第4期

Vol.33 No.4 2007年2月

February 2007

·人工智能及识别技术·

文章编号:1000—3428(2007)04—0193—03

文献标识码:A 中图分类号:TP311

编译器在进行语法分析时经常采用LR 分析法[1~5],传统的LR 分析表项比较稀疏,没有能够对语法错误进行有效的诊断和恢复。本文借鉴了对Action 表的改造方法[3],实现了对某些语法错误进行诊断和恢复,并结合智能感知,提出了对Goto 表进行改造的方法,从而进一步加强了对语法错误的诊断和恢复功能。

LR 语法分析过程首先要建立产生式的项目集和分析表(Action-Goto 表),分析程序每次从输入缓冲区读入一个符号,并使用栈来存储形如s0X1s1X2…XmSm 的串,其中Sm 在栈顶,Xi 是文法符号,Si 称为状态符号,每个状态符号概括了栈中位于它下面的信息。

LR 语法分析器在访问动作表时若遇到出错表项,就检测出一个错误,分析程序就会停止,然后对出现的语法错误进行诊断和恢复。诊断是将可能性比较大的错误原因呈现给开发人员,恢复的功能是要使语法分析程序能够继续执行下去的前提。

语法错误的恢复对语法分析产生重要影响,错误恢复要能够根据上下文准确地判断错误的原因、位置以及使用的错误恢复策略和具体方法。错误恢复不但要能使语法分析正常进行下去,而且要避免在后续的语法分析过程中出现更多的语法错误。通过分析发现,在进行语法分析时,对LR 语法分析表中的Goto 表进行改造可以较好地提高语法分析的 效率。

1 LR 语法分析中的错误恢复策略

LR(k)分析法是一种有效的自底向上的语法分析技术。它适用于一大类上下文无关文法的语法分析。LR 语法分析器是由输入、输出、栈、驱动程序以及包含动作(Action)和转移(Goto)两部分的语法分析表构成的。不同的LR 语法分析器的区别主要在于语法分析表的不同。

1.1 通常的错误恢复的策略

通常语法分析器可以采用的语法错误恢复策略主要有以下4种。

(1)紧急方式恢复策略

紧急方式恢复是最容易实现的方法,适用于多数语法分析方法。当发现错误时,语法分析器开始抛弃输入记号,每次抛弃一个记号,直到发现某个指定的同步记号为止。同步记号通常是定界符,如分号 ;或 大括号 } 。这种方法常常跳过大量的输入记号,而不检查其中是否有其它错误。这种方法比较简单,不会陷入死循环,但只合适于一个语句中出现的错误数较少的情况。

(2)短语级恢复策略

当发现错误时,语法分析器对剩余的输入字符串进行局部纠正,即用一个能使语法分析器继续工作的字符串来替代剩余输入的前缀。编译器的设计者必须仔细选择替换字符串,以免引起死循环。该方法首先被用于自顶向下的语法分析中,

其主要缺点是难以应付实际错误出现在诊断点之前的情况。

(3)出错产生式策略

如果对经常遇到的错误有很清楚的了解,可以扩充语言的文法,增加产生错误结构的产生式。然后用由这些错误产生式扩充的文法构造语法分析器。如果语法分析器使用了出错产生式,就可以产生适当的错误诊断信息,指出在输入字符串中识别出的错误结构。

(4)全局纠正策略

一个理想的编译器是在处理不正确的输入字符串时做尽

基金项目:中国矿业大学校基金资助项目(OD4527)

作者简介:肖 洋(1979-),男,硕士生,主研方向:程序设计语言,编译技术;姜淑娟,副教授

收稿日期:2006-03-08 E-mail :xiaoyang790722@https://www.doczj.com/doc/7318860636.html,

可能少的改动。有一些算法可以选择最小的修改序列,以获得全局代价最小的错误纠正。但是实现这些算法的时间和空间开销太大,目前只是进行了一些理论上的探讨。

1.2 LR语法分析器的错误恢复策略

通常,LR语法分析器在访问动作表(Action表)时若遇到错误表项,就检测出一个错误,但它在访问转移表时决不会检测出错误。与算符优先文法分析器不同的是,LR语法分析器只要发现已扫描的输入出现一个不正确的后继就会立即报告错误。规范LR语法分析器在报告错误之前不会进行任何无效规约。在LR语法分析器进行错误恢复的具体策略如下。

(1)紧急方式的错误恢复

从栈顶开始退栈,直至发现在特定的非终结符A上具有转移的状态S为止;然后丢弃零个或多个输入符号,直至找到符号a为止,a是A的合法后随符号;接着,语法分析器把状态goto[S,A]压进栈,并恢复正常分析。

(2)短语级恢复

通过检查LR分析表的每个出错表项,并根据语言的使用情况确定最可能引起该错误的开发人员最容易犯的错误,然后为该表项编一个适当的错误恢复例程。该例程大概会采用一种适合于相应出错表项的方式来修改栈顶符号和(或) 第1个输入符号。

(3)出错产生式策略

可以把具体的最易出错的产生式加入到LR的分析表当中,但同时会加大分析表的空间,需要特别注意出错产生式是否会影响到正常的分析过程,以免带来更多的错误。

2 对Action表进行改造

当今进行错误恢复的手段都是通过修改Action表的空余表项来实现的[3]。下面以一个精简的C#语言规范中的using 语句和命名空间声明的LR语法分析表为例,说明对Action 表项所进行的具体改造方法。

2.1 一个具体的Action-Goto表(表1)

表1 LR分析表(ActionGoto表)

id { } . ; u n# S U U’

M N N’B

0 S5 S7 1 2 4 36

1 acc

2 S5 S79 86

3 S710

4 R2 R2

5 S12 11

6 R3R3

7 S13

8 S710

9 R2 R2

10 R3R3

11 S15

S14

12 R5

R5

13 S18 1716

14 R4 R4

15 S19

16 R6R6

17 S20

18 R8R8

19 R5

20 R7R7

终结符:id(标识符) { } . ; u n #(结束符)

非终结符:S(编译单元) U(多个Using指令) U’(单个Using指令) M(命名空间名)N(多个命名空间成员声明) N’(单个命名空间成员声明) B(命名空间体)

产生式:

(0)S’ ? S # (1)S ? U N | N (2)U ? U’| U U’

(3)N ? N’ | N N’ (4)U’ ? using M ; (5)M ? id | M . id

(6)N’ ? namespace id B (7)B? { N } (8)B?{ }

2.2 改造原理与方法

当语法分析状态为0时,待输入符号为id或{或}或.或;时,会出现语法错误。语法分析状态为0时,即语法分析刚刚开始,期望输入符号应该为u(using)或n(namespace),如果出现了id、{、}等符号,根据恢复策略,可以采取忽略当前输入符号的方法,在对应的空白表项中填入E0。下面以表1中的状态项0和状态项11为例进行改造,其结果如表2所示。

表2 改造后的状态项0和11

id{}.;u n # S U U’ M N N’B

0E0E0E0E0E0S5S7 E1 1 2 4 36

11E2E2E2S15S14E3E3 E4

原有的空白表项已经被改换成对出错表项的调用,可以把某些出错表项改成归约,这样LR分析表中就可以包含对错误的诊断和恢复,出错表项的具体含义如下:

E0:要求输入符号为u或者n,输入不符要求时调用此例程。

从输入中删除此符号。即忽略当前符号,维持当前状态。

出错信息:“应输入using或namespace”。

E1:要求输入符号为u或者n,但输入符号已经结束。

终止分析。

出错信息:“应输入using或namespace”

E2:要求输入符号为.或者;输入不符要求时调用此例程。

从输入中删除此符号。

出错信息:“缺少分号”。

E3:当输入符号为u或者n时,调用此例程。

把;压入栈,并盖以状态14。

出错信息:“缺少分号”。

3 智能感知中错误恢复策略

智能感知功能一般包括语法错误的显示,类体系结构的呈现,对象的属性和方法的呈现,函数方法参数的提示等功能。智能感知的实现依赖于即时的词法分析,即时的语法分析以及部分语义分析。当今智能感知功能在编译器中起着重要的作用,强大的智能感知必然要求高效的语法分析以及语法错误的诊断和恢复。智能感知对语法分析的性能要求比较苛刻,对语法错误的恢复要求能够做到及时和尽量准确。传统的通过改变Action表的方法很难满足智能感知对语法分析以及错误恢复的时间和性能要求。为此,本文提出了一种新的方法,对Goto表进行改造来满足智能感智对语法分析的 要求。

3.1 智能感知中的语法分析

实现智能感知功能必须采用动态的语法分析方法。动态的语法分析要求在编写代码的同时要对程序代码即时进行语法分析,以便判断当前的分析状态和上下文环境。实现即时的语法分析,必然要求要尽可能地减少语法分析的范围,即要用一个适当的算法来保存以前的语法分析结果。利用已经存在的分析结果,可以大大提高语法分析的速度,也可以提高语法错误的恢复程度。下面给出一个智能感知进行语法分析后简单保存语法分析结果例子。

图1是一段程序伪代码,图2是保存的语法分析结果。如果对程序源代码进行修改,如把第3行的源代码using https://www.doczj.com/doc/7318860636.html,;修改为using https://www.doczj.com/doc/7318860636.html,.Sockets;进行语法分析

—194—

—195—

时,待输入符号的序列就变为[ U’ U’ using id . id . id ; N ],这样可以节省大量的重复分析时间,完整地保存了语法分析的上下文,如果出现语法错误就可以根据上下文对错误进行有效地诊断和恢复。因为传统的LR 分析器的输入符号串全部为终结符,那么实现对终结符和非终结符混合的输入串进行语法分析就必须改造Action-Goto 表,主要是改造Goto 表。

图 1 程序伪代码

图 2 保存的语法分析结果

3.2 对Goto 表进行改造

智能感知功能要求发生语法错误时要即时对语法错误进行恢复。由于对以前的分析结果进行保存,在语法分析过程中就会直接遇到非终结符,因此可以对Goto 表进行改造,以便实现更快捷的语法分析,同时也会大大提高错误恢复的成功率和减少进行错误恢复的代价。下面举一个例子来阐述如何对Goto 表进行改造。

假设把图1中第3行的源代码using System . Net ;修改为 using System ,即程序开发人员选中 . Net ;5个字符,并且进行删除操作。此时,由于只改变了第3行的代码,可以认为,代码的改动“破坏”了原有的语法分析结果,但“破坏”范围是有限的。原有的语法分析结果可以用非终结符的序列表示为:[ U N ],虽然代码发生了改动,但完全可以通过对程序开发人员的操作来判断“破坏”的范围。利用原有的语法分析结果,可以获得需要重新进行语法分析的符号序列为[ U’ U’ using id N ]。表3示出了根据改造后的Action- Goto 表对此序列进行分析的过程。

表3 改造后的Action-Goto 表对此序列的分析过程

步骤 状态栈 符号栈 输入串 ACTION GOTO 1 2 3 4 5 6 7 8

0 05 02 029 02 025 025[12] 025[11]

# # U’ # U # UU’ # U # U using # U using id # U using M

U’ U’ using id N# U’ using id N# U’ using id N# using id N# using id N# id N# N# N#

R2 S5 S12

5 R2 9 R5 F2

当语法分析进行到步骤8时,符号栈栈顶元素为非终结符M ,待输入字符为非终结符N ,此时源代码出现错误,语法分析程序需要进行诊断和恢复。当前最有可能的出错原因

是缺少分号,那么可以在Goto 表中将对应的表项进行修改为F2。F2的含义为:在符号栈顶添加一个分号,给出错误提示“缺少分号”。语法分析程序得以继续,表4是语法分析的后续过程,表5是改造后的Action-Goto 表。

表4 改造后的Action-Goto 表对此序列的分析过程(续)

9 10 11 12 13

025[11][14]

029 02 028 01

# U using M [;] # U U’ # U # UN # S

N# N# N# # #

R1 acc

R4 R2 8

表5 改造后的Action-Goto 表

id { } . ; u n # S U U’ M N N’B 0 E0E0E0E0E0S5S7 E1 1 2 4 F0 3 6 F09 R2R2R2R2R2R2R2 R2 R2 R2 R2 R2R2R2R211E2

E2E2S15

S14

E3E3 E4 F2 F2 F2 F1

F2F2F1

表5中的F0、F1和 F2的具体含义如下:

F0:直接忽略此非终结符,避免了错误的大量出现。 出错信息:“应书写using 语句或命名空间”。 F1:直接忽略此非终结符。 出错信息:“缺少分号”。

F2:把;压入栈,并盖以状态14,进行规约。 出错信息:“缺少分号”。

原有的Goto 表中空白表项已经被改换成对出错表项的调用,加上原有的对Action 表的改造,这样LR 分析表中的空间都具有了语法分析或对错误的诊断和恢复的功能。

改造

Goto 表的优点:可以尽可能利用Goto 表中的空余表项,提高了错误诊断和错误恢复的效率和准确率,为实现智能感知功能提供了有利的前提条件。缺点是改造Goto 表必须依赖于以前的语法分析结果,这种方法不适用于对单遍 的语法分析方法。

4 总结

本文提出了一种对LR 分析表中的Goto 表项进行改造,以实现更好地对语法错误进行诊断和恢复的方法。结合文 献[3]

中的对Action 表的改造方法,对LR 分析表的空闲表项加以利用,在不增加空间需求的情况,对Goto 表项进行改造。并把对Action 表项的改造方法和对Goto 表项的改造方法进行结合在一起,使对语法错误的恢复操作更准确、更有效。由于对Goto 表的改造需要依赖以前语法分析结果,对于自上而下完整的单遍语法分析不适用。但是,现代编译器中词法分析、语法分析都是即时性的,这样对Goto 表的改造就可以发挥重要的作用。对Goto 表的改造的方法只是实现智能感知功能的一部分,对Goto 表中表项所定义的动作还需要进行深入的研究,才能实现对语法错误高效、准确的诊断和恢复,这也是下一步研究和实现的目标。

参考文献

1吕映芝, 张素芹, 蒋维杜. 编译原理[M]. 北京: 清华大学出版社, 1998.

2 Louden K C. 编译原理及实践[M]. 冯博琴, 冯 岚, 译. 北京: 机械工业出版社, 2000.

3 Aho A V , Sethi R, Ullman J D. 编译原理[M]. 李建中, 姜守旭, 译. 北京: 机械工业出版社, 2003.

4 Appel A W. 现代编译器的Java 实现M]. 陈 明, 译. 北京: 电子工业出版社, 2004.

5 张幸儿. 计算机编译原理:编译程序构造实践[M]. 北京: 科学出版社, 2005.

现代汉语 常见的语法错误

第十节常见的语法错误 我们在写作中出现的语法错误是各种各样的。有些语病,如“词类误用”、“复句组织中的毛病”、“虚词使用不当”等,我们已经在有关章节(分别在第二节、第八节、第九节)里谈得比较集中,比较充分,在这一节里就不再谈了。有些语病,如“搭配不当”、“残缺”、“词语位置不当”等,虽也已分别在前面几节里谈到过,但考虑到一般在写作中犯这些方面的毛病比较多,前面又是分散着谈的,这里有集中谈一下的必要,所以这里将不避重复,再作进一步的说明。此外,在这一节里我们还想谈谈在指代和数量表达方面的问题,因为这方面的毛病也比较常见。 一句法成分搭配不当 所谓句法成分搭配不当,是指句子中密切相关的句法成分,如主语和谓语、述语和宾语、定语和中心语、状语和中心语等,在组织句子时,由于没有注意照顾它们之间的配合,结果造成了搭配不当的毛病。 (一)主语和谓语搭配不当 主谓搭配不当是常见的毛病。请看下面的例子: (1)*修建高速公路是很必要的,但是应该看到,我们国家的经济基础还比较低,还不能一下子省与省之间都通高速公路。(报) (2)*生活告诉人们:急躁的人,事情一旦办不成,往往容易转化为灰心丧气。(刊)例(1)“经济基础”不能与“低”搭配。如果要保留“经济基础”,可以将“低”改为“薄弱”;如果要保留“低”,可以将“经济基础”改为“经济发展水平”。例(2)“人……转化为……灰心丧气”显然不通。“转化为”三个字完全是多余的,应删去。 有些主语与谓语搭配不当的毛病比较隐晦,需要作些分析才能发现。例如:(3)*你刚18岁,正值青春茂盛之时。(刊) (4)*这篇通讯的作者有很好的理论修养,所以立意很深。(书) 例(3)“你……正值……之时”没有错,但“之时”前一加上“青春茂盛”这个定语就使主语“你”与谓语“正值青春茂盛之时”就不搭配了。人怎么能像植物那样“茂盛”呢?把“茂盛”删去,句子当然通了,但念着还是别扭。比较好的改法是,将“青春茂盛之时”改为“青春年华”。例(4)是个因果复句,单就每个分句看,似没有语法错误;但读者读到后一个分句“立意很深”,总觉着别扭。“立意很深”是陈述那个成分的呀?从句子结构上看,“立意很深”该是说明“作者”的,因为后一个分句是承前省略了主语,那省略的主语该是“通讯的作者”;但从意思上说,“立意很深”该是用来陈述“这篇通讯”,因为“立意很深”只能用来形容作品内容,不能用来说明人。所以这个句子的毛病也属于主谓搭配不当的语法错误。 下面的例子是主谓搭配不当的另一种情况: (5)*理论正确是衡量文章好坏的重要标准。 (6)*汽车本身质量的好坏,也是保证行车安全的一个很重要的条件。 例(5)主语“内容正确”是从一个方面说的,而谓语“是衡量文章好坏的重要标准”则是从两方面说的,不搭配。宜将主语改成“内容是否正确”或“内容正确与否”。例(6)刚好相反,主语是从两个方面说的,而谓语是从一个方面说的,也不搭配。宜将谓语改成“也是能否保证行车安全的一个很重要的条件”。 当主语或谓语是联合词组时,更要注意主谓的配合。下面的句子都有问题: (7)*一年不见,她的身体,她的业务水平和思想水平都比先前提高了许多。(刊)(8)*由于该县领导严重忽视安全生产,以致劳动者生命和财产遭受巨大损失的事

编译原理实验报告《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

越南学生学习汉语语法常见的四种偏误分析_摘要1

越南学生学习汉语语法常见的四种偏误分析 研究生姓名:李依霖导师姓名:孙建元教授 学科专业:汉语言文字学研究方向:对外汉语教学 年级:2005级 提要 汉语是世界上使用人数最多的语种,中国改革开放以来,随着全球化进程的不断扩大和加深、政治、经济、文化等各方面的频繁交流,使汉语在世界上占有举足轻重的地位,所以对外汉语教学发展得非常迅速,由于地理位置相邻母语为越南语的学习者日益增多。目前,该学习领域也存在着不少问题,较为突出的就是语法问题。虽该领域的研究对语法涉足得也不少,但对于语法偏误的类型的研究却不多。因此,我决定在前人研究成果的基础上,采取语料搜集、问卷调查等形式,加上本人五年来的教学经验,搜集越南学生的语法偏误实例,找出数量最多、使用频率最高、学生困难最大的偏误类型,通过对具体数据的计量统计,本人决定对其作出进一步的探讨。 文章以问卷调查数据为基础,对越南学生在使用汉语的过程中作出了全面的量化分析,除了以问卷测试形式对一、二年级越南学生、进行的定量研究、考察以外,加上本人在五年教学经验中,累积的学生练习,作业,运用科学统计的方法对结果进行检验,结合语言迁移进行对比分析,对偏误现象进行了探讨和分析。在对越南学生习得汉语语法常见的一些偏误现象分析的基础上,对中越相关语法偏误进行研究,归纳偏误典型类。 通过分析,把搜集到的资料按鲁建骥在《外国人学汉语的语法偏误分析》语言文字应用1994年第一期中,开始进行越南学生学习汉语语法常见的四种典型偏误分析 1.遗漏偏误 2.误加偏误 3.误代偏误 4.错序偏误,在分类时力求做到把即共性和差异归类。分析时,从对外汉语教学的角度出发,特别是对越南学生易出错的地方进行了深入细致的说明。

实验三 自下而上语法分析及语义分析

实验三自下而上语法分析及语义分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的内容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式 char input[30]; //输入串 char explen[50]; //解释说明 }OutNode; //输出结果中每一行的类型 OutNode out[20]; //存放输出结果 char Sentence[20]; //存放文法的一个句子 char GramSent[10][20]; //存放文法的一组产生式

对外汉语教学中语法偏误分析报告

对外汉语教学中语法偏误分析 一遗漏偏误 顾名思义, 遗漏偏误指由于在词语或句子中遗漏了某个/ 几个成分导致的偏误。遗漏偏误常常出现在下列情况下: 1 .某些意义上比较“虚”的成分比较容易被遗漏。这包括某些副词、连词, 特别是复句或结构中某些起关联或呼应作用的副词、连词。在我们的资料中有遗漏偏误的复句结构有: 不管?,[都] ? ( 注:[ ] 中的成分为被遗漏者, 下同。) 宁可? , [也] ? 另如: 结构: 除了?以外, [ 都]? 除了?以外, [也] 表示强调: 一点儿[也」不? 疑问代词活用: 谁[都/也] ? 以上这些起关联或呼应作用的副词、连词之所以容易被遗漏,原因就在于它们的意义比较“虚”。卜丁是关联词语, 处于句首的那些, 地位突出, 说话人要说这些话时, 首先想到的就是这些词,二般( 实际上我们没有发现一例) 不会漏掉。 与学生的母语对比, 这些词语( 除“而且”外) 都是不出现的。就复句结构说,虽然也有对应的成对词语, 但是在英语的复合句中只能出现其中之一,两个都用是典型的偏误。至于“ beside ” ,“except ” , “ not in the least ?, “ anyone/no one ”这些与“除了?以外, 都?” , “ 除了?以外, 也?” , “ 一点儿也不?”等相对应的词语,使用时根本没有与“都” , “也”等对应的成分。这些都构成了对外国人使用这些结构的干扰, 而造成遗漏偏误。 再如外国学生在使用某些动词一结果补语词组时, 常常遗漏一个成分( 动词或结果补语) , 如: (1 ) 记[住] 听[到] 听[见] 看[见] 跑[到] 寄[给]

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (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语言作为开发工具。基于实验任务

对外汉语教师汉语语法偏误分析

对外汉语教师汉语语法偏误分析 一、偏误分析的理论基础 第二语言的教学过程,也是第二语言学习者的习得过程。中介语理论提出,学习者自身存在着一个介于第一语言与目的语之间的动态的语言系统——中介语,并重视对这一语言系统的研究。研究时主要采用偏误分析的方法,即关注学习者在第二语言学习过程中所产生的错误,并进行系统地分析研究,以探求第二语言习得的过程和规律。因此,教学中一般的纠错并不等于偏误分析,进行偏误分析首先要区分“失误”(mistake )和“偏误” (error )。 失误是指在特殊情况下产生的语言错误,比如注意力不集中、疲劳、粗心或紧张等,具有偶然性。第二语言学习者和操母语的人都有可能发生这类错误,而且在错误发生之后有能力进行改正。所以,它属于语言运用范畴,不能反映说话人的语言能力。例如在一位学习者的同一篇作文中,先后出现了以下两句话: (1 )*从4 月份的第三(个)星期开始,我妈妈每天给我打电话,想让我回家。 (2)从5 月份的第四个星期开始,电视台停止播放那首歌。 前一句遗漏了量词“个” ,而句法环境相同的后一句却未遗漏,可见前面的错误是由于她的疏忽产生的,属于失误。 偏误是指第二语言学习者在使用语言时不自觉地对目的语的偏离,是以目的语为标准表现出来的错误或不完善之处。这种错误是成系统的、有规律的,反映了说话人的语言能力,属于语言能力范畴。例如: (3 )*天上都是黑云,看起来(要)下雨了,我们快回家吧! (4 )*快八点了,你(要)起床了。 以上两例均出自初级阶段学习者的作业,由于他们还没有熟练掌握助动词“要”的用法,所以在该使用的地方却没有使用,这是他们在特定阶段的语言能力的表现,具有普遍性,所以他们所犯的错误属于偏误。 在教学实践中,纠错应该以偏误为对象,进行有效地分析。这样,才能有助于教师了解偏误的成因,进而预测偏误的发生,积极有效地进行教学。例如: (5 )*我每天吃晚饭在食堂。 此例是母语为英语的学习者的偏误。汉语中当时间状语和地点状语共同出现时,地点状语一定要放在动词或动词短语之前,时间状语之后。而英语是地点状语在动词或动词短语之后,时间状语在前或者在句尾。所以学习者会受英语语序的影响,造出有偏误的句子。因此在讲解动词谓语句的语序时,教师应针对学习者的特点,在说明基本规则之外,有目的地设计一些练习,比如列出以上带有偏误的句子,指导学习者改正,以便学习者早发现问题、早重视、早纠正。 、语法偏误的成因和特点 一)偏误成因 第二语言学习者的偏误是由多方面因素造成的,通常归纳为母语的负迁移、目的语知识的负迁

报刊语法错误分析

重要报刊中出现的语法错误 一、主语残缺 1、当他第三次试跳时越过这个高度,动作干脆,腾跃时重心离横竿较高。(《解放日报》2011年3月17日第3版) 第一个分句的主语应该是“他”,但由于被置于介词结构“当……时”中,便造成了主语残缺。 2、《三只狼》写一个农人在路上遇见了三只狼,开始想给狼扔几块肉,甩掉它们。但后来知道狼贪得无厌,终于下决心想办法把狼打死了。(《文汇报》2008年6月2日第4版) “开始想给狼扔几块肉,甩掉它们。”,一句缺主语“他”。 二、宾语残缺 1、《三只狼》写一个农人在路上遇见了三只狼,开始想给狼扔几块肉,甩掉它们。但后来知道狼贪得无厌,终于下决心想办法把狼打死了。(《文汇报》2008年6月2日第4版) “《三只狼》写一个农人在路上遇见了三只狼”缺少宾语“的故事”。 2、菊花牌38支〔TK〕精梳本色棉毛衫具有手感柔软,弹性好,布面清晰,缝制考究,坚牢耐穿。(《解放日报》2000年2月10日第2版) 全句缺少宾语“等特点”。 三、搭配不当 1、山东聊城杨以增海源阁,为近代著名藏书家。(《人民日报》2011年8月30日第8版) 主语为“……海源阁”,宾语中心语是“藏书家”,主宾不搭配。 2、标题“四川、福建、北京、天津女排四强出线在望天津队夺魁希望最浓”。(《新民日报》2011年9月26日第4版) “希望”和“浓”不搭配。 四、词序不当 1、一家农民开办的大旅店在杭州市郊开业(标题)。(《光明日报》1981年3月5日第1版) 结合正文可知大旅店是公社办的,标题应改为“一家农民开办的大旅店在杭州市郊开业”。 2、蔡文治为什么说这气话呢?原来南京解放前的前半个月,也就是和谈刚刚破裂,黄绍肱从北京飞到香港去后,顾祝同主持召开了一次作战会议。(《解放日报》1984年第12期52页) “南京解放的前半个月”一般会理解为在南京解放以后的半个月,可后面明明讲到“和谈刚刚破裂”,可知说的是南京解放以前。应该把“的”与“前”的位置换一下。 五、重复累赘 1、但是,首要的也是最重要的原因就是职务犯罪主体身份的特殊性。(《人民日报》2011年7月28日第1版《贪官不入监缘何增多》) 其中“首要”、“最重要”含义重复。 2、他经历惊涛骇浪,不仅亲眼目睹了沿途岛屿的奇风异俗,也发现了船上一连串的惊天阴谋。(《光明日报》2010年7月26日第2版《瑞典王后从哥德堡

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

《编译原理》实验报告题目: 语法分析器的制作 学生姓名:江荣吉 班级: 学号: 指导教师: 成绩: 西安邮电大学计算机学院 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)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。

编译原理中处理语法错误问题的研究

编译原理中处理语法错误问题的研究 摘要:本文分析了编译系统以及其错误处理能力对于程序设计语言的重要性,对其中处理语法错误问题进行了深入研究,并从语法错误的诊察与报告,到利用递归下降分析法对错误进行恢复和纠正处理,直至最后的限制重复报告错误信息及其中涉及的关键技术进行了介绍,从而帮助学习者和开发者牢固掌握相关的理论和技术。 关键词:编译系统;语法错误处理;递归下降分析法 1 前言 在计算机应用领域,目前多数用户都是通过高级语言实现所需要的计算。而对于任何高级语言来说,其编译系统内容丰富,具有严密的逻辑性,对提高学习者和开发者的计算机软件素质具有很大作用,使其不但能认识计算机信息处理的实质,还可以综合运用所学的软件设计技术来分析解决问题[1]。因此,编译系统是计算机系统软件最重要的组成部分之一,也是用户最直接关心的工具之一,它不但要接受程序语言的所有标准定义,以便源代码实现跨平台的可移植性,还必须生成高效、正确的目标代码。因此编译系统本身是一个大而复杂的程序,值得我们深入分析研究。 我们知道,在编译原理的学习和编译系统的构建过程中,语法分析是其中最为重要的一个组成部分。而在实际的编译系统中,语法分析器的错误处理能力与其构造原理和技术一样重要,这通常是编译原理教学环节中容易忽视的地方,不利于学习者进行实际的编译系统的开发工作。因此,本文对C++编译系统中递归下降的语法分析过程进行了研究,找到了发现并纠正语法错误问题的有效方法。 2 语法错误 编程人员在编写程序时,很难一次就将程序写的完美无误,尤其是一些比较复杂的程序,往往会存在程序错误。程序错误的种类有很多,比如违反语言的语法和语义规定的错误,源程序超出了计算机系统的某种限制而引发的错误,等等。其中语法错误是指源程序中含有不符合语法规则的成分时所产生的错误,一般是有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。

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分析表的转移函数本

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

实验三语法分析器的设计 一、实验内容 设计、编写和调试构造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;

常用语法偏误分析

常用语法偏误分析

第十七节汉语语法偏误分析 一、偏误分析的理论基础 第二语言的教学过程,也是第二语言学习者的习得过程。中介语理论提出,学习者自身存在着一个介于第一语言与目的语之间的动态的语言系统——中介语,并重视对这一语言系统的研究。研究时主要采用偏误分析的方法,即关注学习者在第二语言学习过程中所产生的错误,并进行系统地分析研究,以探求第二语言习得的过程和规律。因此,教学中一般的纠错并不等于偏误分析,进行偏误分析首先要区分“失误”(mistake)和“偏误”(error)。 失误是指在特殊情况下产生的语言错误,比如注意力不集中、疲劳、粗心或紧张等,具有偶然性。第二语言学习者和操母语的人都有可能发生这类错误,而且在错误发生之后有能力进行改正。所以,它属于语言运用范畴,不能反映说话人的语言能力。例如在一位学习者的同一篇作文中,先后出现了以下两句话: (1)*从4月份的第三(个)星期开始,

我妈妈每天给我打电话,想让我回家。 (2)从5月份的第四个星期开始,电视台停止播放那首歌。 前一句遗漏了量词“个”,而句法环境相同的后一句却未遗漏,可见前面的错误是由于她的疏忽产生的,属于失误。 偏误是指第二语言学习者在使用语言时不自觉地对目的语的偏离,是以目的语为标准表现出来的错误或不完善之处。这种错误是成系统的、有规律的,反映了说话人的语言能力,属于语言能力范畴。例如: (3)*天上都是黑云,看起来(要)下雨了,我们快回家吧! (4)*快八点了,你(要)起床了。以上两例均出自初级阶段学习者的作业,由于他们还没有熟练掌握助动词“要”的用法,所以在该使用的地方却没有使用,这是他们在特定阶段的语言能力的表现,具有普遍性,所以他们所犯的错误属于偏误。

编译原理词法分析器语法分析课程设计报告书

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 20112723 姓名林苾湲 西南交通大学信息科学与技术学院 2013年 12月

目录 课程设计1 词法分析器 (2) 1.1 设计题目 (2) 1.2 设计容 (2) 1.3 设计目的 (2) 1.4 设计环境 (2) 1.5 需求分析 (2) 1.6 概要设计 (2) 1.7 详细设计 (4) 1.8 编程调试 (5) 1.9 测试 (11) 1.10 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 2.1 设计题目 (14) 2.2 设计容 (14) 2.3 设计目的 (14) 2.4 设计环境 (14) 2.5 需求分析 (15) 2.6 概要设计 (16) 2.7 详细设计 (16) 2.8 编程调试 (24) 2.9 测试 (24) 2.10 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。 二、设计容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: 4.1.硬件 (1)Intel Core Duo CPU P8700 (2)存4G 4.2.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 4.3.编程语言 C#语言 五、需求分析 5.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 5.4.可选择性地将结果保存到文件中。 六、概要设计 6.1.数据类型 6.1.1.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:

偏误分析讲义

偏误分析讲义Lado1957年提出的对比分析法理论认为:第二语言的学习过程是学习者从母语习惯向目的语习惯逐步迁移的过程。如果我们能够把所教授的目的语和学习者的母语在语音、语法、词汇等方面一一进行对比分析,就能够列出母语和目的语之间的相同和不同之处。相同或相似之处是学习者容易掌握的方面,在学习中会出现正迁移;不同之处则是学习的难点、教学的重点,在学习中会出现负迁移,即学生可能会出错。 对比分析法建立在行为主义心理学和结构主义语言学的理论框架上。由此衍生的“听说法”在二战及战后二十年里成为语言教学的主流。“听说法”语法教学的顺序是根据学习者母语和目的语的不同,把两种语言中差别大的结构作为重点并按其难易程度进行安排,课堂教学方法则以反复操练和句型训练为主,旨在准确。 但是对比分析法也有其致命的弱点: 1)对比分析只对语言表层结构进行对比,且主要集中于语音、词汇、语法几方面,没有语义、语用、话语、文化等方面的比较,因此这种对比是不全面的。 2)对比分析最大的问题在于把学习着看做机械刺激的对象,不重视学习者的研究,只进行目的语和学习者母语的对比,单纯从两种语言本身的对比预测学习的难易,不可避免地造成预测的不准确性。 3)对比分析只研究L1对目的语学习的迁移作用,而L2学习者所遇到的困难和所犯的错误并不只是来自L1的干扰,学习者错误的困难和错误的来源是多方面的。语言

差异与学习者可能遇到的困难之间不是简单的正比关系 如:全香兰《汉韩同形词偏误分析》(汉语学习2004,3) 韩国语中有大量的汉字词 ,其中汉韩同形词所占比例相当大。比如 ,汉语水平等级大纲甲、乙两级 2021 个多音节词当中汉韩同形词就有1256 个 ,占 62 %。因此 ,在韩汉翻译教学过程中我们发现 ,韩国留学生使用汉语词语时 ,韩国语的汉字词给学生提供了很多方便 ,可是另一方面由于某些汉字词在两种语言中使用情况有所不同 ,又容易造成负面影响。 学语言,免不了会说错、写错。对待错误,可以有不同的态度。“有则改之,无则加勉”——错误要竭力避免;“吃一堑,长一智”——错误有积极作用;“金无足赤,人无完人”——谁也免不了会犯错误。行为主义心理学影响下,对待错误属于消极态度,有错必纠,体现在听说法、直接法中,遇到学生错误尽量纠正,让学生养成正确的语言习惯。而另外一种态度则是认为,错误在语言学习中是必然会出现的,通过不停的学习,其可以自然消失,因此可采取听之任之的态度,体现在教学法中就是交际法。(也称功能意念法、功能法,20世纪70年代起源于西欧,创始人是英国语言学家威尔金斯,兴盛于美国,功能法的基本特征就是以语言的功能项目为纲,有针对性地培养学生的交际能力。它面对错误的一个原则就是:强调内容表达,不过分苛求形式,只要不影响交际,一般性的语言形式错误是可以容忍的。Follow me) 所以Johnson(2002)说过:外语学习者的话语中,最吸引人的莫过于其中的错误。如果学习者的每句话都正确无误,我们就不知道他脑子里在想什么。但是,话语中一旦出现错误,我们就可以研究它的特点,推测出错的原因。错误可能暗含

编译原理实验三-自下而上语法分析及语义分析.docx

上海电力学院 编译原理 课程实验报告 实验名称:实验三自下而上语法分析及语义分析 院系:计算机科学和技术学院 专业年级: 学生姓名:学号: 指导老师: 实验日期: 实验三自上而下的语法分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容

根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ● LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: (1)E->E+T (2)E->E-T (3)E->T

(4)T->T*F (5)T->T/F (6)T->F (7)F->(E) (8)F->i 状态ACTION(动作)GOTO(转换) i + - * / ( ) # E T F 0 S5 S4 1 2 3 1 S6 S1 2 acc 2 R 3 R3 S7 S13 R3 R3 3 R6 R6 R6 R6 R6 R6 4 S 5 S4 8 2 3 5 R8 R8 R8 R8 R8 R8 6 S5 S4 9 3 7 S5 S4 10 8 S6 R12 S11 9 R1 R1 S7 S13 R1 R1 10 R4 R4 R4 R4 R4 R4 11 R7 R7 R7 R7 R7 R7 12 S5 S4 14 3 13 S5 S4 15 14 R2 R2 S7 S13 R2 R2 15 R5 R5 R5 R5 R5 R5 五、处理程序例和处理结果例 示例1:20133191*(20133191+3191)+ 3191#

常见的汉语语法错误

常见的汉语语法错误 一句法成分搭配不当 所谓句法成分搭配不当,是指句子中密切相关的句法成分,如主语和谓语、述语和宾语、定语和中心语、状语和中心语等,在组织句子时,由于没有注意照顾它们之间的配合,结果造成了搭配不当的毛病。 (一)主语和谓语搭配不当 主谓搭配不当是常见的毛病。请看下面的例子: (1)*修建高速公路是很必要的,但是应该看到,我们国家的经济基础还比较低,还不能一下子省与省之间都通高速公路。 (2)*生活告诉人们:急躁的人,事情一旦办不成,往往容易转化为灰心丧气。 例(1)“经济基础”不能与“低”搭配。如果要保留“经济基础”,可以将“低”改为“薄弱”;如果要保留“低”,可以将“经济基础”改为“经济发展水平”。例(2)“人……转化为……灰心丧气”显然不通。“转化为”三个字完全是多余的,应删去。

有些主语与谓语搭配不当的毛病比较隐晦,需要作些分析才能发现。例如: (3)*你刚18岁,正值青春茂盛之时。 (4)*这篇通讯的作者有很好的理论修养,所以立意很深。 例(3)“你……正值……之时”没有错,但“之时”前一加上“青春茂盛”这个定语就使主语“你”与谓语“正值青春茂盛之时”就不搭配了。人怎么能像植物那样“茂盛”呢?把“茂盛”删去,句子当然通了,但念着还是别扭。比较好的改法是,将“青春茂盛之时”改为“青春年华”。例(4)是个因果复句,单就每个分句看,似没有语法错误;但读者读到后一个分句“立意很深”,总觉着别扭。“立意很深”是陈述那个成分的呀?从句子结构上看,“立意很深”该是说明“作者”的,因为后一个分句是承前省略了主语,那省略的主语该是“通讯的作者”;但从意思上说,“立意很深”该是用来陈述“这篇通讯”,因为“立意很深”只能用来形容作品内容,不能用来说明人。所以这个句子的毛病也属于主谓搭配不当的语法错误。 下面的例子是主谓搭配不当的另一种情况:

编译原理词法分析器语法分析课程设计范本

《 编译原理词法分析器语法分析课程设 计 -

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级级 学号 2723 姓名林苾湲 西南交通大学信息科学与技术学院 12月 目录 课程设计1 词法分析器 (2) 设计题目 (2) 设计内容 (2) 设计目的 (2)

设计环境 (2) 需求分析 (2) 概要设计 (2) 详细设计 (4) 编程调试 (5) 测试 (11) 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 设计题目 (14) 设计内容 (14) 设计目的 (14) 设计环境 (14) 需求分析 (15) 概要设计 (16) 详细设计 (16) 编程调试 (24) 测试 (24) 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(能够是c语言的子集)。 二、设计内容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: .硬件 (1)Intel Core Duo CPU P8700 (2)内存4G

.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 .编程语言 C#语言 五、需求分析 .源程序的预处理:源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 .单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号能够划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float 等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 .将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 .可选择性地将结果保存到文件中。

相关主题
文本预览
相关文档 最新文档