编译原理课程教学

2024-05-26

编译原理课程教学(共9篇)

编译原理课程教学 篇1

引言

编译原理是高等院校计算机专业继“数据结构”、“计算机原理”等专业基础课之后的又一门重要的专业基础课, 以形式语言与自动机理论为基础, 讨论编译程序构造的基本原理[1]、基本设计方法和主要实现技术。通过本课程的学习, 能深化学生对计算机信息处理本质与计算机工作过程的认识, 加深对程序设计语言的理解, 为后继专业课程的学习奠定坚实的理论基础, 并将编译程序构造的基本原理和技术应用于一般软件的设计。因此, 努力提高这门课的教学效果, 使学生真正掌握这门课的精髓, 并应用到实践中去, 具有非常重要的现实意义。

1 编译原理课程现状与问题

编译原理课程由于理论性强, 具有严密的逻辑性, 应用其他课程的知识较多, 学生在学习过程中感到内容抽象、算法复杂、难于理解, 学习起来有一定的难度, 因此, 编译原理被普遍看做是计算机专业本科教学中最难讲解、最难学习的课程之一, 在教学上不同程度的存在以下几个问题。

1.1 理论知识抽象难懂, 学生有畏惧心理

这门课程主要讨论编译的基本理论和编译器构造的基本方法, 涉及的理论知识抽象、难懂, 如形式语言与自动机理论、语法制导翻译以及各种算法, 又综合运用到前面所学的相关课程的知识, 确实具有相当的难度, 使得学生产生了畏惧心理。此外, 不少学生认为学习这门课将来只能用于编译器的设计上, 而大多同学将来都不太可能去从事编译器的设计工作, 因此普遍认为这门课没有用, 学习热情不高。

1.2 理论课教学方式陈旧单一

目前, 编译原理的理论课大多以老师讲解为主, 很少辅之以其他形象生动的教学手段, 教学内容又大多是抽象的概念和复杂的算法, 老师和学生之间的互动很难形成, 学生觉得枯燥乏味, 慢慢就失去了学习的兴趣, 难以达到良好的教学效果[2]。

1.3 实验内容脱离实际, 不够合理

这门课程的实践环节大多要求实现一个小型语言的编译程序, 而实现一个编译程序不仅要有相关的理论知识, 更需要丰富的实践经验, 熟悉硬件系统和操作系统的功能, 对于大多数同学来说, 编程能力都相对欠缺, 实现编译程序基本是不可能完成的任务。因此, 大多同学在实验时碰到的困难太多, 无从下手, 干脆放弃努力, 也就失去了实验的意义。

2 教学探讨

2.1 帮助学生克服畏惧心理, 培养学习兴趣

根据这门课程抽象难懂的特点, 首先要帮助学生克服畏惧心理, 才能发挥他们的学习主动性。这门课的先行课程如“数据结构”、“离散数学”、“高级程序设计语言”等都是学生已经学习过的课程, 学生实际已经具有相应的能力, 老师需要的是帮助学生分析他们已经掌握的知识, 让学生对自己有足够的了解, 明白以他们已掌握的知识为基础, 有足够的能力学习掌握编译原理这门课程, 在学习之前首先消除畏惧心理。

编译程序涉及的算法、思想和实现技术除了设计编译器以外也可广泛应用于一般软件的设计实现[3], 如文本编辑器、信息检索系统、模式识别器等, 对提高学生程序设计能力和开发大型软件的能力是十分有益的。教师可以鼓励学生尝试将编译程序中的各种算法和技术应用到各个领域, 以培养学习兴趣, 激发学生的创造性思维, 培养学生的创新能力。

2.2 采用案例式教学, 把抽象问题具体化

编译原理中涉及的大量概念和算法都过于抽象, 学生理解起来非常困难, 要想获得良好的教学效果, 必须借助实例, 使抽象问题具体化。例如, 词法分析部分主要阐述词法分析器的工作原理和构造方法, 相关概念和算法较多, 可以通过一个具体的程序范例进行教学。通过编写一个读单词过程, 从输入的源程序中, 识别出各个具有独立意义的单词, 即基本保留字、标识符、常数、运算符、分隔符五大类, 并依次输出各个单词的内部编码及单词符号自身值。在课堂上通过程序的运行来展示词法分析器的工作过程。通过实例教学, 学生既加深了对理论知识的理解, 也提高了学习的积极性。

2.3 注重启发式教学, 培养学生独立思维能力

传统的教学注重教师的讲解, 学生被动的接受知识, 不利于学生思维能力的培养[4]。我们在教学中, 特别注重启发式教学, 引导学生去思考探讨。启发式教学需要教师有目的的设计问题, 有意义的提出问题, 通过问题把知识点引导出来, 学生通过思考回答问题, 寻找解决问题的途径和方法, 加深对知识点的理解。例如, LR分析法是语法分析中较难的部分, 其中包含了四种不同的分析表构造方法, 学生不好理解。在讲解时先给出LR (0) 分析表的构造方法, 引导学生发现其中的不足并进行改进, 从而引出SLR分析法, 再进一步引导学生发现SLR方法的不足, 引出LR (1) 分析法, 同样的方法引出LALR分析法。通过这样的启发式教学, 不仅破解了教学难点, 也引发了学生探究的兴趣。

通过启发式教学, 培养了学生独立思考问题、发现问题、解决问题的习惯和自主能力。学生也在这个过程中通过自己的学习活动获取知识, 发展能力。

2.4 现代化教学手段和板书相结合, 提高学习效果

编译原理课程内容抽象, 知识点多, 要想取得良好的教学效果, 必须借助形象化的教学手段, 构建多媒体环境下的教学环境。利用多媒体设施、电子教案、教学网站等多种途径把知识化静为动, 寓教于乐。为此, 我们精心编制了多媒体课件, 用Flash技术制作了动画, 可以生动形象的演示抽象概念和复杂算法。这样不仅激发了学生的学习兴趣, 也加深了学生对理论知识的理解。但是采用多媒体教学也不能完全抛弃板书, 因为板书灵活, 可以随时补充。所以在教学中应做到多媒体教学和传统的板书教学相结合。

2.5 精心设计课程实验, 加强学生实际应用能力

编译原理是一个理论和实践并重的课程, 但是如何组织实验内容始终是教学中的一个难题[5]。目前普遍的做法是实现一个小型语言的编译程序, 而这并非一件容易的事情, 对于编程能力都还欠缺的学生来说, 实现完整的编译程序基本是不可能完成的任务。因此, 大多同学在实验时碰到的困难太多, 无从下手。对此, 我们的做法是提供给学生程序源代码但是空出关键模块, 学生只需完成关键模块的编写, 大大降低了实验的难度, 也使学生可以集中精力解决关键问题。在实践环节中, 根据学生的能力、性别, 采用互补的搭配方式把学生分为若干小组, 每组设小组长负责实验的学习讨论并对各成员进行分工。每一次实验结束后, 各个小组以小组长为代表汇报自己的作业, 由其他小组自由提问, 实现各个小组之间的交流, 分享各组的实践成果, 互相借鉴, 很好的激发了大家的学习兴趣。

3 结语

编译原理课程作为计算机专业的一门重要专业基础课, 对于提高学生的计算机专业素养具有重要的作用。本文分析了目前教学中存在的问题, 并从教学实践出发, 对如何调动学生积极性从而真正提高教学效果总结出了一些有效的教学方法, 在实际教学中也取得了良好的效果。由于课程的复杂性和抽象性, 还需要不断地探索更合理的教学方法, 提高教学质量。

参考文献

[1]朱文华, 王荣波.基于建构主义的编译原理实践教学研究[J].杭州电子科技大学学报:社科版, 2008 (4) :67—70.

[2]舒忠梅, 李文军, 周晓聪.编译原理教学改革实践初探[J].中山大学学报:自然科学版, 2007 (S2) :101-104.

[3]莫雷.教育心理学[M].广州:广东高等教育出版社, 2003.

[4]何炎祥.现代教学理论指导下的“编译原理”教学综合改革[J].计算机教育, 2005 (03) .

[5]姚雪梅.《编译原理》课程的教学探索[J].重庆交通学院学报 (社会科学版) , 2003 (02) .

编译原理课程教学 篇2

针对学生简单地把编译原理课程局限在编译器设计上的认识误区,教师在授课和实验过程中需要注意结合实际中运用编译技术的实例,比如常用的文本编辑工具中,很多带有字词的检查和校验功能,这就是编译原理技术中词法分析技术的具体应用;很多应用系统中对用户输入的字符串进行规则检查时常用正则表达式;网络搜索引擎对文档资源进行特征分析、提取与描述等工作中都用到编译的相关知识……通过各种现实生活中的实例让学生明确编译原理所学习的知识不仅是计算机专业理论知识的重要组成,而且编译程序所使用的一些原理、方法和技术在非编译系统的实际应用中也发挥了很大作用。

在进行实验设计时,除了原理性实验,可以根据学生的兴趣,安排一些应用型的实验,如简单的智能输入法的实现、识别某些单词的简单聊天机器人程序等,这样的小实验可以激发学生的学习兴趣,学生在这些应用性趣味实验中遇到了困难,自然会进一步深入学习教材中的原理,这样对基础理论的掌握也会更加牢固。

2.2实验内容的改进

国内外的一些经典教材中,通常会采用一种模型语言的编译程序作为实例,如吕映芝等人编著的《编译原理》是以PL/0语言的编译程序为范例,Alfred V. Aho等人编著的《编译原理》先通过一个小的编译程序范例给学生带来对编译程序的直观感受。通过实例的学习,可以降低学生的学习难度,也可以辅助学生对原理加深理解。在设计实验时,可以更大地发挥这些实例的作用,事先让学生阅读这些实例的源代码,然后增加一个准备性的实验,要求学生结合已经学习过C、C++或JAVA等高级程序设计语言,自行对词法规则和语法规则的简化和裁减,设计出适合自己实验难度的模型语言,并给出文档描述。通过安排这个准备实验,促使学生复习必须的基础知识,增加学生查阅资料的能力和阅读源代码的能力,在学生的认知结构上起一个铺垫的作用。

