编译原理总结

      编译原理主要介绍在编译程序构造的一般原理和方法,其中有语法、词法分析、语法分析、语法制导翻译、语义分析和中间代码生成等等,通过一种类型的句子形成的一种文法,通过文法的共通性,构造词法分析器,语法分析器,等等一系列的分析方法,通过一个流水线一样的东西将一个句子翻译成机器可以理解并执行的语言。也就是编译器一样的存在吧,这种联系软件和机器之间的编译器,涉及的范围很广,涉及的知识也很广,其中要了解机器硬件的东西,了解机器的内部实现原理,才好对症下药,在这些基础上主要的就是算法,实现各个阶段的分析器都需要很复杂的算法,这就涉及到了数据结构和算法这门课程,学好编译原理真的需要将很多的相关课程学好的。

   总结

      编译器实现的是扫描源代码通过词法分析实现有条理的分析单词的合法性,并实现处理方法,将合法的单词输出,然后交给语法分析器,语法分析器会分析一个句子的合法性,将合法的代码交给语义分析器,语义分析器其实是在分析语法的时候边给单词一个个的赋“值”,给其一个意义然后生成中间代码,后期通过代码优化,生成最终代码,交给机器执行。

      在词法分析器的部分,是基于正规文法的,实现源代码的输入、预处理,在识别单词的时候,有些形式相同但是会根据后面所跟得单词的不同而含有不同的意义,这时候就需要超前搜索(看下一个单词符号来分析此单词符号的意义)来实现单词符号的识别,不同的输入字符可能会造成结果不同,我们可以通过状态图来直观的看到状态之间的转化,有利于我们程序的实现,而且为了我们程序的有效编写,将状态转换图更加的规范化,出现了正则表达式,然后很容易就可以实现NFA和DFA,通过三者之间的转化,来实现词法分析器的功能。

        语法分析器是基于上下文无关文法的基础上,主要有两种方式一种是自上而下分析,就是从文法的开始符号触发,自上而下的为输入串建立一棵语法树,或者说,为输入串寻找一个最左推导,这是一个试探的过程,就是要反复使用不同的产生式来匹配,知道找到正确的那个。其中最重要的是利用LL(1)分析法,LL(1)分析需要的文法是LL(1)文法,无回溯和左公共因子,保证俩俩first集不相交,非终结符的first和follow集也不相交,在此文法的基础上,可以生成一个预测分析表,根据此表对一个句子预测分析,判定其是否合法。再有就是自底向上分析,这和自上而下分析正好相反,是根据句子一步步向上规约出开始符号,但是为了规约方便,使用的一般都是规范规约,也就是最右推导的逆过程。比较简单的规范规约是算符优先分析,利用算符优先集的定义,构造firstvt和lastvt集合生成算符优先表,利用此表根据算符优先运算规约句子,但是并不是所有的句子都可以通过这种简单的方法进行规约的,还有一种方法就是LR分析法,通过移进的字符,可以判断出下一步的动作是规约还是移进,通过找到各个状态集,然后构造出LR分析表,通过LR分析表的动作来实现句子的规范规约。SLR要比LR更加准确一些,LR出现的移进和规约的冲突比较多,SLR通过follow集来实现判断下一个字符的输入,然后判断到底是移进还是规约,会将冲突减少。

       在分析完成之后就要为一个合法的句子赋值(综合属性,继承属性)也就是添加语义,让其产生意义,供机器识别,通常属性是作为一部分加到树中,在分析的过程中就被赋值了,然后就是产生中间代码,中间代码的表示方式常用的有三种主要是逆波兰式,三元式,四元式,表示方式还算是比较简单。

感悟

        编译原理我最后在复习的时候主要的还是知识点有些太零碎了,而且用起来比较灵活,比较简单的都是一些套路,但是要说起真正的应用的话还是其实很难得,尤其是将其编写成程序,涉及的算法很复杂,要想吃透编译原理,大学所有的科目都可以整懂了,挺难得,现在学的还都是皮毛上的东西感觉想要发现比较深的问题要应用到实践上,才能发现问题的吧,比如编写一个分析器,确实在复习的时候遇到了一些问题,比如说是LL分析表的构造再找follow集的时候做做就越来越迷糊,同学一起讨论了之后才彻底明白,产生式右边的非终结符的follow集要大一些。后来就差不多没有什么问题,理论上的皮毛太多,以后有时间一定要多了解编译原理,对自己的专业能力一定会有很大的帮助的。


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值