前言:想要写出一篇引人入胜的文章?我们特意为您整理了编译原理实验教学设计范文,希望能给你带来灵感和参考,敬请阅读。
摘要:《编译原理》课程知识点多、概念复杂、理论性强、算法难理解,具有很强的复杂性与抽象性、与实际联系不紧密等问题。为了探索编译原理的实验教学方法,针对《编译原理》课程中的实验教学设计和分析,通过对实验过程的创新性探索,寻找实验教学的更优方案,加深学生对编译原理的理解。
关键词:编译原理;前端;实验教学
引言
《编译原理》作为计算机专业的一门重要专业课程,是日后深入研究专业领域知识的基础。这门课作为计算机科学与技术的专业课,融合了离散数学、数据结构、操作系统、计算机组成原理等多个学科的知识,属于综合性与理论性较强的一门课[1],由于编译原理课程内容的以上特点,目前在实验教学中仍存在一些问题。天津工业大学崔光宇[2]提出编译原理课程教学所存在的问题主要有:学生对于课程的认识模糊;编译原理理论抽象,算法比较复杂;程序设计要求比较高。编译原理实验部分若要设计制作完整的编译器,实验周期长,涉及的模块较多,各模块间衔接较复杂,不易立即看到整体效果。若实验由各个同学独自设计完成代码,具有一定难度;若通过小组形式合作完成,一部分同学易产生依赖思想,寄希望于组内其他同学,如此便达不到提升对编译原理理解的目的[3]。
一、实验教学流程设计
实验教学以构建一个编译程序前端的过程,进行流程设计,培养学生从部分到整体的程序设计概念。首先,需要对读入的程序进行预处理。去除程序中多余的空格,相继的若干空格只留一个作为分界标志,以便接下来的分析。接下来,开始词法分析。根据词法分析规则设计自动机,再将预处理好的程序运用词法分析的原理逐个扫描,按照关键字、标识符、常数、运算符、分隔符这五类单词符号进行分类,生成单词符号属性值与其对应单词种别码的二元式。然后,根据所得到的单词符号二元式进一步进行语法分析,参照表示语法规则的正则文法设计函数,并运用递归下降法自上而下进行语法分析,依次扫描由词法分析得到的符号单元,获得满足文法规则的语法单元。最后,在运用递归下降法进行语法分析的同时也进行语义分析及中间代码生成。将符合语法规则的句子翻译为四元式形式的中间代码。以上,就是编译原理实验设计的几个关键部分。实验教学设计中应将一个庞大完整的编译系统拆分成这样的模块,对每个模块进行设计分析,研究现有源码的实现方式,再根据各模块具体功能设计接口实现要求,供学生思考及编程。
(一)词法分析
编译时要经过词法分析识别出单词符号,语法分析生成语法树,语法树生成中间代码,中间代码才能最终生成目标代码。教学重点在于锻炼学生从理论建模到代码实现的能力,特别是从DFA到各个分支语句的建模与实现,实验中应引导学生思考其中的对应关系及转化过程。首先,读入源程序,并依次去除多余空格,做好预处理之后,可以开始词法分析。该部分实验的理论教学路线从正则文法到NFA,再到状态转换矩阵,再到DFA及其化简,将这些理论投入实验教学,重点在于让学生理解如何绘制状态转换图,以及借助设计好的符号表对单词符号进行逐个识别的思想,将状态转换图的逻辑算法设计出程序,让学生对程序中单词符号分类方式有进一步的理解。教学应遵循从易到难、循序渐进的原则,一开始的词法分析阶段可以先实现识别一个单词,然后进一步实现一类关键字,再按照关键字、标识符、常数、运算符、分隔符这五类单词符号进行分类识别并生成相应的二元式。
(二)语法分析
语法分析的主要目的是利用词法分析所得的单词符号二元式进一步分析,判断程序的语法结构是否符合语法规则。该实验的重点在于根据产生式规则将程序中所读取的语句结构进行推导。教学中,对语法分析所使用的理论方法有自上而下分析与自下而上分析,前者需要预先消除产生式规则中的左递归以及回溯,从而使语法树唯一,即算法的唯一确定性,例如有LL(1)分析法;而后者需要借助符号栈进行归约操作,重点在于判断栈顶有无句柄以及句柄的长度,例如算符优先分析法、LR分析法等。其中LL(1)分析法根据语法规则构造出预测分析表,并利用栈的数据结构,通过将待识别的符号单元依次入栈,并结合预测分析表在合适的时机弹出栈,获取语法分析所得的匹配结果。其重点在于深化学生对栈这种数据结构的理解,以及将其灵活应用于语法分析的匹配识别过程中。其中递归下降法在实验教学设计中虽然从理论上需消除产生式规则的左递归及回溯,但在代码实现的过程中利用递归的特点设计,可使用改写文法的技巧,优化算法进行实现。在递归下降法过程中可根据不同语法规则设计出各个规则对应的接口,即将上一步词法分析程序作为语法分析的一个功能函数,所得出的各类单词符号二元式又作为语法分析的最小单元按照语法规则进一步分析,每一类语法规则又设计为一个函数单元,进行函数调用。教学实验中,可以给出设计好的各函数接口所需实现的语法规则要求,主要包括总流程、Block程序块、Stmts语句串、Bool逻辑判断语句、Expr表达式、Term项、Stmt语句、Factor因子等。根据语法分析中的多种分析方法也可设计不同的功能接口,实验中让学生对比分析不同接口实现所用的数据结构。让学生逐个进行编写,并替换代入原编译器代码中,分析其中原理。
(三)语义分析及中间代码生成
语义分析及中间代码生成穿插在语法分析的扫描过程中,对语法规则进行判断的同时生成四元式组。在实验教学中,此部分实验教学的重点在于对程序扩充能力的培养,指导学生在上一步递归下降法所设计的代码中穿插四元式的生成以及嵌入地址跳转的拉链回填技术。由于对语法单元只能从前往后依次扫描,逐步生成四元式,所以此过程的实现在选择、循环结构中需根据实际情况,把部分跳转地址暂时留空,直到向后扫描到相应位置,再把所得地址回填。此模块可将生成四元式的功能作为单独接口,设计所需参数让学生进行实验分析,并引导学生思考应在哪些位置对四元式生成的接口进行调用。
二、实验教学改进措施
1.实验前,应督促学生做好预习,根据所学理论进一步思考,结合实验所给的模块接口要求,设计各个模块的算法流程图及所需的数据结构。2.根据学生水平情况,因材施教,无需所有学生都独立构造出一个具体完整的编译器,而是剖析已有的编译器源码,分析各个部分的实现策略。3.可将一个完整编译器的各阶段功能拆分成各个小接口,设计好对应的输入输出参数及功能实现要求。通过由学生自行编写各个小接口,嵌入编译器代码替换原模块进行测试,这样无需一次实现编译器的全部功能也能及时进行功能实现的检测,有利于增强学生信心,也能及时获取实验情况反馈。4.每场实验的代码实现任务完成后,分配一部分时间供学生讨论遇到的常见问题并分析原因,从而更好地发现问题、解决问题,收到及时的教学效果反馈,有利于为下一堂课的重难点讲解和教学进度进行补充与调整。教师可以选取其中一些优秀的例子进行讲解分享,不仅能让优秀的同学更加开阔思路,也能让能力较弱的同学看到自己的不足,使全体学生都能对课程的各知识点有更深入的理解。5.最重要的是可提升学生对编译原理课程学习的兴趣,从易到难,循序渐进,让学生吃透每一个部分的原理及编码实现。
三、结论
本文主要通过设计编译原理中词法分析、语法分析、语义分析及中间代码生成的实验教学步骤,将编译原理课程的理论与实践教学相结合,对编译原理的教学方式进一步探索,对编译原理的知识点进行充分实践与运用。本文所设计的教学实验,有助于提高学生对编译原理理论知识的实践转化能力,提升学生对课程知识的理解,并进一步提高动手能力,培养学生的编程能力,从而达到提高教学质量的目的。
参考文献:
[1]丁志军,周泽霞,卫志华.过程可视化类C编译器的教学辅助软件[J].计算机与现代化,2017,(6):34-39.
[2]崔光宇.编译原理教学现状与创新研究[J].无线互联科技,2017,(24):81-82.
[3]曹琼.浅谈编译原理实验课程教学[J].计算机教育,2007,(18):45-46.
作者:万新燕 时招军 单位:南昌航空大学信息工程学院