词法分析、语法分析试验是编译原理实验的重点。在实验内容上,对一些比较复杂的实验进行拆解。词法分析实验可以拆分成三个小实验:设计源程序扫描器,去除空格和注释及其他无关字符后得到单词的集合;用自动机识别无符号数或某类单词;设计识别关键词、标识符等其他类型单词的识别程序。对语法分析实验,可以首先以典型的算术表达式文法为例,设计一个算术表达式文法的递归子程序分析实验,然后在此基础上安排其他的语法分析实验。这样在内容上也分成了若干层次,更加符合由简单到复杂、由特殊到一般的认知规律,也能够满足不同知识结构和能力水平的学生在实验中都能得到锻炼提高的目的。

实验难度的设计上应该体现出层次性,形成“阶梯状”的难度层次。每个实验要求分为基本要求、较高要求和探索性实验要求三个层次,基本要求即最低要求,所有学生都能完成的难度,鼓励成绩中上的学生完成较高要求,采用成绩加分、表扬等一些激励机制,提高兴趣,为一些学有余力的同学准备探索性实验。既能让优秀的学生“吃得饱”,也保证让所有学生“吃得了”,避免一部分学生因缺乏难度挑战失去兴趣而另一部分学生因门槛太高而无从下手的情况发生。比如在“利用自动机识别无符号数”的实验设计上,基本要求是能够识别整数,较高要求是识别带小数的无符号数,更高要求是能识别带指数形式的无符号数,将这一实验题目分成三个层次后,不同学习水平的学生都能够在一个学时内完成实验,对自动机这一重要工具也有了初步认识,达到了实验目的。

2.3实验组织形式的改进

在实验的组织上可以采用协同式学习,以小组为单位,通过教师所提供的实验任务进行分析、讨论,明确需要解决问题的方法,经过一系列的协同学习活动,完成既定的任务,加深对所学知识的理解。这种组织形式可以培养学生的团队协作能力和学生之间的相互交流和相互学习。因为学生之间的年龄相仿、认知水平相似,交流起来会更加顺畅和有效。在这个过程中能够提高学生的参与感,而且通过团队协作解决困难,会给学生更多的积极反馈和成就感。

在实验内容的设计上,要便于学生进行协同工作,具有可操作性和合作性,确保小组中每个成员的任务饱满。在小组分配上,根据学生的兴趣让其自由结合小组,再根据学生的学习能力做适当调整,根据学生的性格特质等不同特点让其在小组中承担不同角色,如设计人员、开发人员、文档撰写人员以及兼任的汇报答辩人员等。实验实施阶段是协同模式中最重要的一个阶段,在这个阶段小组要对下达的实验任务进行分析,明确任务的基本要求,掌握解决问题的方法及需要具备的知识,在教师的帮助指导下进行小组的内部分工及职责的落实,进行协同学习,同时教师要对学生实验完成情况进行及时的检查和指导,直到最终共同完成小组的任务。

传统的独立模式的实验中对学生的评定比较简单,根据个人的完成情况给出成绩。采用分组式协同模式后,实验成绩的评判要做相应的调整,不仅要考核每个学生自己承担的任务完成情况,还要考核小组共同完成情况。考核的内容仍然包括程序和实验报告,但除了对每个学生独立完成的程序模块进行检查外,还需要对小组共同完成的整个任务情况进行验收,可以采用汇报和答辩的形式进行,每个小组推选答辩人在面对所有学生进行汇报,然后接受教师和其他小组的提问并进行答辩,最终成绩的评定除了个人评定之外还有小组评定,对小组成绩进行排序以鼓励小组间的竞争。

3总结

《编译原理》课程教学改革探索 篇3

但是,编译程序是一个庞大和复杂的系统软件。它所包含的算法和思想理论性强且抽象度高,计算机专业学生普遍反映,编译原理课程是一门比较难于理解和掌握的课程。如何让这门课程的教学效果达到令人满意的程度,是《编译原理》教师普遍关注的问题。该文通过分析目前《编译原理》教学过程中存在的问题,对《编译原理》课程教学改革提出了一些新的方法和见解。

1“编译原理”课程教学现状

《编译原理》课程在目前教学中出现的主要问题有:

1)课程内容抽象难懂,采用传统的灌输式的授课方式,教学手段单一,无法激发学生学习兴趣。编译原理课程中的概念和算法大都以符号、自动机、上下文无关文法、属性文法等抽象程度较高的复杂形式描述,教材内容显得比较枯燥。如果教师在教学中又以传统的灌输式教学为主,那么因为理论知识较抽象,在整个的教学过程中学生被动地接受知识,教师很少考虑学生的需要和态度,就会让学生觉得授课内容枯燥乏味,学习缺乏主动性,影响教学效果,造成理解难度大和教学难度大的情况。

2)学生觉得编译技术在一般的软件开发中应用不多,学习积极性不高,难以让学生对这门课程的学习形成主动性。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。同时,学生感觉教材中理论知识很难又不实用,所以学习积极性不高。但是和数据结构课程做比较,数据结构课程的很多内容也比较复杂和抽象,但是学生的学习积极性明显很高,看来内容的抽象并不是造成这门课程难讲、难学的唯一原因,造成这种现象的还有一个重要因素是,课程内容实用性的广度不同。数据结构课程中的很多内容如:栈、队列、图、排序和查找算法,学生在一般的软件开发中都会经常用到,即使用频率很高,学生觉得有必要学习即使课程内容难,学习积极性高,自然老师也容易教,也愿意教,学生也愿意学,教学效果就自然好。而编译原理中的很多技术,比如形式语言理论,LL和LR语法分析算法,属性文法,代码优化技术等,学生觉得这些技术只有在翻译器的开发中用到,而自己一般也不会从事这方面的软件开发,加上这些技术的理解难度和上机转换成程序的难度明显比先前学过的课程难度大,所以学习主动性不高。

3)先修课程知识掌握不牢,增加学习本课程的难度。编译原理课程一般是在大三开设,它的先修课程在大一和大二学习,如果学生在之前的课程学得知识不太好,那么对这门课程的学习过程中就会觉得难度很大,影响学习效果,比如数据结构的“栈”,如果学习不好,就直接影响学生语法分析器的理解和上机实现。

4)课程的课时有限,有的高校上机实践环节无法有效实施。由于教学改革,很多高校对包括本课程在内的许多专业课的授课课时进行了压缩,在一定程度上给教学增加了难度。有的高校对本课程没有开设实验课,仅仅学习了一些编译理论与算法,只有理论没有实践,使得学生无法将抽象的编译理论知识具体化和形象化,就难以对基本概念和方法正确地理解和运用,也无法全面系统地掌握了编译器的构造过程,缺乏上机实践,就会影响教学效果。

2“编译原理”课程教学现状

针对以上在课程教学中出现的问题,该文提出了以下一些教学改革措施:

2.1 合理选用教材和参考书,保持教学内容的时代性和先进性

从教材建设方面看,教材坚持“基本概念严谨,基本方法灵活”的论述方法,既注重科学性也注重通俗性,文笔平实、通顺,易于理解。同时教材应该符合《中国计算机科学与技术学科教程》最新版的要求,真实反映当前程序设计语言翻译领域的核心知识,摒弃了部分陈旧内容及过时技术,并在此基础上增加适应新发展方向的内容;或对现有教材进行改版以满足新的教学要求。著名计算机科学家和教育家Alfred V.Aho所著的《编译器:原理、技术与工具》英文原版教材和翻译本可以作为主要参考书。增加配套实验教材,实验题目应该难度适中。合理选用教材和参考书,保持教学内容的时代性和先进性科学授课,可以充分调动学生的积极性和创造性。

2.2 科学授课

2.2.1 类比教学

使抽象内容形象化。事物之间存在着普遍联系,知识之间也存在联系,因而在教学过程中教师应该注意到这种联系,可以行之有效地运用这种联系的方法就是类比教学法。为提高课堂教学的效果,类比教学方法和值得推广。比如在讲高级程序设计语言的语法分析器的时候,涉及一个非常重要的内容:上下文无关文法。在讲的时候,可以先以自然语言文法为话题来引入。

以一个简化的自然语言文法为例:

句子→主语谓语宾语

主语→你

主语→我

谓语→是

宾语→定语宾语

定语→可爱的

宾语→男孩

宾语→女孩

以上文法描述了一个简化的语言模型,该文法可以用来验证某个句子是否属于该语言模型。比如,验证“你是可爱的男孩”是否为合法的句子,实际上就是从“句子”出发,反复把上述规则中的“→”左边的符号替换成右边的符号的过程,如下:

句子=>主语谓语宾语

=>你谓语宾语

=>你是宾语

=>你是定语宾语

=>你是可爱的宾语

=>你是可爱的男孩

则表明这个句子符合该文法描述的语言模型,即为合法的句子,否则为不合法的句子。这个例子中,文法G(VN,VT,S,P)可很容易地被学生理解。每个规则是文法的一条产生式P,而“句子”,“谓语”,“宾语”,“定语”就是非终结符VN,其中,“句子”是文法开始符号S,该文法的所有的句子都是由它推出的,“你”,“我”,“可爱的”,“男孩”,“女孩”就是终结符VT。由此例再引出“直接推导”的定义。“直接推导”,就是将产生式左部的非终结符替换为合适的产生式右部的过程,可以用“=>”来表示“直接推导”。同时,“语言”的定义也可以很容易地理解,就是从文法开始符S出发,通过推导得到的所有句子构成的集合,就是这个文法所描述的语言L(G)。经过以上分析,授课内容过渡到高级程序设计语言的语法分析器的开发途径,就是,需要对高级程序设计语言构建一个工具来描述这种语言的语法结构,这个工具就是上下文无关文法,上面的例子清楚地说明了文法G的主要概念。通过采用类比教学法,学生也容易理解和接受抽象理论。

2.2.2 温故而知新

