第一篇:编译原理概念期末总结复习
翻译程序:把一种语言程序转换成另一种语言程序,且在功能上是相同的这样的程序。编译程序:把高级语言转换成低级语言,且在功能上是相同的这样的程序。
解释程序:边解释边执行源程序的程序。区别:编译程序有中间代码,而解释程序没有。编译过程的五个阶段:
1、词法分析 任务:对构成源程序的字符串进行扫描和分解,识别出一个个单词。
2、语法分析 任务:在词法分析的基础上,根据语言规则,把单词符号串分解成各类语法单位。
3、语义分析和中间代码产生 任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译。
4、优化 任务:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。
5、目标代码生成 任务:把中间代码变换成特定机器上的低级语言代码。
编译程序的七个部分词法分析器,语法分析器、语义分析与中间代码产生器、优化器、目标代码生成器、表格管理和出错处理。
编译程序生成的五个办法:机器语言、高级语言、移植、自编译方式和使用工具自动生成。词法规则:指单词符号的形成规则。(也就是正规式)
语法规则:规定了如何从单词符号形成更大的结构。就是语法单位的形成规则。空字:不包含任何符号的序列。闭包:中所有的符号组成的集合。
上下文无关文法是指:所定义的语法范畴是完全独立于这种范畴可能出现的环境的文法。上下文无关文法的四个组成部分:一组终结符号、一组非终结符号、一个开始符号和一组产生式。
终结符号也就是不可再分的基本符号。
非终结符号是用来代表语法范畴,表示一定符号串的集合。开始符号是语言中我们最感兴趣的语法范畴。产生式是定义语法范畴的书写规则。
句子:文法中从开始符号推导的终结符号串。句型:从开始符号推导的符号串。语言:文法中所有句子的集合。
程序语言的单词符号分为五种:关键字、标识符、常数、运算符和界符。二元式表示:(种类,属性)
正规式的运算符有三种:或,连接和闭包。优先顺序是:闭包,连接,或。
DFA怎么识别字:若存在一条从初态结点到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字是a,则称a可为DFA所识别。
DFA怎么识别空字:若DFA的初态结点同时又是终态结点,则空字可为DFA所识别。NFA怎么识别字:若存在一条从某一初态结点到终态结点的通路,且这条通路上所有弧的标记字依序连接成的字等于a,则称a可为NFA识别。
NFA怎么识别空字:若M的某些结点即是初态又是终态结点,或者存在一条从某个初态结点到某个终态结点的空通路,那么,空字可为M所识别。语言的语法结构是用上下文无关文法描述的。
语法分析分为两类:自上而下分析法,自下而上分析法。
自上而下分析法面临的问题:1.文法的左递归问题。2.回溯3.成功可能是暂时的,产生虚假匹配。4.难于知道输入串中出错的确切位置。5.效率低,代价高。为什么消除左递归?因为含有左递归的文法将自上而下分析的过程陷入无限循环。为什么消除回溯?因为回溯统一做一大堆无效的工作。
自下而上分析法:从输入串开始,逐步进行归约,知道归约到文法的开始符号。短语:符号串推导过程中某非终结符推导的部分。
直接短语:符号串推导过程中某非终结符一步推导的部分。句柄:一个句型的最左直接短语。最左归约是最有推导的逆过程。
中间语言形式:后缀式,三元式,四元式,间接三元式。中间语言的好处:1.便于进行与机器无关的代码优化工作。2.使编译程序改变目标机更容易。3.使编译程序的结构在逻辑上更为简单,以中间语言为界面,编译前端和后端的借口更清晰。
第二篇:马克思原理 期末复习总结
1.世界观、哲学与哲学基本问题、马克思主义的思想的个性。矛盾的共性是无条件的、绝对的,矛盾的式。生产力与生产关系的相互关系是:生产力决定理论来源 个性是有条件的、相对的。任何现实存在的事物都生产关系,而生产关系又反作用于生产力。世界观是人们对整个世界的总体看法和根本观点。是共性和个性的有机统一,共性寓于个性之中,没生产关系对生产力具有能动的反作用。主要表现在两哲学是系统化、理论化的世界观,又是方法论。有离开个性的共性,也没有离开共性的个性。矛盾种情形:当生产关系适合生产力发展的客观要求时,哲学的基本问题是:思维与存在的关系问题。(恩格的共性和个性、绝对和相对的道理,是关于事物矛他对生产力的发展起到推动作用;当生产关系不适合斯吸取了黑格尔和费尔巴哈的有关思想,第一次明确盾问题的精髓,是正确理解矛盾说的关键。矛盾的生产力发展的客观要求时,他就会阻碍生产力的发指出:“全部哲学,特别是近代哲学的重大的基本问共性和个性相统一的关系,既是客观事物固有的辩展。题,是思维和存在的关系问题。” 证法,也是科学的认识方法。人的认识的一般规律生产力与生产关系的相互作用是一个过程,表现为)哲学的基本问题包括两个方面的的内容:其一,意就是由认识个别上升到认识一般,再有一般到个别二者的矛盾运动。就是生产关系一定 识和物质、精神和自然界,究竟是世界的本源,即物的辩证发展过程。要适合生产力状况的规律。质和精神何者是第一性、何者是第二性的问题;其二,9.事物发展过程中的量变和质变及其相互转化。生产力与生产关系相互作用的两个方面:一方面,“我们关于我们周围世界的思想对这个世界本身的事物的联系和发展都采取量变和质变两种状态和形生产力的状况决定一定的生产关系的产生及其变化关系是怎样的?我们的思维能不能认识现实世界?式。发展的方向和形式;另一方面,生产关系反作用于我们能不能在我们关于现实世界的表象和概念中正量变是事物数量的增减和次序的变动,是保持事物生产力,当生产关系适合生产力的状况是对生产力确地反映现实?”即思维能否认识或正确认识存在的的质的相对稳定性的不显著变化,体现了事物渐进发展起着促进作用,反之将起着阻碍作用。问题。过程的连续性。质变是事物性质的根本变化,是事18.经济基础与上层建筑矛盾运动的规律 来源:马克思主义是在吸收了几千年来人类思想和文物由一种质态向另一种质态的飞跃,体现了事物渐经济基础是指由社会发展阶段的生产力所决定的生化发展中的一切优秀成果,尤其是在批判的继承、吸进过程和连续性的中断。产关系的总和。收德国古典哲学(代表人物黑格尔和费尔巴哈)、英国量变和质变的辩证关系:第一,量变是质变的必要上层建筑是建立在一定经济基础上的意识形态以及古典政治经济学和法国(亚当.斯密和大卫李嘉图)、英准备。第二,质变是量变的必然结果。第三,量变相应的制度、组织和设施。国的空想社会主义(法 昂利.圣西门 沙尔.傅立叶 英 和质变是相互渗透的。经济基础与上层建筑相互作用构成二者的矛盾运罗伯特.欧文)合理成分的基础上,在深刻分析资本主量变引起质变,在新质的基础上,事物又开始新的动。其一,在同一性质的经济基础与上层建筑的关义社会发展趋势和科学总结工人阶级斗争实践基础量变,如此交替循环。质量互变规律体现了事物发系中,上层建筑的不完善部分、没有反映经济基础上创立和发展起来的。展的渐进性和飞跃性的统一。要求的部分都会同经济基础发生矛盾。其二,在不2.马克思一生的两大发现 1 事物的量和质是统一的,量和质的统一在度中体同性质的经济基础与上层建筑的关系中,矛盾更为19世纪40——60年代,马克思恩格斯批判的继承现。度是保持事物质的稳定性的数量界限,即事物复杂。了前人的成果,创立了唯物主义史观和剩余价值学的限度、幅度和范围。19.生产力和生产关系、经济基础和上层建筑的矛盾是说。10.事物发展过程中的肯定和否定及其相互转化 社会基本矛盾 3.物质与意识(相对的)(定义,性质,意识和本质,时辩证否定观的基本内容是: 社会基本矛盾是社会发展的根本动力 间和空间,运动和静止,意识能动性)第一,否定是物的自我否定 20.科学技术社会作用的两重性 物质是标志客观实在的哲学范畴,这种客观实在是第二,否定是事物发展的环节 科学技术像一把双刃剑,即通过促进经济和社会发人们通过感觉感知的,他不依赖与我们的感觉而存第三,否定是新旧事物联系的环节 展以造福于人类,同时也可能在一定条件下对人类在,为我们的感觉所复写,摄影,反映。第四,辩证否定的实质是“扬弃“(第一章完)的生存和发展带来消极后果。物质的唯一特性是客观实在性。(性质)11.认识的本质和认识运动的基本规律 21.人民群众是历史的创造者 意识是物质世界长期发展的产物,是人脑的机能和在认识的本质问题上,存在两条根本对立的认识路人民群众是社会物质财富的创造者 属性,是物质世界的主观映像。(两个本质)人民群众是社会精神财富的创造者 意识的能动性:意识是物质的产物,是物质世界在另一条是坚持从思想和感觉到物的唯心主义路线。人民群众是社会变革的决定力量 人脑中的主观映像,这是物质,意识关系问题上的从实践到认识,再从认识到实践,如此实践、认识、22.价值规律及其作用 唯物主义。意识对物质有能动的反作用,这是物质、在实践、再认识,循环往复以至无穷,一步步的深在商品经济中,价值规律的表现形式是,商品的价化和提高,这就是认识发展的总过程。(不断反复 以格围绕商品的价值自发波动。还是意识反作用于物质,都离不开社会实践,只能至无穷)价值规律的作用表现在: 在实践中发生,在实践中实现。12.实践对认识的作用 第一,自发的调节生产资料和劳动力在社会各生产主观能动性与客观规律的辩证统一:首先,必须尊第一,实践为认识提供了可能。部门之间的分配比 重客观规律,其次,在尊重客观规律的基础上,要第二,实践为认识提供了可能 第二,自发的刺激社会生产力的发展 充分发挥主观能动性。第三,实践是认识得以产生和发展 第三,自发的调节社会收入的分配。在实际的生产运动是物质的存在方式和根本属性。运动是标志一第四,实践是检验认识的真理性的唯一标准。活动中,生产同种商品的各个生产者,由切事物和现象的变化及其过程的哲学范畴。13.感性认识和理性认识及特点 于生产条件和技术水平不同,生产中实际意识的本质是正确发挥作用。感性认识是人们在实践基础上,由感觉器官直接感耗费的劳动时间也不一样。物质世界的运动是绝对的,受到的关于事物的现象、事物的外部联系、事物的23.商品二因素、生产商品的劳动二重性而物质在运动过程中又有某种相对的静止。各个方面的认识,包括感觉、只觉和表象三种形式。商品具有使用价值和价值两个因素 静止是物质运动在一定条件下的稳定状态,包括空特点:直接性,具体,生动形象。商品是劳动产品,生产商品的劳动可区分为具体劳间的相对位置和事物的根本性质暂时未变这样两种理性认识是指人们借助抽象思维,在概括整理大量动力和抽象劳动。具体劳动是生产一定使用价值的运动的特殊状态。感性材料的基础上,达到关于事物的本质、全体、具体形式的劳动;抽象劳动是指撇开一切具体形式,时间是指物质运动的持续性、顺序性,特点是一维内部联系和事物自身规律的认识。理性认识包括概无差别的一般人类劳动,即人类的体力和脑力消耗。性,即一去不复返;空间是指物质运动的广延性、念、判断、推理三种形式。24.生产剩余价值是资本主义生产方式的绝对规律。伸张行,特点是三维性。特点:抽象性、间接性、深刻。25.资本主义经济危机的实质 4.社会生活的本质上是实践。14.真理的绝对性和相对性 生产过剩是资本主义经济危机的本质特征,但是这实践是人类社会的基础,一切社会现象只有在社会真理的绝对性即具有绝对性的真理,是指真理的无种过剩是相对的。实践中才能找到最后的根源,才能得到最终的科学条件性、无限性。(具体内容)26.垄断是竞争的对立物,因而垄断消灭了竞争 说明。内容:首先,任何真理都必然包含着同客观对象相垄断是在自由竞争中形成的,是作为自由竞争的对社会中的实践性主要体现在三个方面: 符合的客观内容,都同谬误有原则的界限,都不能立面产生的,但是,垄断不能消除竞争,反而使竞第一,实践是社会关系形成的基础。被推翻。其次,人类认识按其本性来说,能够正确争变得更加复杂和剧烈。第二,实践形成了社会生活的基本领域 认识无限发展着的物质世界,认识每前进一步,都第一,垄断没有消除产生竞争的经济条件 第三,实践构成了社会发展的动力 是对无限发展着的物质世界的接近。第二,垄断必须通过竞争来维持 5.事物的普遍联系。真理的相对性即具有相对性的真理,是指真理的有第三,社会生产是复杂多样的,任何垄断组织都不联系是指事物内部各要素之间和事物之间相互影条件性、有限性。能把包罗万象的社会生产都包下来 响、相互制约和相互作用的关系.其特点为 首先,真理所反映的对象是有条件的、有限的。他27.经济落后的国家建设社会主义的艰巨性和长期性的首先,联系具有客观性。只能是对无限的物质世界发展的某一阶段、某一方原因 其次,联系具有普遍性。面、某一层次的认识,因而是有限的最后,联系具有多样性。而且其正确程度也是有限的。任何真理对认识对象为什么经济文化相对落后的国家可以先于发达资本6.事物的永恒发展。的反映只能是相对正确的或者是近似性的 主义国家进入社会主义呢? 发展是前进的上升的运动,发展的实质是新事物的15.一切从实际出发、具体问题具体分析 第一,经济文化相对落后的国家可以先于发达资本产生和旧事物的灭亡。人文精神要求把人们的利益和人的发展看做是一切主义国家进入社会主义,是由革命的客观形势和条7.矛盾及其两个属性。认识和实践活动的出发点 件所决定的。第二,经济文化相对落后的国家可以矛盾是反映事物内部和事物之间对立统一关系的哲(1)一切从实际出发;(2)在实践中坚持和发展先于发达资本主义国家进入社会主义,并不违背生学范畴。真理(3)认识世界和改造世界 产关系一定要适合生产力状况的规律。对立和统一分别体现了矛盾的两种基本属性。矛盾社会存在社会意识及其辩证关系 艰巨性和长期性的原因: 的对立属性又称斗争性,矛盾的统一属性又称同一社会存在也称社会物质生活条件,是社会生活的物第一,生产力发展状况的制约。性。质方面,主要是指物质生活资料的生产和生产方式,第二,经济基础和上层建筑发展状况的制约。8.矛盾的普遍性和特殊性及其相互关系 也包括地理环境和人口因素 第三,国际环境的严峻挑战。矛盾无处不在,无时不有,是对矛盾普遍性的简明社会意识是社会生活的精神方面,是社会存在的反第四,马克思主义执政党对社会主义发展道路的探表述。其含义是:矛盾存在于一切事物中,存在于映。社会意识具有复杂的结构,可以从不同角度划索和对社会主义建设规律的认识,需要一一切事物发展过程的始终,旧的矛盾解决了,新的分为个人意识和群体意识、社会心理和社会意识形个长期的艰苦的过程。矛盾又产生,事物始终在矛盾中运动。式,以及作为上层建筑的意识形式和非上层建筑的剩余价值论:剩余价值是在资本主义的生产过程中生产出矛盾的特殊性有三种情形:一是不同事物的矛盾各意识形式。属于上层建筑的社会意识形式称为社会来的。资本主义的生产过程具有两重性,一方面是物质资有其特点,二是同一事物的矛盾在不同发展过程和意识形态,主要包括政治法律思想、道德、艺术、料的生产过程。另一方面是剩余价值的生产过程,即价值发展阶段各有不同特点,三是构成事物的诸多矛盾宗教、哲学等。增值过程。资本主义生产过程是劳动过程和价值增值过程以及每一矛盾的不同方面各有不同性质、地位和作16.生产方式和社会形态 的统一。用。17.生产力与生产关系矛盾运动的规律 价值增殖过程是剩余价值的生产过程,这是资本主义生产矛盾的普遍性和矛盾的特殊性是辩证统一的关系。生产力是生产的物质内容,生产关系是生产的社会过程的主要方面。矛盾的普遍性即矛盾的共性,矛盾的特殊性即矛盾形式,二者的有机结合和统一,构成社会的生产方
第三篇:马克思原理期末复习总结
结合材料分析人类在应对水资源挑战的实践活动中主观目的和客观规律的关系 人类实践活动是有目的的,目的的实现收到客观条件及其规律的制约,面对水资源短缺的挑战,人类必须从实际出发,遵循和利用自然规律和社会规律,转变实践活动方式,以最少的水资源消耗达到最佳的社会经济效益,实现可持续发展 矛盾普遍性和特殊性的关系
矛盾普遍性是指矛盾存在于一切事物中,存在于一切事物发展过程的始终,矛盾特殊性是指矛盾具有的各自的特点,个性,不同实物的矛盾各有其特点,同一事物的矛盾在不同发展过程和发展阶段各有不同特点,矛盾普遍性与矛盾特殊性是辩证统一的关系,矛盾的普遍性既矛盾的共性,矛盾的特殊性既矛盾的个性,矛盾的共性是无条件的,绝对的。矛盾的个性是有条件的,相对的,任何现实存在的食物都是个性与共性的统一,个性离不开共性,共性寓于个性之中,个性与共性在一定条件下相互转化,矛盾的普遍性与特殊性的关系,共性和个性,一般与个别的关系是矛盾问题的精华所在互联网,思想观念,影响
实践在人们的认识的形成中具有决定作用,时间产生了认识的需要,为认识提供了可能,是认识得以产生和发展。互联网作为一种现代化传播工具,打破了地域民族国别等界限,大大缩短了人们之间互相交往联系的距离,它的出现对大学生产生了极大的吸引力,也为大学生通过上网实践发展自身的思想认识提供了可能,依据认识源于实践的原理,当代大学生在实践中经常接触互联网中先进的文化与观念,能激发自己积极向上的精神,摄取有用的文化知识,培养科学人文知识,长期解除其中不好的部分则会对自己的思想带来不好的影响,因此当代大学生应充分利用互联网的积极作用避开其负面影响,提高自身素质
大学生正确价值观
社会主义的价值观体现了社会主义精神文明所倡导的为中国特色社会主义和共产主义而奋斗的社会政治理想,为人民服务的人生观,社会主义的荣辱观崇尚科学追求真理的科学观,集体主义的道德观,真善美相统一的积极健康的审美观等,树立这样的价值观不仅对于我国社会主义事业的健康发展,而且队以当代大学生的健康成长具有重要的意义
两种对立历史观及历史观基本问题
对待社会历史问题上,存在着两种根本对立的观点:一种是唯物历史观,另一种是唯心史观,在马克思主义产生之前,唯心史观一直占据着统治地位,社会存在与社会意识问题,是社会历史观的基本问题
社会存在与社会意识机器辩证关系
社会存在也称社会物质生活条件,是社会生活的物质方面,只要是指物质生活资料的生产及生产方式,也包括地理环境和人口因素:其中生产方式是社会历史发展的决定性力量。社会意识是社会生活的精神方面,是社会存在的反应。社会存在和社会意识是辩证统一的关系,社会存在决定社会意识,社会意识是社会存在的反应,并反作用于社会存在
第四篇:编译原理课程设计
课 程 设 计 报 告
设计题目:一个简单文法的编译器前端的设计与实现
班
级: 计算机1206 组长学号:201239 组长姓名:闫智宣 指导教师:李晓华 设计时间:2014年12月
[在此处键入]
设计分工
组长学号及姓名: 20123974
闫智宣
分工:
语法分析,四元式生成,目标代码优化及生成 组员1学号及姓名:20123977
廖峭 分工:
词法分析,错误处理 组员2学号及姓名:20123959
郭天龙
分工:
符号表生成,语义动作插入,操作界面[在此处键入]
摘要
编译原理课程设计是通过C语言编译器相关子系统的设计,进一步加深对编译器构造的理解;第一部分词法分析,设计各单词的状态转换图,并为不同的单词设计种别码,制作扫描器识别一个个单词,返回值为识别码的序号,返回Token序列。将词法分析器设计成供语法分析器调用的子程序。词法分析器具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;第二部分,语法分析,用递归下降法,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。
我们还做了附加功能,即编译后端,有中间代码优化,生成目标代码汇编语言。通过此次课程设计,提高了我们的独立分析问题、解决问题的能力,以及系统软件设计的能力; 提高程序设计能力、程序调试能力,团结协作能力
关键词:词法分析,语法分析,四元式生成,错误处理,符号表生成,语义动作插入,中间代码优化,生成目标代码 [在此处键入]
目录
摘要
1.概述
2.课程设计任务及要求
2.1 设计任务
2.2 设计要求
3.算法及数据结构
3.1算法的总体思想(流程)
3.2 词法分析模块
3.2.1 功能
3.2.2 数据结构
3.2.3 算法
3.3 语法分析模块
3.3.1功能
3.3.2 数据结构
3.3.3算法
3.4 符号表模块
3.4.1功能
3.4.2 数据结构
3.4.3算法
3.5 四元式模块
3.5.1功能
[在此处键入]
3.5.2 数据结构
3.5.3算法
3.6 语义动作分析模块
3.6.1功能 3.6.2 数据结构
3.6.3算法
3.7 错误处理模块
3.7.1功能
3.7.2 数据结构
3.7.3算法
3.8 目标代码模块
3.8.1功能
3.8.2 数据结构
3.8.3算法
4.程序设计与实现
4.1 程序流程图
4.2 程序说明
4.3 实验结果
5.结论 6.参考文献。7.收获、体会和建议。
[在此处键入]
1.概述
编译器是将C语言翻译为汇编语言代码的计算机程序。编译器将源程序(source language)编写的程序作为输入,翻译产生目标语言(target language)机器代码的等价程序。通常地,源程序为高级语言(high-level language),C语言程序,而目标则是 机器语言的目标代码(object code),也就是可以在计算机硬件中运行的机器代码软件程序。这一过程可以表示为:
源程序→编译器 →目标机器代码程序
2.课程设计任务及要求
2.1设计任务
学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C#语言描述及上机调试,实现一个 C编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
2.2设计要求 要求:
(1)设计词法分析器
设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:
a.具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
b.能够拼出语言中的各个单词; [在此处键入]
c.返回(种别码,属性值,行号)。
(2)语法分析
要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。
3.算法及数据结构
3.1算法的总体思想(流程)
本节主要分析程序的代码结构和代码工程文件的划分。(程序由几个类组成: Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类,分别为词法分析和语法分析类。工程分为几个文件:Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs分别对应Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类的声明和实现文件)。本程序采用C#语言以面向对象的思想编写,程序分为几部分:词法分析(Lexical),语法分析(Grammer),目标代码生成(ObjectCode)。Lexical类主要的工作是词法分析获取Token。Grammer类的主要工作是根据Lexical类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Token类的对象作为Lexical类的一个成员变量,配合Grammer类进行语法分析。
工程文件总体上是按照九个类的格局分为十个文件,分别是九个类的声明文件和实现文件。十个文件为Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他们分别是Lexical类声明文件、Lexical类实现文件、Grammer类声明文件、Grammer类实现文件。[在此处键入]
程序流程
在程序中,Lexical类的对象(Token)作为Grammer类中的一个成员变量,配合Grammer类进行语法分析。它们的关系是这样的:Grammer类的一个成员变量temp首先对源程序删除注释,然后进行词法分析获取所有Token,并将获取的Token存储在Token对象的tokenList(List类型)中。然后Grammer类的语法分析程序就根据tokenList中的Token进行语法分析,生成语法树,最后打印语法树。同时,这也是程序的流程。[在此处键入]
3.2 词法分析模块 3.2.1功能
Lexical类主要的工作是词法分析获取Token序列。
3.2.2数据结构
词法分析阶段的代码被封装成一个类——Lexical,Token中主要是Lexical类的声明代码,Lexical.cs中主要是Lexical类的实现代码。Lexical类对外提供的函数主要有:
static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上几个函数构成了词法分析的骨架,在Lexical类中还有其他成员变量和函数,主要作为这三个函数处理过程的中间步骤,为这三个函数服务。Lexical类的代码结构和主要的成员变量和函数及其含义如下图所示:
3.2.3算法
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是[在此处键入]
根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序示意图:
主程序示意图如图3-1所示。
⑴ 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
(2)程序中需要用到的主要变量为type和number 扫描子程序的算法思想:
首先设置3个变量: [在此处键入]
①token用来存放构成单词符号的字符串; ②number用来整型单词;
③type用来存放单词符号的种别码。
Token定义
Token定义:
Token类型(TokenType):
3.3 语法分析模块
3.3.1功能
语法分析是编译过程的一个逻辑阶段。语法分析的功能是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.3.3.2 数据结构
下图为实现语法分析的类Grammar,属性与方法的作用都已说明 在此处键入]
3.3.3算法
1.文法
下面终结符与非终结符意义
B程序开始
Z 数据类型,如int,char,float等
V 标识符
S 语句
P 语句块
E 加减算术表达式
D 逗号表达式
T 乘除算术表达式
C 关系表达式
L 逻辑表达式
Q 标识符或圆括号
e 表示空
i 表示标识符 a)函数文法
B----ZV()S
[
[在此处键入]
b)语句块文法
P----SP|e
S----{P} c)语句文法
表达式语句文法
S----V=E
goto语句文法
S----i:S
S----goto i
if语句文法
S----if(E)S[else S]
while语句文法
S----while(E)S
声明语句文法
S----ZVD
D----,VD|=ED|e d)表达式文法
E----T|E+T|E-T
T----F|T*F|T/F
C----C|C
L----Q|L&&Q|L||Q
Q----i|(E)|!Q
2.递归下降程序流程图
对应于每个文法编写如下递归下降子程序
主程序(B)[在此处键入] [在此处键入]
3.4 符号表模块
3.4.1功能
进行符号表的储存,添加,更新,查找,保存标识符活跃信息以及输出。3.4.2 数据结构
在此处键入]
3.4.3算法
3.5 四元式模块
3.5.1功能
四元式为中间代码,编译程序进行完语义分析后,先生成中间代码作为过渡,此时中间代码与目标代码已经比较相似
3.5.2 数据结构
[ 在此处键入]
3.5.3算法
3.6语义动作分析模块
3.6.1功能
在语法分析中嵌入相应的语义动作,生成四元式 3.6.2 数据结构
[
[在此处键入]
3.6.3算法 GEQ(+)(-)(*)(/)
(+,i1,i2,t)PUSH(i)ASSI(=)
(=,t,_,POP)LABER(i)
(lb,_,_,i)GOTO(i)
(gt,_,_,i)IF(if)
(if,a,_,_)EL(el)
(el,_,_,_)IE(ie)
(ie,_,_,_)WH()
(wh,_,_,_)DO()
(do,a,_,_)WE(we)
(we,_,_,_)
3.7 错误处理模块
3.7.1功能 保存运行时发现的错误,储存行号已经详细信息并输出。
3.7.2 数据结构
3.7.3算法 [在此处键入]
public static void AddErrorMessage(int lineno,string content)函数用作在发现错误时保存错误信息以及行号。
public static string PrintErrorList()把所有发现的错误格式化后统一输出。
错误信息在语法分析,语义分析,符号表检错中添加。3.8 目标代码模块
3.8.1功能
目标代码生成把优化后的中间代码变换成目标代码,此处的目标代码为汇编代码,采用单寄存器生成目标代码 3.8.2 数据结构[在此处键入]
3.8.3算法
对于一个基本块有如下流程图
W:操作符,B:第一操作数,C:第二操作数,R:寄存器
5.结论
网上找一段话抄上 [在此处键入]
6.测试
测试打开文件
测试保存文件
如果没打开文件,直接敲代码,点保存时会弹出另存为窗口[在此处键入]
测试错误检测,程序缺少main函数的类型,错误列表中显示第一行函数缺少错误类型。
测试错误检测,程序缺少分号,错误列表中显示该行缺少语句结束标志';' 单击错误列表,会自动选定错误行
编译成功,生成并显示token串、符号表、四元式与目标代码 [在此处键入]
测试if与while语句,而且while嵌套在if当中
测试goto语句,结果正确。[在此处键入]
测试优化,输入课件中的代码,结果与课件一样
6.参考文献。
1、陈火旺.《程序设计语言编译原理》(第3版).北京:国防工业出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭译.《编译原理》.24 [在此处键入]
北京:机械工业出版社.2003.3、美 Kenneth C.Louden著.冯博琴等译.《编译原理及实践》.北京:机械工业出版社.2002.4、金成植著.《编译程序构造原理和实现技术》.北京:高等教育出版社.2002.7.收获、体会和建议。
直接拷贝好歹也检查一下错误
对于编译原理的这次课程设计,自己经历了从刚开始的不懂明白任务的要求和内容理论知识的了解开始着手写代码完成基本功能根据DFA及自顶向下等理论修改完善代码等这些过程。
自己着手写词法分析的时候还不清楚词法分析的任务内容,还不知道词法分析的结果是什么,词法分析出错的情况和类型有哪些,也总是将词法分析和语法分析混在一起,不明白哪些错误在词法分析中报,哪些错误在语法分析中判断,后来经过查书、网上资料、请教同学等途径逐步清晰了词法分析的工作内容是从源代码文件中获取出Token,供语法分析使用。在充分了解了语法分析需要哪些信息时,我才真正了解了词法分析的工作内容和目标,才知道词法分析需要完成哪些任务获取到哪些信息。充分了解了词法分析的任务之后,就开始理论知识的学习。经过揣摩书上的例子,自己理解和掌握了怎么设计过滤注释和分析程序中Token的DFA,于是开始根据设计好的DFA进行编码,最后经过调试已经可以正确地完成词法阶段的任务了。这只是词法分析的原始代码,在之后还进行了两次彻底的改动。虽然之前写的词法分析的代码已经完成了词法分析的需求,也是根据DFA的原理编写的,但是在代码结构上却难以体现,在对书上的根据已知DFA写代码的例子进行了详细的研究之后,发现自己的代码并没有像书上那样完全按照所依据的DFA各状态转移的关系进行编写,所以对代码进行了重写,像书上一样严格按照状态之间转移的方式进行编写,将状态划分成11个状态,状态分别按1~11进行标注,程序也按照DFA来编写,也实现了词法分析的功能。再后来写报告的时候,发现分析出Token的那个DFA并不是最简的,有很多多余的状态,完全可以用一个flag标志来标识,从而简化代码结构,于是又重写了一次词法分析函数scan()的代码,将状态缩减为5个,且不再用1-5来表示,而是像书上那样分别取了名字(START、INNUM、INID、INDBSYM、DONE),同时为了简化代码将输出Token到文件的部分从scan()中剥离开来,而在Lexical类中加了一个printToken()的函数,使scan()函数逻辑更加清晰,使读者能够容易地将代码与DFA进行查看比照。
在写语法分析的时候,已经对编译器的语法分析的内容有了一定的了解,所以直接进行了理论的学习。首先自己对递归向下分析法进行了学习,将书上的几个递归向下分析的伪代码看过之后,自己对递归向下的分析方法的原理有了初步的认识,大概知道了根据文法怎么分析,但是对于如何编写代码却还在此处键入]
是难以下手,于是就对照TINY语言的文法看了几遍书后面的TINY语言的递归向下分析的语法分析程序,这样就基本知道了C-语言的语法分析程序怎么写。由于C-语言给出的文法有左递归存在,于是自己将存在左递归的文法改写成EBNF的形式,并据此进行代码编写。由于在编写代码的过程中需要确定分析是否正确或选择多个文法中的某一个文法进行分析,有时必须探测需要的或下一个Token的类型,在这种情况下需要求First集合,在推导中若存在empty,又需要求Follow集合,所以这样又需要我了解First集合和Follow集合,自己在程序中也根据求出的First集合和Follow集合进行判断,以确定程序的走向。在编写过程中,还有一类问题,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子为ID,在分析过程中,由于已经取出了一个ID的Token,且生成了一个IdK的节点,但是在当前状态无法确定是哪一个推导,然而IdK节点已经生成,又无法回退,并且是使用自顶向下的分析方法,已经生成的IdK在程序上方无法使用,自己通过查阅资料等途径的学习确定了在这种情形下的处理方式:将已经生成的IdK节点传到下方的处理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函数都被设计成有节点类型参数的函数,目的就是将已经生成的节点传到下面的分析函数中去。
通过这次的编译原理课程的学习和实践,自己获益良多。首先最基本的成果是完成了课程设计的任务,实现了编译器的词法分析和语法分析阶段的功能,词法分析主要能过滤注释、分析出语法分析阶段需要的Token并满足语法阶段的所有要求,能够判别词法分析阶段是否出错和出错类型和位置。语法分析主要能根据递归向下的分析思想和C-文法对词法分析获取的Token进行语法分析,能够构造出语法树,能够判别语法分析过程中是否出错以及出错位置和错误类型。
由于在编写程序过程中,涉及到了正则表达式、DFA、提取公共左因子、消除左递归、EBNF、求First集合和Follow集合、递归向下分析方法以及编程语言方面的知识,所以,通过本次的课程设计的实践,使得自己对编译原理这门课的许多知识点有了更加深刻和具体的理解,而不再只限制于做题。此外,对以前那些已掌握的知识有了温习和动手锻炼的机会。如:以前在编译原理课上虽然知道First集合和Follow集合怎么求的,却不知道First集合和Follow集合到底是干什么的,通过编写程序自己明白了他们的实际作用,使得自己不仅知其然还知其所以然,从而使得自己加深了对知识点的理解和掌握。由于以前编写代码都是使用JAVA语言,所以C/C++很多内容都忘记了,通过本次的实践,自己又重新拾起了以前的知识。此外,由于在做报告的时候,需要描绘DFA和程序流程图,使得自己初步掌握了使用visio和word画图的能力。此外,对于文档的编写和美化自己也获得了许多有用的经验。[
第五篇:编译原理 学习心得
国际学院 0802 杨良燕 200819100227
《编译原理》课程学习心得
《编译原理》是计算机专业的一门重要课程,正如教材
第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。
通过这一学期的学习,我觉得编译原理是一门理论性很强的课程,从文法和语言的概念到LL(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。因而,我们需要更多的时间来理解、掌握相关的知识,当然在这一过程中也存在很多问题,比如我们后期学习具体文法的分析方法时,对于文法的概念不够清晰,影响了上课的效率,知道老师再次给我们讲解了文法等基础的知识点,我们才慢慢掌握后面所学的LL(1)文法等,也发现了知识点之间的关联。此外,这门课程的课时被安排得很少,一周只有一次,这样很不利于我们对这门重要课程的理解和掌握。但是我觉得我们很幸运,因为老师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,对于我们提出的问题,无论课上或是课外,老师一直是不厌其烦,甚至利用课余时间为我们讲解重要的难题。
编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。从LL(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。对计算机语言世界的知识积累,像滚雪球一样越滚越大。这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理。