编译原理学习.

有时候感觉很无助,迷茫的时候,没有精神支柱的时候。【自暴自弃】
进入人生低谷的时候,找不到方向的时候, 总会出现一些让我兴奋和受到鼓舞的东西。
在一次次的脱变中,发现自己需要学习的东西还很多,很多... ..

我感觉不经历一些事情,就不会学会一些事情,不怕你做错事情,就怕你不肯改错。

我又接触词法分析的另一种词法分析算法[转换表],书中如此描述“理解了此算法思想,也就理解了词法分析器的核心”.

仔细看了30分钟,反复琢磨,终于理解了此算法的真谛,让我狠高兴,很兴奋,在编程的学习道路又燃起了一点星星之火.

下面是我学习一本编译原理书籍做的笔记,我感觉这本书籍比龙书和编译原理及实践要通俗很多,适合我这样智商不高的人看。

 单词存储三元组【单词ID,单词备注,单词行号】

单词行号:单词所在的源程序文件名,单词在源程序文件中得行号。

单词可分为三类:标识符,常量,系统单词。

       标识符(标识符的ID,用户标识符名,单词行号):所有用户标识符使用同一ID,

而在“单词备注”域中存储用户标识符的实际名字。

       常量(常量的ID,在常量表中的位置,单词行号):常量ID是根据常量类型确定的,

即相同数据类型的常量的ID是相同的。在词法分析阶段,只将常量分为整型,实型,字符串

等类型,无须详细区别是哪种详细类型(例如:integer, shortint等)。常量ID可用于指示常量数据类

 

型。在词法分析时,对识别所得到的常量还必须登录入常量表,便于语法分析使用。在常量

的三元组中必须记录该常量在常量表的位置。

       系统单词“即关键字,运算符,界符”(ID,不使用,单词行号):每一个系统单词都

拥有一个唯一的ID编号。语法分析器只需根据ID就可以区别是哪个系统单词了。而系统单词的

单词存储三元组中“单词备注”域是不使用的。不难发现,词法分析器对于关键字,运算符,

界符单词的处理是完全相同的。因此,这三类合并为系统单词类。

 

词法分析【一个独立阶段,独立的一遍】:

        一个独立阶段:就是指将词法分析器作为一个函数,由语法分析器调用。

每次调用语法分析器只识别一个单词,然后将单词直接传递给语法给语法

分析器。整个过程由语法分析器控制,在语法分析过程中,进行单词识别。

        独立的一遍:词法分析器将整个源程序文件扫描一次,识别出所有的单词,然后将源程序

以单词流的方式传递给语法分析器处理。

 

词法分析器主要包括:构造转换图与转换表,设计词法分析器算法,

词法分析器的核心就是依据转换图识别单词。

 

数据结构: 转换表,关键字表,常量表及其单词流。

         1.转换表:是词法分析器的核心。通常用二维数组表示,数组元素可以

根据实际情况而定。

         2.关键字表:词法定义识别单词。完成标识符后再查找关键字表,确定该标识符是否为关键字。

关键字表一般包含两个字段:关键字名,ID。由于每次都要查找关键字表,所以查找的效率至关重要,

常用的查找算法比较多【顺序,折半,哈希表,B-树,B+树等】,MAP是内核中得一种红黑树结构,

查找效率近似于哈希表,属于比较高校的。

         3.单词流:

            struct Token

            {

                  int ... //单词类型,ID。

                  string .... //单词备注

                  LineInfo ... //单词行号信息

             }

             struct LineInfo

             { 

                   int .... //单词所在行号        

                  string ... //单词所在的源程序文件名

              }

 

时间: 2024-09-20 05:26:04

编译原理学习.的相关文章

大前端开发者需要了解的基础编译原理和语言知识

在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Python.JavaScript 这些大众的,也有 Lisp.Perl.Ruby 这些相对小众的.一般来说,当程序员讨论一门语言的时候,默认的上下文经常是:"用 xxx 语言来完成 xxx 任务".所以一直困扰着的我的一个问题就是,为什么完成某个任务,一定要选择特定的语言,比如安卓开发是 Java,前端要用 JavaScript,iOS 开发使用 Objective-C