编译原理是许多课程的一个综合性的实践。在课程讲授中,应注意将教授的课程内容与先修课程相关联,一方面起到温故而知新的作用,提高对程序设计语言、算法、软件开发理论的理解,另一方面也促进学生考虑问题层次的迁移,可以使学生体验到这些先修课在系统软件开发中的作用。比如在讲整个编译器符号表管理时,会涉及到散列表;讲自上而下语法分析器和自下而上语法分析器时候,会涉及到语法树和栈;在讲属性文法和中间代码优化的时候,会涉及到图,这些都是数据结构知识在系统软件开发中的实际应用;还有如运行时存储空间分配,会涉及操作系统的知识;目标代码生成部分的内容会涉及汇编语言以及计算机组成原理等课程的内容,这些内容在编译原理中再次学习并应用,会起到温故知新的作用。

2.2.3 变“填鸭式”为“启发式”

“填鸭式”教学方式是教师为主体,学生被动学习的一种传统教学模式。而启发式教学是利用有限课时讲授重点内容,给出重要结论之前先提出一些问题,让学生思考。比如在讲词法分析器的设计这一节时,教师可以先提一个问题,即考虑在给定输入是高级语言源程序,输出是该程序的单词二元组(Token)形式的前提下,怎么去设计词法分析器,也就是怎么把源程序的字符流转换成单词流,可以让学生先思考,然后鼓励他们发表自己的见解,而不是由老师直接讲出该部分涉及到的知识:预处理、正则表达式、超前搜索识别、状态转换图、确定有限自动机(DFA)、非确定有限自动机(NFA)等非常抽象的理论。这种方法激发了学生的思维,由以往的老师直接讲,直接灌输的填鸭式教育,变成学生主动去思考、去实现的启发式教育,能够收到更好地教学效果。

2.2.4 多媒体与传统板书相互补充

板书和PPT各有优势,通过合理分工,可以使学生更好地理解讲授的内容。对于在授课过程中需要长时间对照参考的内容、复杂的推导步骤、难以在一张PPT中展示的内容,可以采用板书的方式讲解。而对于课本的核心内容、扩展内容、抽象内容的图形化或动画演示可以采用PPT的方式讲解。如在讲授程序句子递归下降法语法程序执行过程时,可以运用ppt的动画效果,直观地描述文法符号对应的程序递归调用的变化过程,抓住学生的注意力,增强了学生学习的兴趣,如图1所示。这和手工分析相比,即清晰又避免了长时间的手工书写过程;同时,PPT页面容量有限,有时候无法同时将某些显示给学生,影响教学,这些内容是可以板书出来,配合PPT演示,这样会取得更好地教学效果。

2.2.5 开发多媒体辅助教学软件

讲课时,采用文字、动画、图形等多种媒体,可以使内容充实,形象生动。对书本中死板的知识赋予活力,使学生在轻松的学习环境中掌握更多的要领。软件以多媒体动画的形式生动形象地描述了编译器的各个阶段的工作过程。借助现代化的教学手段和工具,将抽象的知识具体化、形象化,便于学生理解复杂的原理,极大地调动了学生的学习积极性,学习效果有了明显的提高。比如:LL(1)分析法、移进归约分析法就可以采用FLASH动画演示,模拟语法分析过程,实现分析表和分析栈的状态跟踪。

2.2.6 将学科发展新内容引入教学中

在课堂授课上,首先注意将学科发展新内容反映到教学中,以丰富同学们的知识结构和拓展同学们的思路。很多学生在学习的时候,只是就编译技术学习编译技术,只知道在开发编译程序的时候会用到哪些理论,但是并不了解这些理论在编译技术之外的广泛应用。新的教学方式不能只是枯燥地讲解编译理论,而是应该在介绍编译技术的同时,介绍一些所学内容的学术前沿,使学生有强烈的学习和研究的冲动。编译技术在当前已经广泛应用于编译器构造之外的其他领域,比如:常用的文本编辑工具的实现;浏览器对HTML、XML的解析;网络检索;网络协议解析、信息安全领域;软件测试领域;中文叙词表的有效性检验程序;虚拟机、多核编程、嵌入式程序设计领域。这些新信息、新内容的引入,将有助于让学生对所学内容产生兴趣,同时加深对所学知识的正确认识,对于今后从事系统软件和应用软件的开发以及计算机的相关工作都是非常有好处的。

2.3 注重实践环节,强调能力培养

实践性教学是课程教学体系中一个不可缺少的重要环节,对学生创新能力的培养,综合素质的提高,具有不可替代的作用。编译原理实践性教学的设计思想是使学生通过课堂学习,理解编译原理的同时,注重学生实践能力的培养,进一步巩固对知识的理解,通过实际的锻炼,掌握编译技术,进而能够独立的进行编译器的设计。

由于本课程在本科阶段的学习重点是编译的前端技术:文法、正则表达式、语法分析器以及语法制导翻译器,而后端的目标代码生成及优化技术在本科并不是教学重点,而是后继研究生的课程,再加上该课程的实验的课内学时一般都较少,时间非常有限,所以应该开展短学时编译原理实践教学设计,所以可以要求学生实现一个受限语言的词法分析、语法分析、语义分析和中间代码生成功能的基本编译器即可。实验课实施策略,采用在课程理论课的进行中,加以适当引导,同时让学生在课下前做好设计,根据课程教学内容的开展,让学生在有限的上机时间内完成了实践。编译程序实验课,前一个实验的输出结果要为下一个实验所用,所以前一个实验的完成好坏直接影响下一个实验的开展,所以教师要对学生每节实验课的完成情况进行有力监督和指导,同时进行随堂评分,以激励和督促学生完成上机作业。

2.4 建设编译原理资源网站,辅助学生自主学习

由于编译原理课程内容抽象难懂,学生难以在有限的课时里掌握讲授的全部内容。建立课程的网络教学环境,将课程的多媒体课件、课堂授课视频、编译原理实例库、习题库、编译源程序、实验所需编译工具等放在课程网站上,供学生在课后使用,极大地方便了各类学生的不同需求,使教师的课堂在课后得到了有效的延伸。同时,还可以通过网络平台提供的多媒体交互手段让师生进行有效的沟通,答疑解惑,同时也可以缓解目前学生人数增多,教学资源不足,学生质量参差不齐,教学质量和效率得不到保证的情况,为该课程的教学提供强有力的支持。

2.5 教师队伍培养

教师应该承担过实际编译程序或相关系统软件的研制,具有丰富的教学经验和科研能力。紧密跟踪与编译原理相关的学科国际学术前沿,不断更新教学内容,以保证教学内容的先进性,并将科研中遇到的问题作为教学的典型案例在课堂中进行讲解,将科学研究的最新成果不断充实到教学过程之中,并且将科研项目进行必要的分解,组织部分优秀的学生参与项目开发,使学生切实体会到理论成果在技术实践中的完美应用,深刻理解理论与实践相结合的意义和具体途径。

2.6 学校与公司合作,共建课程

学校可以和国内外和编译工具软件等相关的计算机公司签订培训协议,推荐学生到其公司进行专业实习和暑期实践,为学生提供到公司进行实践的机会,使学生能够更深刻了解课程知识的发展应用,同时培养学生的问题求解能力和软件开发水平;另一方面,聘请公司的资深开发人员、高级技术专家等人员到学校做讲座,讨论编译原理课程内容及其应用的热点问题等。学校和公司联合教学,共同提高学生的课程学习效果,多方面提升学生的能力和素质。

3 总结

编译原理是计算机专业的核心课程,它对培养高水平的计算机专业人才有重要作用,同时可以培养学生计算机思维和问题求解能力,因此是需要学生认真学习、教师认真教学的一门课程。为了使该门课程取得高效的教学成果,该文针对该课程目前的教学现状,从多方面对现有编译课程的教学提出了自己的一些改革措施。实践证明,这些措施的实施,使得学生不仅可以学习到课程的核心内容,同时还可以学习到结合现代信息发展的新的教学内容以及国外优秀教材的精华;通过在已有的教学手段的基础上,实施新的教学手段,能充分提高学生学习兴趣,有利于抽象内容的理解;通过上机实践,学生能有效提高自己的动手能力;通过构建网站,辅助学生课外学习;通过培养师资,为教育质量提供有力保障;通过校企合作,给学生提供更多实践学习的机会、并为将来的就业打下良好基础。总之,采用合适的教学措施,将使编译原理课程的教学效果提升到一个新的高度。

参考文献

[1]陈火旺,刘春林.程序设计语言编译原理[M].长沙:国防工业出版社,2004.

[2]Alfred V.Aho.编译原理技术与工具[M].北京:人民邮电出版社,2008.

[3]Alfred V.Aho.编译原理[M].北京:机械工业出版社,2009.

[4]Alfred Aho,Ravi Sethi,Jeffrey D.Ullman.译原理[M].北京:机械工业出版社,2003.

[5]Francisco Ortin,Daniel Zapico,Juan Manuel Cueva.Design patterns for teaching type checking in a compiler.construction course[J].IEEE Transactions on Education,2007,50(3):273-283.

[6]裘巍.编译器设计之路[M].北京:机械工业出版社,2011.

[7]Thomax Pittman James Peters.编译程序设计艺术[M].北京:机械工业出版社,2010.

《编译原理》课程设计要求 篇4

课程设计的具体内容以传至QQ群共享《编译原理课程设计具体内容.ppt》中,由于学校没有足够大的机房供我们课程设计,所以课程设计采取单独辅导形势,同学们有任何问题,可以来我办公室答疑。

设计报告提交要求

1提交的内容:

验收经过测试的程序

提交设计报告。报告可以包括以下内容:

<1> 任务与目的<2> 软件设计

a.软件的总体结构与模块划分

b.关键算法与重要数据结构

<3> 测试例程设计与测试结果分析

<4> 总结、体会、改进建议等

2.课程设计报告的字数(包括图表)不得少于10000字。

3. 禁止课程设计抄袭,发现原文抄袭网站或报刊内容以零分记。

4.禁止课程设计雷同,发现雷同以零分记。

提交方式

1.要求提交《课程设计报告》打印稿。

2.A4纸张排版,格式参考学年论文规范。

3.在提交论文时填写课程设计封面,详细注明课程名称、题目、学号、姓名、年级、专业班级等基本信息。

4.解释程序源程序(由各班班长统一用U盘拷贝给我)。

时间要求

第19周周五前,按班为单位,各班班长负责提交,过期不再受理,不记成绩。

《编译原理》课程教学改革探讨 篇5

编译原理是计算机科学与技术专业中比较重要的专业课程, 特别是对于今后将从事计算机软件工程的技术人员来说, 编译原理技术是极为重要的基础知识之一。

编译原理课程主要介绍编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。编译器的构造综合了计算机科学的各个方面, 包括计算机理论、程序设计、软件工程、数据结构等, 是理论性强同时也是理论应用于实践的成功典范。虽然绝大多数的程序设计和开发人员不需要写自己的编译器, 也不一定非要读懂任何编译器的代码, 但是编译程序构造的基本原理和技术广泛应用于一般软件的设计和实现, 因此很好地掌握编译原理这门课程, 可以更加深层次地理解程序语言和内部机制, 对以后从事计算机项目开发, 很多思想可以借鉴, 受益匪浅。

2 编译原理课程的教学现状

我们是新建的本科院校, 并且学校坐落在民族地区, 学生在平时的学习中与外界的实践接触较少。对于计算机学科来说, 这使得很多课程的教学偏重理论, 显得枯燥, 增加了难度。特别对于编译原理这门课程, 接触过的老师和学生大概都有相同的感受:这是一门“难教难学”的课程, 甚至大多学生认为这是计算机高年级课程中难度系数最高的课程, 内容比较抽象、理论性很强、对实践要求高。

2.1 没有清楚认识课程的学习意义

在学习过程中, 学生大多理解这门课程只是介绍编译程序的构造, 而自己以后很少会涉及从事编译器设计工作, 因而认为没有实际应用价值, 没有真正领会这门课程在整个计算机知识系统以及理解软件理论和开发方法上的潜在意义。

不管是国内还是国际知名高校, 从本科、硕士到博士都有关于编译原理课程的整体规划设置, 这足以说明该课程在计算机专业中的位置是不可忽略的。

2.2 学习兴趣和热情的严重缺乏

学生理解的不实用思想导致了学习兴趣的大幅下降, 被动的学习加上课程本身的难度和深度使得学生的学习积极性降到了低点。较多的学生反映课堂上能听懂老师的例题讲解, 但是由于没有真正把知识点落实, 课后独立完成习题觉得很困难, 慢慢地产生畏难情绪, 如此的恶性循环滋生了对课程学习的强大障碍。

2.3 纯理论式的传统教学

在前些年编译原理课程的教学中, 理论教学比例过大甚至忽略了实践教学, 没有真正将实践和理论结合起来。在课堂上老师扮演着主要角色, 采用传统的教学模式, 以教师为中心、老师讲、学生听, 没有更好地调动学生的积极性, 因此教学效果也不是那么好。

2.4 课程实践的匮乏

编译原理的实践教学所占比例小, 教师和学生都忽视了实践教学在整个课程中的重要性, 脱离了实践的理论学习会显得更加枯燥和抽象。目前课程设置中增加了实践教学, 但是由于编译原理的实验题目偏难, 并且需要实践者有足够的理论基础和较强的编程能力做支撑, 所以大多数学生仍然觉得编译原理的实践是件棘手的事情。导致了学生对编译原理的理解往往停留在书本的理论概念上, 不明白怎样才能把理论应用到实际的编译程序设计中。

3 推进编译原理课程的教学改革

由于编译原理课程涉及的理论知识多, 可研究性强, 应根据学生的实际情况选择合适的教材、运用适当的教学模式来组织教学内容、理论实践相结合, 以更好地提高教学效果, 满足不同层次学生的需求。

3.1 教材的改进与选择

现在程序设计语言已经从过程式转向对象式语言, 比如C++、C#、Java等就是目前在软件设计中流行的面向对象的编程语言, 程序设计模型的变迁带来了算法描述工具的变化。面向对象语言已经成为高校计算机专业课程的主流语言, 社会上的计算机应用领域也大量使用面向对象语言手, 各种电子产品的嵌入式软件非常广泛用到面向对象技术。在这样的背景下一些程序设计的后继课程诸如数据结构等也进行了同步的改进, 已出现了用Java或者C++描述的数据结构教材, 但是大多高校使用的编译原理教材还是没有大的变化, 教材中的编译算法和模型仍然用C语言甚至Pascal语言来描述。

这种主要关注面向过程的编译技术的教材, 会让学生觉得编译原理课程和当前的程序设计应用较为脱节。因此对面向对象编译技术的研究迫在眉睫, 分析面向对象技术后台的编译系统是非常有必要的, 这样更贴近应用, 更利于培养学生的学习兴趣。由此, 我们可以选择用对象式语言描述编译算法和教学模型的编译原理教材, 将面向对象的编译技术有机结合到教学中。例如目前国外或者国内某些高校选择的用Java语言描述的编译原理新教材, 其中像高等教育出版社出版的《现代编译程序实现——Java语言》 (影印版) 教材可视为典型。改进后的教材在编译原理前面部分的词法分析和语法分析被人上变动很小, 主要增加了针对面向对象语言的语法结构及其语义特征, 着重从类及类的继承结构上, 讨论编译实现技术及构造面向对象编译器的思路;在后半部分的语义分析、代码生成等内容上调整幅度较大, 面向对象的作用域特性、类的封装、继承以及多态的典型特性都将体现在教材中。

3.2 教学模式的转变

打破传统的以教师为中心、一味灌输式的教学方法, 采用更能激发学生兴趣和潜能的“以学生为主, 师生互动, 实例教学”的教学模式。在教学中, 教师扮演好传授、指导、组织和帮助的角色, 利用问题及情境等充分发挥学生的主动性、积极性和创造性。

在这种教学模式下, 教师在课前要做更为充足的准备, 对整个课程体系要非常清楚。重要章节的知识点在课堂上结合实例做详细讲解, 而对于容易点的内容, 老师首先提炼出核心问题, 让学生带着问题自主学习。第一阶段结束后由学生讲解, 展开课堂讨论, 最后教师再总结归纳。这样学生不再是只带耳朵来听课的机器, 更多的时候由他们来主导控制课堂, 由完全的被动转化为主动, 将会大大地提高教学效果。当然在这个过程中教师要有足够掌控课堂的能力, 给出恰当的涵盖相应知识面的问题, 能在适当的时候做引导者促进讨论的展开, 让大多数学生能在这种互动的氛围中掌握课程的知识。