c语言如何进阶?需不需要学操作系统和编译原理

问题描述 c语言如何进阶?需不需要学操作系统和编译原理 学了一段时间的c语言,基本知识都掌握了,想深入学习一下c语言,不知道需不需要先学习一下操作系统方面的知识或者编译原理,请高手指点一下 解决方案 C语言是一种系统编程语言,有人称它叫做"高级语言中的低级语言",由于它接近硬件,语法相对简单,并且自身抽象程度很差,不适合编写应用程序,而很适合编写系统软件,比如微控制器.嵌入式系统.驱动程序等等. 这恰好是操作系统和编译原理的学习中最适合的语言.C语言接近硬件,接近操作系统,天然地,和操

编译原理

编译原理 语法是指这样的一组规则,用它可以形成和产生一个合适的程序. 词法规则是指单词符号的形成规则. 语法规则是语法单位的形成规则,规定了如何从单词符号形成更大的结构(即语法单位或语法范畴). 一般程序语言的语法单位有:表达式.语句.分程序.函数.过程和程序等. 程序语言的基本功能是描述数据和对数据的运算.所谓程序,从本质上来说是描述一定数据的处理过程.   强制式语言也称过程式语言.其特点是命令驱动,面向语句.一个强制式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改变.

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件.后来,LLVM的scope越来越大,Low Level Virtual Machine已经不足以表示LLVM的全部,于是,LLVM就变成了正式的名字.LLVM可以

编译原理scanner的java代码

问题描述 编译原理scanner的java代码 package lexer; public class Token { public final int tag;public Token(int t) { tag = t;}public String toString() { return """" + (char) tag;} } package lexer; public class Tag { public final static int AND = 256

求各位大神帮忙做一下编译原理程序设计

问题描述 求各位大神帮忙做一下编译原理程序设计 1.设计词法分析器 设计各单词的状态转换图,并为不同的单词设计种别码.将词法分析器设计成供语 法分析器调用的子程序.功能包括:具备预处理功能.将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序:能够拼出语言中的各个单词:http://ask.csdn.net/#将拼出的标识符填入符号表:返回(种别码, 属性值).2.目标代码生成器c. 能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇

编译原理之文法

关于编译原理这块之前根本没有涉及过,这次要用到这里的知识就需要来接触一下这里的内容.编译原理顾名思义就是处理高级语言,使之称为计算机能够识别的语言(低级语言)的原理.而文法呢?就是用来描述程序设计语言的方法.类似佛法,用来描述佛家的诵经禅道的规则的.不用去纠结这个名字,知道这个含义,足以. 文法 概念 终结符和非终结符 如图:在p这个推导式的集合中,存在六个推导式.其中S.A.B为非终结符.a.b.c.d.q.p为终结符.终结符是原子不可分的. 分类 文法的分类也就这几种了,先看各自的定义,在定

ASP.NET MVC的Razor引擎:View编译原理

通过.cshtml或者.vbhtml文件定义的View能够被执行,必须先被编译成存在于某个程序集的类型,ASP.NET MVC采用动态编译的方式对View文件实施编译.当我们在对ASP.NET MVC进行部署的时候,需要对.cshtml或者.vbhtml文件进行打包.针对某个View的第一次访问会触发针对它的编译,一个View对应着一个类型.我们可以对.cshtml或者.vbhtml进行修改,View文件修改后的第一次访问将会导致View的再一次编译.和ASP.NET 传统的编译方式一样,针对V

深入剖析ASP.NET的编译原理之二:预编译(Precompilation)

在本篇文章的第一部分:[原创]深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation),详细讨论了ASP.NET如何进行动态编译的,现在我们来谈谈另外一种重要的编译方式:预编译(Precompilation). 目录 一.为什么要进行预编译 二.In Place Pre-compilation V.S. Pre-compilation for Deployment 三.Non-updatable Pre-compilation V.S. Updatable P