枯燥的理论转化为实例教学, 效果也是事半功倍。比如在编译原理的基础篇中, 关于词法分析、语法分析中很多理论描述都比较抽象复杂, 此时教师先不要死板地分析理论, 而是借助实例的讲解, 案例完成后再总结归纳理论知识点。这样通过实例引导学生对知识的掌握, 既提高了教学效果又营造了轻松愉快的课堂氛围, 师生互动得以更良性地发展下去。下面通过一个具体的例子简单分析“实例教学——知识归纳——案例实践——总结”的教学模式。语法分析中有个重要的内容是项目集规范族C的构造, 这是自下而上语法分析中LR (0) 以及SLR (1) 分析表的关键, 但是关于文法的项目集规范族的构造算法描述复杂, 我们从案例出发引导学生推导到算法规则。例如:文法G[S]为E→a A∣d, A→c A∣d, 要给出该文法对应的项目集规范族C。教师先讲解例子;再归纳出求解过程:首先拓广文法, 引入一个新的非终结符S’作拓广文法的开始符号, 构成项目S’→S作为唯一的接受态, 用closure ({S’→.S}得到初态的项目集;对初态集或其他构造的项目集求go (I, x) , 得到新状态J的项目集;重复前面两个步骤直到不出现新的项目集为止;接着分析算法;最后把布置练习题。让学生在老师分析的基础上自主完成练习, 领会算法的思想, 这样比直接分析长篇幅的算法效果更加明显。

3.3 课程实验的深化

目前学校提倡“本科学历 (学位) +职业技能素养”的办学模式, 把实践教学提到了相当的高度。整个课程体系及人才培养方案都在强化实践, 同时编译原理课程属于技术学科, 必须注重理论与实践的有机结合, 深化课程实验的重要性, 加强对学生实践动手能力的培养。众所周知, 编译原理的实验难度很大, 有的编译器实现程序代码多达十几万条指令构成。因此我们一定要避免直接让学生分析和设计编译器, 要循序渐进, 按照高级程序语言的编译过程模块化地设计实验, 同时结合系统的编译原理实验教材指导学生逐步深入地进行课程实践, 真正地把实践教学落到实处。

分层次制定课程的实践环节。最初可以借助面向对象编程语言的编译模型工具生成简单代码的词法分析和语法分析程序, 让学生理解代码的程序结构;在此基础上添加语义动作, 理解虚拟机生成代码;最后扩展教学模型, 分层次构造完整的编译程序。在综合实验部分, 教师可以设置好程序代码框架, 甚至提供源代码将关键模块挖空, 指导学生完成核心代码的编写与调试, 有方向性地指导学生完成课程设计, 以此让他们能投入更多的热情与精力去实际地开展有深度和广度的课程实践, 促进理论的进一步掌握。

4 结束语

总之, 编译原理在高校计算机专业课程体系中的地位是不可忽视的, 我们需要与时俱进, 适当调整课程教学的体系和内容, 以更好地顺应计算机技术的发展。怎样在有限的学时内让学生既能掌握扎实的理论, 又能切实提高实践的能力, 这是编译原理课程教学面临的难题。教师应通过优化教学改革、不断探讨, 采用多样的教学手段、灵活的教学方法, 不断地提高编译原理课程的教学质量。

摘要:以新建本科院校为背景, 从学生学习兴趣、教师教学、课程实践等几个方面分析了当前编译原理的教学现状, 提出了对教材、教学模式以及课程实验的基本改革思路, 用以提高编译原理教学效果。

关键词:编译原理,教学改革,面向对象,实例教学

参考文献

[1]何炎祥, 伍春香.计算机专业不需要开设编译原理课程吗[J].计算机教育, 2009, (4) .

[2]Alfred V.Aho, Ravi Sethi.编译原理技术与工具 (英文版) [M].北京:人民邮电出版社, 2010

[3]胡学联.编译原理课程的调态与转型[J].计算机教育, 2006, (11) .

编译原理课程教学 篇6

“编译原理”是计算机科学及相关专业的一门核心专业基础课程, 由于涉及形式语言、有穷自动机等抽象内容, 学生在学习过程中存在较大的困难, 被戏称为“天书”。该课程主要介绍了高级程序设计语言编译系统的构造原理、设计方法以及主要实现技术, 综合了离散数学、数据结构、算法设计与分析、形式语言与自动机、程序设计原理、程序设计语言等知识, 具有概念多、理论性强等特点。学生通过系统地学习这门课程, 不仅能够了解编译系统内部的工作原理, 加深对程序设计语言的真正理解, 而且还能有助于提高学生的计算机思维能力、实践动手能力和综合运用专业知识的能力。

一、编译原理课程教学存在的问题

长期以来, 由于编译原理课程具有较强的理论性和实践性, 学生在学习过程中感到很吃力。究其原因, 总结起来主要有以下两个方面的问题。

1. 课程本身理论性太强

该课程内容丰富、抽象, 且具有严密的逻辑性, 它除了具有自身的一套理论体系, 还涉及到大量的其他课程的理论知识, 如形式语言与自动机理论、离散数学、算法等。对于本科生而言, 要学好这些理论本身就有一定的难度。

2. 实践性环节比较薄弱

编译程序是大型复杂的软件系统, 其实现涉及到若干课程, 综合性、连贯性均很强, 学生实验难度很大, 因此, 很多教师对实验重视不够, 实验内容安排也比较随意, 导致实验效果较差, 影响学生动手能力的提高。

笔者长期承担“编译原理”课程的教学工作, 结合多年的编译原理教学实践, 针对以上问题, 从以下几个方面入手进行了教学改革和创新, 积累了一定的经验, 取得了良好的教学效果。

二、明确课程与计算机专业人才培养目标的关系

目前, 按照我国高校的教育现状, 其人才培养目标大致可以分为学术型人才培养和工程型人才培养。学术型人才在取得本科学位以后, 可能会继续学业到硕士或博士阶段, 将来的主要职业以从事学术研究为主;而工程型人才本科毕业后, 主要职业是在工业界发展, 从事与计算机有关的开发和应用方面的工作。工程型人才的社会需求量远大于学术型人才, 但是学术型人才培养对提高国家的学术竞争力至关重要。虽然本科培养方案中尚没有进行区分, 但未来走向决定了不同类型的人才在本科阶段的基础应有区别。因此, 编译原理课程定位有必要参照这两类人才培养要求来确定[1]。对于学术型人才的培养设计一个主要以强调理论性的课程内容, 而对于应用型人才的培养则侧重于编译器的设计和实现, 提高学习编程语言及在程序开发中应用编程语言的能力。培养目标的不同, 将直接影响到授课教师对课程内容进行的剪裁。

三、优化课程的理论教学环节, 提高教学质量

1. 精选教学内容

笔者认为, 教学内容和习题应包括一些从实际碰到的问题中抽象出来的例题和习题, 鼓励学生用所学的知识去分析和解决实际问题。紧紧围绕编译的具体过程这样一条主线, 建议的主要教学内容如下。

(1) 词法分析

首先应明确词法分析的任务, 然后重点讲解词法分析器的设计过程, 如预处理、单词符号的超前搜索、状态转换图以及状态转换图的实现;接着介绍正则表达式与自动机的相关理论, 最后讲解词法分析器自动生成器工具的原理及使用方法。

(2) 语法分析

首先应介绍语法分析的必备知识上下文无关文法, 然后将语法分析分成两个大类予以介绍:自上而下的语法分析和自下而上的语法分析。自上而下的语法分析包括LL (1) 文法和递归下降分析法, 由于它们比较直观, 便于学生接受, 应首先介绍。其次, 介绍自下而上的语法分析, 它主要包括算符优先分析法和LR分析法, 由于目前的编译器的语法分析已不再使用算符优先分析法, 因此, 可以只介绍LR分析法。最后, 介绍语法分析器自动生成器工具的原理及使用方法[2]。

(3) 语义分析及中间代码生成

首先介绍语义分析的基础知识:属性文法和语法制导翻译。然后把语义分析的重点放在类型检查上。类型系统在编程语言的设计中占据重要位置, 可以先介绍一下类型系统在编程语言中的作用, 然后用语义动作来表达类型检查算法。对于中间代码的生成, 则主要介绍各种形式的中间语言, 把赋值语句和各种控制流语句翻译成中间代码的语义动作。对于类型和变量声明语句, 则主要关注怎样按语言的作用域规则组织符号表[2]。

(4) 运行时存储空间的组织和管理

对于这部分内容, 应主要介绍局部存储分配策略 (即一个活动记录中各类数据的组织) , 静态分配、栈式分配和堆式分配等三种全局存储分配策略, 非局部名字的访问方式和各种参数传递方式的实现。

(5) 优化

优化可在编译的各个阶段进行, 但最主要的一类优化是在目标代码生成以前, 对语法分析后的中间代码进行的, 这类优化不依赖于具体计算机。这部分内容建议重点介绍基于块内的局部优化。

(6) 目标代码生成

编译模型的最后一个阶段是目标代码生成, 它通常以语义分析后或优化后的中间代码为输入, 以产生等价目标程序为输出。应重点介绍一种采用简单的寄存器分配策略的代码生成算法, 让学生对代码生成有所了解。

2. 改进教学模式

对于编译原理这种理论性和抽象性都很强的课程来讲, 采用一种恰当的教学模式显得尤为重要。由于案例式教学具有实践性和形象性的特点, 刚好弥补编译课程教学难的问题, 因此, 它可以充分调动学生兴趣, 使其在分析案例、得出结论的过程中掌握理论知识。在教学过程中, 案例的主要形式是例题, 一般是具有代表性的例题或综合习题, 约占2/3的课堂时间。在课堂教学中, 合理结合黑板、粉笔和先进的多媒体教学技术, 建议相关算法理论采用幻灯片形式, 加大知识点的容量;而相应实例的讲授则建议采用板书形式, 可适当降低教学速度, 使学生有充裕的时间思考和掌握。比如, 在讲解正则式转化成等价的NFA这部分内容时, 首先把具体转换的方法以幻灯片形式快速地播放给学生看, 同时配上教师的简单讲解, 然后选取一个具体的例子详细分析, 让学生理解例子, 最后教师对例子进行小结, 归纳出一般性规律, 并让学生与前面的理论对比, 这样回过头读这些理论知识便会轻松很多、容易很多, 从而更加有助于其巩固对理论的理解。又如, 在介绍自动机、正则文法、正则表达式之间的相互转换以后, 还可以通过一道综合例题将这些知识融会贯通, 这样教学效果会更好[3,4]。为了巩固教学效果, 每次课后教师都应该有针对性地布置作业, 学生自己变为实例教学模型的主体, 教师再就作业中出现的问题安排习题课, 这样教学效果会更佳。

四、强化课程的实践教学环节, 提高学生的动手能力

实践活动是创新意识的源泉, 是创新能力的基础, 学生只有不断的在实验环节中尝试、探索、研究和创新, 才能不断提高解决工程问题的能力。“编译原理”课程对实践性要求较高, 学生在实验中掌握一些重要算法, 将数据结构、高级语言等内容融会贯通, 最终提高知识的综合应用能力。

1. 设计实验内容

首先, 要将编译理论和方法在实验中得以概括, 使学生不仅掌握它们本身具体应用, 而且掌握由这些理论和方法所构造编译程序的各个部件是如何在整个系统中协调运行, 这是实验最重要目的之一。其次, 必须合理地简化, 使学生比较容易完成。针对编译过程的五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化及目标代码生成, 分别设置相应的实验项目。这些实验项目既和理论课内容相辅相承, 同时相互之间又互相关联, 构成了一个实验整体。采用这种实验教学体系所要求的实验学时较少, 一般为20学时左右, 并且可以跟随理论教学的进度安排, 这样既可以降低实验难度, 又利于学生及时将课堂知识应用于实验[5]。当然, 也可直接将实验部分设置为课程设计, 通常是要求设计一个简单语言的编译程序, 让学生用1~2周的时间来完成。这种实验教学体系与前一种相比更难, 需要学生在对编译原理知识系统理解掌握的基础上才能完成, 更加有利于学生对编译过程的有一个整体深入的认识。

2. 规范考核形式

考核是对学生学习效果的检验, 也是调动学生学习积极性的指挥棒, 对教学目标的实现具有至关重要的作用。“编译原理”实验课程的一个难点在于如何进行成绩评定。为了均衡理论和实验, 建议实验成绩占总评成绩的30%~40%。本着公正的原则, 笔者提出阶段考核和汇总考核相结合的成绩评定方法[6]。每个实验成绩由教师面试给出, 以学生对实验理论内容的理解和实现算法的思路为主, 并要求其分析具体源代码, 从而判断学生真正掌握知识的程度, 避免抄袭。在汇总考核阶段, 由学生主动申请, 采取公开答辩的形式, 答辩优秀的可以加分。通过以上措施, 较好地避免了以往实验中经常出现的偷懒现象, 同时也帮助学生树立了荣誉感和成就感。

五、结语

编译原理是一门理论性和实践性都很强的课程, 在计算机专业的教学体系中又有着非常重要的作用, 决定了该课程教学改革的长期性。通过“编译原理”课程的学习, 学生不仅能掌握编译程序本身的实现技术, 也能加深对程序设计语言的理解, 提高开发大型软件的能力。因此, 探索该课程的教学方法, 提高教学质量是从事计算机教育的工作者必须重视和探讨的问题。

参考文献

[1]赵银亮.浅谈编译原理课程的定位.西安邮电学院学报, 2010.7

[2]张昱, 陈意云, 郭宇, 李兆鹏.“编译原理”课程的教学内容选择的探讨.计算机教育, 2009.18

[3]刘洁, 黄贤英, 王柯柯, 曹琼.软件工程专业中编译原理课程的教学探讨.计算机教育, 2010.8 (16)

[4]王顺晔.“编译原理”课程教学方法的研究与实践.计算机教育, 2010.2 (3)

[5]王忠策.“编译原理”课程教学改革与实践探索.科技创新导报, 2010 (34)

编译原理课程实验教学改革与探索 篇7

随着网络技术的发展, 很多高校都设有计算机专业, 而编译系统是计算机系统的基本组成部分, 是计算机专业学生的必修课。作为一门理论性与实践性较强的课程, 编译原理对学生计算机水平的提高有着重要的作用。但是编译原理的学习的过程中有很多困难, 比如概念性强、逻辑性严密、内容抽象等, 对实践性要求比较高, 学生在学习的过程中不容易把握其知识要点。

1 编译原理实质

编译原理的学习主要是学习其算法, 从编译原理教材中不难发现, 编译原理的学习内容主要是词法分析、语法分析、语义分析、代码生成及优化等。其中语法分析的内容相对比较简单, 编译原理在讲解词法分析的时候, 要把自动机原理与正规表达式融合进来, 然后以较为标准的方式来分析程序的产生;语法分析相对于词法分析就没有这么简单了。目前, 语法分析算法一般有两种, LL自顶向下算法和LR自底向上算法, 特别是LR算法, 一般学生都会觉得比较困难, 甚至放弃自学, 其实LR算法的语法分析器, 一般是采用Yacc来生成的, 不需要自己来实现。而编译原理中编译器需要把程序员写的源程序转换成一种方便处理的数据结构, 这个转换过程是通过语法分析与词法分析来完成的, 只要学生了解简化语法的过程, 就能把词法分析繁琐的工作提出来, 简化学习过程。

2 编译原理课程实验教学现状

在编程原理教学中开展实验教学的内容, 学生的积极性很高, 在实验教学的课堂上学生开动脑筋, 积极发挥自己的聪明才智, 词法分析与语法分析实验完成比较好。可能会在语义分析与代码生成方面遇到一些问题, 对于学生遇到的问题, 教师要积极引导, 使学生认真思考, 强化学生对相关知识的了解。学生在实验过程中遇到的问题主要体现在以下几个方面。

2.1 对实验内容的误解

编译原理在实验教学的过程中, 学生根据实验指导书进行实验步骤的操作, 在实验操作的过程中, 有很多学生由于对基础知识理解不透, 可能会对实验内容产生误解, 从而影响实验效果。比如在测试词法分析程序时, 在实验的过程中可以按照一定的格式输出各类单词符号, 有些学生不理解就把它看做是词法分析程序本身的功能进行实验操作。这样理解的结果会使学生在完成语法分析部分时增加难度, 不能很好将词法分析与语法分析有效的衔接起来。

2.2 对编程实现要求不熟练

在实验学习的过程中, 在教室的指导下虽然有些学生能够理解实验原理和技术, 但是, 在实际实验操作时总是出现错误, 造成这种现象的原因主要是学生在学习过程中, 理论是实践的脱轨。还有些学生在学习的过程中对实验原理理解不够详细, 对原理技术的把握也不准确, 导致学生不能顺利完成实验。

2.3 缺乏规模程序能力

在编程原理的学习过程中, 按照实际完成的符合实验总体任务的编译程序估算, 学生完成的最终编译程序可能在500行左右, 这个编程量才能符合实际学习需求。但是在实际学习过程中, 学生完成的编程量往往与这个数与很大一段的距离。

2.4 利用所学知识解决问题的能力有限

在编程原理实验教学中, 比较难理解的问题一般在语义分析上, 因为它所涉及的数据结构和算法比较多。语义分析没有做好会影响代码生成部分的完成。学生的运用知识解决实际问题的能力不足是造成这种情况出现的重要原因。

3 编译原理课程实验教学改革与探索的措施

编译原理课程是一门理论性的课程, 注重理论知识的讲解, 但是计算机学科本身是一项实践性很强的学科, 只有学生能够学以致用, 才算是真正的学会。在教学的过程中不能使用传统的其他学科的教学方法进行授课, 必须有一套独特的授课方式, 提高学生的实践性。

3.1 分组实验教学

虽然编译原理是一门理论性教学课程, 但是其实验课程的项目也比较重要。通过实验课程学生会将自己在课堂上所学到的知识融会贯通, 运用到实际教学中。在实验课堂上, 首先将学生分为若干个小组, 每组成员各有分工。清晰划分小组成员中每一个人的管理范围, 制定好计划书与可行性分析报告。然后按照实验项目, 小组成员做好实验总结与实践, 这样不仅调动了学生的积极性, 而且能让每一位学生体验一次项目从开始到结束的过程, 培养学生的团队精神。

3.2 竞争式教学

竞争式教学试讲学生按照实验项目分好小组后, 进行小组间的学习竞赛。在完成一个项目的试验后, 教师进行小组评比, 评比时由每个小组的项目负责人阐述整个实验项目的内容、试验方法、实验过程、实验问题以及实验结果等然后对每个小组进行评分, 最终得出排名。这种方法具有很强的趣味性, 能有效的调动学生的学习热情, 使学生在竞争中不断完善自己。

3.3 教学实验的设计与监督

编程原理的实验教学设计要考虑两个个方面的内容:词法分析器设计、语法分析器设计, 通过本课程实验, 使学生理解编译程序设计原理, 培养学生编译程序能力, 加深学生对词法分析器的理解, 使学生熟练掌握语法分析器的设计。同时, 为了提高学生的实验质量, 教师在实验课程中要加强实验结果的监督, 严禁学生在实验中出现抄袭现象。采取先打印实验设计的源程序清单、后进行结果检查的方法。避免试验中的不公平现象。

4 结语

编译原理的实验教学质量的提高, 不仅需要运用有效的实验教学方法, 而且要建立理论联系实际的教学内容和课程体系, 抓住教学重点, 精心设计实验教学内容, 注意调动学生的积极性, 激发学生的学习热情, 使学生在实践中不断提升自我。

摘要:编译原理是计算机专业的主要课程之一, 讲述的内容是程序设计语言编译构造的基本原理以及实现方法。它是一门技术性较强的学科, 在讲课的过程中为了使学生更好的掌握课程内容, 提高学生的学习兴趣, 必须设计一套不同于其它学科的教学方法, 实现教学效果的提高。本文主要从实验教学的问题及现状方面出发, 探讨编译原理教学改革措施。

关键词:编译原理课程,实验教学

参考文献

[1]王改芳, 龚君芳, 李圣文, 张冬梅.编译原理课程实践教学改革探索[J].实验技术与管理2009, 26 (12) :130-131.

[2]吴海涛."编译原理"课程实验教学研究与探索[J].计算机教育2009 (24) :66-67.

[3]朱素英.普通本科院校编译原理教学内容改革探讨[J].电脑知识与技术2010, 6 (12) :3071-3072.

编译原理课程教学 篇8

编译原理是计算机及相关专业的一门重要专业基础课, 在计算机科学与课程体系中占据重要地位。编译原理主要是讲述将一个高级语言程序编译成一个低级语言程序所需经历的阶段、每一个阶段的任务和功能、以及实现这些功能的原理、方法与技术。编译程序构造的基本原理和技术蕴涵了计算机科学中解决问题的思路和方法, 其中的设计思想、算法、思维方式和技术都会对学生今后的发展产生较大影响。

编译原理的学习有助于深刻理解和正确使用程序设计语言, 有助于加深对整个计算机系统的理解。编译程序的内容涉及计算机内部的组织结构和指令系统, 涉及计算机的动态存储管理, 标准输入输出过程的实现涉及操作系统。因此编译原理课程的学习将把计算机结构、指令系统、操作系统及计算机语言等各方面贯穿起来, 编译程序的构造与设计是对计算机系统更深层次的探究。同时, 设计开发编译程序的软件技术同样也可以用于其它类型的软件设计开发。

编译原理课程的显著特点是内容多、理论性强、抽象性高、算法复杂度大、逻辑思维严密, 学生在学习过程中对原理和算法理解以及程序设计实现有一定的难度。要想让普通本科生对编译原理有一个全面和深入的学习和了解, 掌握编译原理的精髓, 老师在教学过程中仅采取单一教学方法很难实现教学目标。因此, 确保该门课程取得较好的教学效果, 综合运用多种教学手段和方法是必须的。在多年的编译原理课程教学实践中, 我们针对课程中不同的教学内容和不同的学生情境灵活运用了不同的教学方法, 并取得了较好的教学效果。结合教学实际, 在深入思考的基础上, 我们阐述与归纳如下。

二、教学方法

1、互动式教学法

互动式教学法是通过一定的方式营造互动的教学环境, 在师生双方平等交流过程中, 让不同的观点进行碰撞交融, 激发师生双方的主动性和探索性, 从而提高教学效果的一种教学方式。互动式教学是教育民主化在教学方法改革方面的重要体现, 是一种自由、民主、平等的开放式教学。在课堂上学生的主体地位的落实和凸现, 既是互动式教学的内在要求, 也是学生能力发展的需求。要想互动式教学有效开展, 只有让学生成为课堂和学习的真正主人。互动式教学的双向互动能够形成, 需要教师和学生的能动机制、学生的求知内在机制和师生的搭配机制共同形成。

“问题”是互动式教学得以开展的前提和基础。确保互动式教学的有效实施, 教师课前必须依据教学目标, 立足教学内容精心设计互动问题, 优选互动结点。热点、重难点、疑点都可以做为互动结点。例如:在编译原理第一次课时, 问题“把一个高级语言程序编译成一个低级语言程序需要经历几个阶段及每个阶段的任务是什么”对于初学者来说既是疑点也是热点, 可以作为互动结点。

互动结点确定后, 互动方式的选择尤为重要。互动教学方式有多种, 每一种都有自己的特点, 需要根据教学内容、教学对象灵活选择及运用。一般来说包括主题探讨式互动、归纳问题式互动、精选案例式互动。例如:对于编译总体过程的讲授适合主题探讨式互动, 可以通过:抛出主题——提出主题中的问题——思考讨论问题——寻找答案——归纳总结五个阶段完成互动。在这里, 主题为:编译过程, 提出问题为:编译器要将一个高级语言程序翻译成一个机器可执行的低级语言程序需要经历哪些阶段, 然后让学生根据以前使用高级语言开发环境编辑、调试、运行程序的经验来思考和讨论, 不同的学生思考的结果可能不一样。再然后老师和同学们一起讨论, 从多个候选答案中寻找准确完整答案, 最后归纳总结。

2、启发式教学法

启发式教学是根据教学目的、内容和学生的知识结构和水平, 运用各种教学手段, 采用启发诱导办法来传授知识和培养能力, 使学生积极主动地学习、思考和探索。启发式教学是先进的教学模式之一, 强调传授知识的同时重视学生能力和综合素质的培养。启发式教学通常需要合理设计教学目标和科学采用授课模式, 从而激发学生学习兴趣, 培养学生创新能力。

由于本课程理论性较强, 概念原理较多, 所以充分发挥学生的积极性就显得尤为重要。例如:在编译原理中讲解句型分析内容时, 讲到自顶向下和自底向上分别体现推导和归约的本质及每一种方法的特点和局限性, 通过教师引导, 学生意识到如何选择产生式和如何识别可归约串是这两种方法的根本问题。有了这些认识, 对语法分析内容的学习也非常重要, 教师同时启发学生对知识的迁移, 在讲到LR分析方法可归约前缀图的构造时, 可与词法分析中构造的状态图作类比, 得出可归前缀图的射出弧上不仅可标记终结符, 还可标记非终结符, 通过对前序内容的迁移, 指出知识的前后关系, 从而加深学生对知识的吸收和掌握。

3、案例教学法

案例教学法于1920年由美国哈佛商学院所倡导的一种独特的教学模式。不同于传统的教学方法, 老师扮演的只是传授知识的角色。案例教学法是一种以案例为基础的教学法, 案例本质上是一个具有代表性且蕴含着知识的实际事件或任务, 针对案例可能有多种不同的解释、不同的观点或不同的解决方法, 教师在教学中扮演着设计者和激励者的角色, 鼓励学生从不同角度积极讨论思考, 从中明确真理并获取需要的知识。

案例教学法具有很多明显的优点, 不仅能够很好地实现教学相长, 也能够极大地调动学生的学习积极性。同时案例教学生动具体, 形象直观, 能够以点带面, 纵向深入。由于教学时选择了具体的实例, 又采用了形象、直观、生动的授课形式, 给人以身临其境的感觉, 易于吸收和理解。教师在课堂上不是“独唱”, 而是和大家一起讨论思考, 学生在课堂上积极参与、共同探讨问题。由于调动了师生共同的智慧和力量, 容易开阔思路, 收到良好的教学效果。

编译原理中的重难点通常理论性强, 抽象性高, 而案例式教学具有形象、直观、生动、具体的特点, 这种方式正好可以充分调动学生兴趣, 使其在分析案例、得出结论的过程中学到知识、提高能力。在编译原理教学过程中, 可以把经典的具有代表性的例题或综合习题作为案例, 在讲述完基本理论与基本方法后以例题为案例进一步深化和巩固专业知识。例如, 在自动机理论中, 讲解正则式、正则文法转化成等价的NFA、NFA转换为等价的DFA、DFA的最小化内容时, 可用一道综合题将这部分知识串连起来, 会取得很好的教学效果;LL (1) 分析方法、优先分析方法、LR分析方法等内容也都可以通过实例实现教学。教学内容结束后, 给学生适当布置有代表性的作业, 学生自己变为案例教学模型的主体, 教师再就作业中出现的问题在习题课上重点讲解。除课本上的例题外, 老师还可以选择一些典型的历年考研试题作为案例, 拓展学生的专业知识的深度和广度。

4、任务驱动式教学法

任务驱动就是在学习过程中, 学生在教师的帮助下, 紧紧围绕一个共同的任务中心, 在强烈的求解问题的动机下, 通过对提供的学习资源的积极主动使用, 进行自主探索和互动协作的学习, 在完成既定任务的过程中, 引导学生产生一系列学习实践活动。任务驱动是一种建立在建构主义教学理论基础上的教学法, 它要求任务的目标性和教学情境的创建, 使学生带着真实的任务在探索中学习。在这个过程中, 学生会不断地获得成就感, 可以更大地激发他们的求知欲望, 从而培养出独立探索、勇于开拓进取的自主学习能力。

任务驱动教学法最根本的特点就是“以任务为主线、教师为主导、学生为主体”, 改变了以往“教师讲, 学生听”, 以教定学的被动教学模式, 创造了以学定教、学生主动参与、自主协作、探索创新的新型学习模式。任务驱动法有利于激发学生的学习兴趣, 培养学生的分析问题、解决问题的能力, 提高学生自主学习及与他人协作的能力。

任务驱动教学主要包括四个基本环节:创设情境, 确定问题, 自主学习和效果评价。例如, 在编译原理词法分析部分的学习中, 首先创设情境:词法分析的主要任务是从左至右逐个字符地对源程序进行扫描, 产生一个个单词符号;然后确定问题:如何构造程序实现单词的高效识别?并给出一个简单高级语言程序, 让学生试用自己设计的程序进行识别;然后学生带着任务, 通过学习教材和查阅相关资料, 自主学习和协作学习完成一个初步简单的单词扫描程序;最后老师根据学生解决问题的算法、结果和自主学习与协作学习能力进行学习效果综合评价, 并进行点评。

5、问题教学法

问题教学法就是教师上课前把课程的知识点进行归纳, 把知识点设计成问题, 以问题的形式呈现在学生的面前。学生在寻求、探索、解决问题的思维过程中, 掌握知识、发展智力、培养技能, 进而培养学生发现问题、解决问题和思考问题的能力。一般来说, 在课堂上教师有意地创设问题情境, 组织学生进行探索, 引导学生提出学习问题和并解决它们, 或由教师自己提出一些问题并与学生们一起解决。问题教学法为师生提供了一个交流、合作、探索、发展的平台, 使学生在问题解决中感受知识的价值和魅力。在整个教学活动中以问题为主线, 基于问题情境探索知识, 掌握技能, 学会思考, 学会创新, 培养和提高学生创造性思维。

问题教学法的基本结构与实施我们可概括为“三环”和“六步”。“三环”是指:第一环节“生成”问题, 第二环节“探索”问题, 第三环节:“发展”问题。“六步”为:第一步是创设情境, 提出问题的背景、目的和意义;第二步问题定向, 引导学生明确要解决的主要问题;第三步自主探素与研究, 让学生设计出解决问题方案;第四步让学生尝试解决问题;第五步是对学生解决问题的答案与方法进行反馈;第六步是对问题进行拓展与延伸, 归纳问题所蕴含的知识和原理。例如, 编译原理代码优化部分内容的学习, 使用问题教学法尤为重要。“生成”问题:为什么要进行代码优化, 从哪些方面进行优化?“探素”问题:由源程序直接翻译成的中间代码 (四元组) 会不会有重复计算?会不会有额外浪费存储空间的多余变量?空间和时间效率怎么样?通过哪些方法和技术来降低中间代码的时间和空间复杂度?并找到具体解决以上问题的答案。“发展”问题:探寻代码优化的理论基础并设计算法实现中间代码的优化。在编译原理教学中如果把以上三个环节组织并实施好, 代码优化的基本内容就基本掌握了。

三、结束语

编译原理是一门理论性强、抽象性高、算法复杂度大、逻辑思维严密的一门课程, 学生在学习过程中对原理和算法理解起来很困难。在教学过程中根据教学内容的不同、教学情境的变化和教学对象的差异灵活运用互动式教学法、启发式教学法、案例教学法、任务驱动式教学法、问题教学法将有助于提高学生的积极性、主动性和学习兴趣, 让学生积极主动参与到教学过程中, 有效地促进教与学的高度融合, 显著提高编译原理课程的教学质量和教学效果。同时, 多种教学方法的运用将大大提高学生自主学习能力、创新创造能力和探究钻研能力, 在更大程度更高层次上提高学生专业素质和综合素质。

参考文献

[1]陈火旺.程序设计语言编译原理 (第3版) [M].北京:国防工业出版社, 2001.

[2]陈文宇.关于“编译原理”课程教学的思考[J].实验科学与技术, 2008 (12) :80-82.

[3]李娟, 孙涛.“编译原理”课程教学改革实践[J].高师理科学刊, 2007 (7) :93-95.

[4]赵曦.“编译原理”实验教学改革初探[J].实验室科学, 2006, 8 (4) :26-27.

[5]张晶, 杨冬, 郭德贵, 等.编译原理实践课程教学方法研究[J].吉林大学学报:信息科学版, 2005, 8 (23) :142-144.

[6]黄贤英, 刘贞, 刘全利.“编译原理”课程的地位及教改思路[J].重科技学院学报, 2005, (3) :103-105

编译原理课程教学 篇9

《编译原理》课程是高职计算机科学与技术专业的核心理论课程之一, 介绍了高级程序设计语言的原理和实现技术, 这门课程由于比较抽象且理论性较强, 教师教起来困难, 学生学起来更困难。将案例法引入《编译原理》课程的教学, 能充分发挥案例法的优势, 启发和引导学生, 通过对案例的分析和推导, 培养学生分析问题和解决问题的能力。

在编译原理中, 通常提及文法一般是特指上下文无关文法。上下文无关文法中涉及到了一些重要文法, 如递归文法、二义文法、LL (1) 文法、LR文法、SLR文法。其中, 二义文法和其它文法密切相关, 因而, 下面以二义文法为主线, 设计了一些典型案例, 讨论分析了二义文法和其它文法的关系。

1. 文法的二义性及存在的问题

案例1:对于文法G:

E→E-E|E/E| (E) |i

要求学生写出句子i-i/i、i-i-i和i-i的最左推导、最右推导和语法树。

通过此案例, 启发学生发现文法的二义性, 如果文法G所推导出的语言L (G) 中至少存在一个句子x, 如果x存在着两个不同的最左推导, 或者两个不同的最右推导, 或者两个不同的语法树, 则文法G有二义性 (ambiguous) , 简称二义文法。

进一步, 引导学生思考, 如果一个文法是二义性的, 在语法分析中存在哪些问题。引入案例2:对于文法G:

E→E-E|E/E| (E) |i

句子i-i/i有两颗不同的语法树, 语法分析中如何选择?

通过对案例的分析, 帮助学生理解, 在二义文法所描述的语言中, 必然至少存在一个句子, 当编译程序对它进行语法分析时, 就会产生两种甚至更多种不同的理解, 由于语法结构分析上的不确定性, 将必然会导致在语法制导时, 产生语义处理上的不确定性, 进而会出现对同一源程序符号串在目标代码生成上的不确定性, 因而是应当避免的。

2. 文法二义性的判定问题

在设计一个编译程序时, 应先了解所处理的语言是否由二义性文法定义的。虽然, 普遍意义上, 上下文无关文法是否具有二义性是不可判定的, 但是对于上下文无关文法中的某些特殊文法, 还是可以判定其二义性或无二义性的。

2.1 判定文法有二义性的充分条件-利用递归文法

引入案例3:对于文法G:

A→Aa

A→βA

A→γ

要求学生找出文法中的递归产生式, 并指出左递归产生式和右递归产生式的不同?进一步, 分析句子βαγ的最左推导、最右推导和语法树, 文法G是二义文法吗?

对句子βαγ来说, 由于以及, 有两个不同的最左推导, 学生可以快速的发现此文法有二义性, 是二义文法。进一步, 引导学生思考二义文法和递归文法的关系, 得出检查文法二义性的充分条件的结论, 即如果递归文法G中存在一个非终结符既有左递归产生式, 又有右递归产生式, 则此递归文法一定有二义性。

2.2 判定文法无二义性的充分条件

2.2.1 利用LL (1) 文法

引入案例4:对于文法G:

是LL (1) 文法?是二义文法?LL (1) 文法和二义文法的关系?

在此案例中, 先启发学生消除文法G中的左递归, 产生文法G’

得到文法G’的预测分析表M1, 如下图1所示:

因为分析表不含多重定义, 故此文法是LL (1) 文法, 一定不具有二义性, 不是二义文法。LL (1) 文法是判断文法无二义性的充分条件。进一步, 引导学生思考, 如果文法是二义性的, 在此文法的预测分析表中会出现至少一个多重定义条目, 因而, LL (1) 文法一定不是二义文法。

2.2.2 利用LR (0) 文法和SLR (1) 文法

引入案例5:对于文法G:

是LR (0) 文法?SLR (1) 文法?是二义文法?LR (0) 、SLR (1) 文法和二义文法的关系?

首先, 引导学生分析此案例, 得到文法G的LR (0) 分析表M2, 如图2所示, 因为分析表不含多重定义, 故此文法是LR (0) 文法, 不是二义文法。接着, 因为follow (S) ={#, ) , , }, follow (T) ={) , , }, 在LR (0) 分析表的基础上构造SLR (1) 分析表M3, 如图3所示, 同样地, 因为分析表不含多重定义, 故此文法是SLR (1) 文法, 不是二义文法。在此基础上, 引导学生审视案例, 得出结论, 如果此文法是二义性的, 则在分析表中会出现移进-规约冲突, 分析表中会出现至少一个多重定义条目, 因而, LR (0) 文法一定不是二义文法, SLR (1) 分析表是在LR (0) 分析表的基础上构造的, 因而, SLR (1) 文法也一定不是二义文法, LR (0) 文法是判断文法无二义性的充分条件, 进而SLR (1) 文法也是判断文法无二义性的充分条件。

3. 二义文法的解决

二义文法会产生语法结构分析上的不确定性, 进而会导致语义处理上及目标代码生成上的不确定性, 因而是应当避免的。有两个解决文法二义性的方法, 一种是强制将二义文法转换成等价的非二义文法, 另一种是不改变文法, 但需要设置一个消除二义性的规则, 在出现二义性时, 利用此规则找出正确的语法树。

3.1 二义文法的消除

有些类型的语法分析器希望它所处理的文法是无二义的, 因而需要将二义文法转换成等价的非二义文法, 消除其二义性。下面以二个典型的二义文法为例介绍。

3.1.1 悬挂else问题

引入案例6:对于文法G:

其中, f, t, e, a分别代表if, then, else, 其它语句。而S代表语句, C代表条件表达式, f Ct S代表if..then..语句, 而f Ct Se S代表if..then..else..语句。

找出句子fitfitaea有两个不同的最右推导的原因?如何解决?

此案例中, 首先引导学生找出句子fitfitaea有两个不同的最右推导, 发现文法的二义性。接着, 通过引导学生回顾C语言中的if语句的嵌套问题, 找出二义性的原因在于else部分既可以与第一个if结合, 也可以与第二个if结合, 这种二义性被称作悬挂else问题。进而, 消除其二义性, 将文法G改造为等价的无二义文法G’, 文法G’如下:

其中, d代表endif语句, f Ct Sd代表if..then..endi语句。因而, 当if..then..else..语句中嵌套if..then..endi语句时, 由于内层的if已经与endif匹配, else只能与外层的if匹配, 解决了悬挂else问题。

3.1.2 优先权和结合性问题

引入案例7:对于文法G:

找出句子i-i/i、i-i-i有两个不同的最右推导的原因?如何解决?

此案例中, 首先引导学生找出句子i-i/i有两个不同的最右推导, 发现文法的二义性。接着, 通过引导学生回顾算术运算的优先性, 找出此句子有两个不同的最右推导的原因在于文法中没有设定算符的优先级, 依次类推, 通过对句子i-i-i的分析, 找出此句子有两个不同的最右推导的原因在于文法中没有设定算符的结合性。进而, 将文法G改造为等价的无二义文法G’, 在文法G’中, 除法优先于减法, 同级运算服从左结合, 文法G’如下:

最后, 对于文法G’, 引导学生重新做句子i-i/i、ii-i的最右推导, 加深学生对规范规约、自下而上语法分析和语法制导的理解。

对于句子i-i/i, 其最右推导过程如下:

因而, 在语法制导翻译时, 除法优先于减法, 总是先做除法, 在句型E-T/F中规约T/F得到T后, 才能做减法, 在句型E-T中规约E-T得到E。同理, 对于句子i-i-i, 其最右推导过程如下:

因而, 在语法制导翻译时, 同级运算时, 总是先做左边的减法, 在句型E-T-i中规约E-T得到E后, 继续规约若干步后, 才能做右边的加法, 在句型E-T中规约E-T得到E。

3.2. 二义文法的利用

引入案例7:对于文法G:

和文法G’:

要求学生分别构造文法G和文法G’的SLR (1) 分析表, 并比较两个分析表的规模。

首先, 引导学生找出文法G和G’的不同, 算术表达式文法G和与其等价的无二义文法G’相比, 明显的二义文法G中非终结符和产生式较少, 相应地分析表的规模更小一些。具体地, 可以, 引导学生构造文法G的SLR (1) 分析表M4, 如图4所示, 在分析表的M4[7[-]、M4[7][/]、M4[8][-]、M4[8][/]四处出现了多重定义。如果设置消除文法二义性的规则为除法优先于减法、同级运算服从左结合, 则以句子i-i/i为例, 当语法分析过程进入到某状态时, M4[7][/]=s5r1, 符号栈为“#E-E”, 输入串为“/i#”, 因为除法优先于减法, 应该做移进, 所以M4[7][/]=s5。以句子i-i-i为例, 当语法分析过程进入到某状态时, M4[7][-]=s4r1, 符号栈为“#E-E”, 输入串为“-i#”, 因为同级运算服从左结合, 应该做规约, 所以M4[7][-]=r1。同理, M4[8][-]=r2, M4[8][/]=r2。消除了多重定义的SLR (1) 分析表分析表如图5所示。同理, 构造无二义文法G’的SLR (1) 分析表M6如图6所示。对比两个分析表, 在图5中, 二义文法G的分析表规模为10×7, 而在图6中, 文法G’的分析表规模为12×9, 因而, 二义文法G的分析表更简洁。

进而, 引导学生得出结论, 有些语法分析器允许二义文法的存在, 二义文法相对于等价的无二义文法, 能提供更简洁的规约, 但是要附加一个消除二义性的规则[1,3]。在此基础上, 重新审视此案例, 找出此方法的优缺点。此方法的优点一方面是无需修改文法, 因为寻找等价的无二义文法的过程有时很复杂, 另一方面是因为某些二义文法在语言的实现中很有用, 尤其是对于表达式这样的语言结构, 二义文法相对于等价的无二义文法, 能提供更简洁的规约[2];此方法的缺点是语言的语法结构要由文法和规则同时定义, 而不能由文法单独提供。

4. 小结

在计算机课程的教学中, 尤其是理论性较强的课程教学中, 案例教学法相对于传统的教学方法, 更生动, 更具有启发性。在编译原理课程的教学中, 巧用案例法, 不仅能激发学生的学习兴趣, 更能启发学生, 加深学生对理论的理解。此外, 在编译原理课程中, 除了二义文法, 还有很多知识点也可以利用此方法来达到更好的教学效果。

参考文献

[1]陈意云, 张昱.编译原理[M].高等教育出版社, 2008:14-15.

[2]赵建华, 郑滔.编译原理[M].机械工业出版社, 2009:142-143.

上一篇:系统战略市场营销下一篇:语义搜索引擎