简单的C语言编译器--词法分析器】的更多相关文章

1. 定义词法单元Tag   首先要将可能出现的词进行分类,可以有不同的分类方式.如多符一类:将所有逗号.分号.括号等都归为一类,或者一符一类,将一个符号归为一类.我这里采用的是一符一类的方式.C代码如下: #ifndef TAG_H #define TAG_H namespace Tag { //保留字 const int INT = 1, BOOL = 2, MAIN = 3, IF = 4, ELSE = 5, FOR = 6, WHILE = 7, FALSE = 8, BREAK =…
  在学习了编译原理的相关知识后,逐渐的掌握一个编译器的结构.作用和实现方法.同时,希望自己在不断的努力下写出一个简单的C语言编译器. 实现步骤 词法分析器:将C语言测试代码分解成一个一个的词法单元: 语法分析器:利用LR(1)文法分析算法对词法单元进行归约: 语义制导翻译:即语义分析,集成在语法分析器中,在每次归约后执行相应的语义动作,产生三地址码: 代码优化:对三地码进行优化,提高效率: 汇编代码生成:分配寄存器.由三地址码转化为汇编代码,再由汇编器编译成可执行代码 由于时间关系和实现难度较…
  语法分析是最难写的,而这部分确实最伤脑的.大量的语义动作分析差点把我逼疯.   简而言之,这部分的作用就是在每次归约之后,都进行一些语义动作,最终让我们得到测试程序的三地址码,即中间代码. 1. 新的数据结构和函数 为了得到中间代码,我引进了几个struct,如下: //用于标识一个变量的类型 enum TYPE { INT, BOOL, ARRAY }; //状态栈中最重要的信息 struct Info { std::string name = ""; //变量名或者运算符 in…
  语法分析算是最难的一部分了.总而言之,语法分析就是先设计一系列语法,然后再用设计好的语法去归约词法分析中的结果.最后将归约过程打印出来,或者生成抽象语法树. 1. 设计文法 以下是我的文法(引入的M和N是方便以后的语义分析): 1.1.基本框架 Program -> Type main() Block Type -> int | bool Block -> { Stmts return Num ; } Decl -> Type Array ; Array -> Ident…
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个star 本节相关词法分析package地址 致亲爱的读者: 个人的文字组织和写文章的功底属实一般, 写的也比较赶时间, 所以系列文章的文字可能比较粗糙, 难免有词不达意或者写的很迷惑抽象的地方 如果您看了有疑问或者觉得我写的实在乱七八糟, 这个很抱歉, 确实是我的问题, 您如果有不懂的地方 的地方或…
首先向C语言之父Dennis MacAlistair Ritchie致敬! 当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于JVM或者说是用Java实现的,IronPython等是基于.NET实现的,但是Java和C#等本身也要依靠C/C++来实现,等于是间接调用了调用了C.所以衡量某种高级语言的可移植性其实就是在讨论ANSI/ISO C的移植性. C语言是很低级的语言,很多方面都近似于汇编语言,在<Intel32位汇编语…
自序 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设 计大师都是编译领域的高手,像写出BASIC语言的BILL GATES,SUN的JAVA之父等等,在编译上都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔.盖茨也就是从给微机编写Basic语言编译器起家 的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠定了基础.正是这个编写Basic语言编译器的经历,开启盖茨的辉煌职业生涯. 编译器是…
在线C语言编译器/解释器 本文介绍两个C语言在线解释器/编译器,这些工具可以提高代码片段检测方便的工作效率,并可以保证这些代码的正确性,而且还可以和别人一起编辑/分享之间的代码,这样可以共同分析代码并相互协助完成代码段的检查. 1.Codepad…
C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 num 的变量 num = ; //为num赋一个值 printf("我是一个简单的"); //使用 printf() 函数 printf("计算机.\n"); printf("我最喜欢的号码是 %d 因为它是第一个.\n",num); ; } #…
什么是编译器: CPU只认识几百个二进制形式的指令,C语言对CPU而言简直就是天书.C语言是用固定的词汇与格式组织起来,简单直观,程序员容易识别和理解. 这时候就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,就是可执行的程序.exe. 这个工具是特殊的软件,叫做编译器(Compiler). 编译器有很多种,不同平台下有不同类型的编译器. Windows 下常用的是微软开发的 cl.exe,它被集成在 Visual Studio 或 Visual C++ 中,一般不单独使用: Lin…
就我已经经历过的大学课程,仿佛每一门计算机的专业课程的开头,都是在介绍计算机发展的历史,和大名鼎鼎的冯诺依曼结构. 譬如C语言,比较水的计算机导论,c++,数据结构,计算机组成原理,甚至是Linux实践. 第一次听着可能还新鲜,但久而久之就越来越无聊甚至忘记了具体的内容是什么.我也差不多,所以为了你们更好的理解,专门去看了这么一部电影,<模仿游戏>. 除了能看见超帅的男主角,令人揪心的剧情,还有值得我们这种专业人士注意的,当然就是大名鼎鼎的图灵机. 你能想象我们今天接触的大部分电子设备都是从这…
不知道大家有没有想过一个问题:C语言编译器为什么能够用C语言编写? 所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件.   在学习C/C++或者想要学习C/C++可以加入我们的学习交流QQ群: 954607083 ,领取学习资料 其本质在于对文件的读入,分析,及处理.这些操作,C语言都是可以实现的. 所以用C语言来做C语言的编译器是完全可行的. 但是,历史上的第一个C语言编译器,肯定不是C语言写的,因…
我们分两部分介绍C语言的编译器,分别是桌面操作系统和嵌入式操作系统. 桌面操作系统 对于当前主流桌面操作系统而言,可使用 Visual C++.GCC 以及 LLVM Clang 这三大编译器. Visual C++(简称 MSVC)是由微软开发的,只能用于 Windows 操作系统:GCC 和 LLVM Clang 除了可用于 Windows 操作系统之外,主要用于 Unix/Linux 操作系统. 像现在很多版本的 Linux 都默认使用 GCC 作为C语言编译器,而像 FreeBSD.ma…
序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是CPlus相较于C多了一些东西,而相较于C++又少了一些东西,又有点C#的影子,而且并不严格遵守编译原理课本上的CMinus标准,所以暂且取个中间值,就叫C+(CPlus,反正目前还没人用,那我就抱走了). 在开始之前,老规矩: 如果觉得这篇文章可以帮到你,欢迎一键三连(点赞,收藏,打赏(这一项只适…
编译器写作之旅   最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事情.于是便跟随着作者的项目学习,在此记录学习过程,并于大家分享. 本系列文章的目标 编写一个可以自编译的编译器,也就是说是一个C语言编译器 至少针对一个硬件平台. 在编译器领域有很多研究.我想在这个旅程中从绝对零开始,所以我倾向于采用实用的方法,而不是重理论的方法. 遵循 KISS 原则:保持简单,…
LANG=C是最早最简单的C语言环境(标准ASCII码)…
1.安装MinGW编译管理安装软件 官方下载:https://osdn.net/projects/mingw/releases/ 作者百度云备份下载:https://pan.baidu.com/s/1-YIZK-joyS-9hf9CfeCBKw 注意:因为官方网站是外国的服务器,可能国内上不去,需要vpn,或者下载作者在百度云上传的,2019年4月21日的版本 2.安装好MinGW软件后,找到安装文件夹下的bin目录,默认应该是:c:\MinGW\bin 3.系统环境变量的path中将路径添加到…
下载地址CL.7z版权问题:仅供学习交流,请于24小时内删除,本人不承担版权问题… 基本使用: 1.解压缩,例如解压缩到E盘根目录下 2.打开cmd命令行界面(快捷方式win+R输入cmd回车)cd命令切换到CL/Bin目录下 1 2 cd E: cd /CL/Bin 3.可以用任何编辑器在这个目录下编写.程序,如notepad++或者系统自带的记事本.比如在E:/CL/Bin目录下新建一个hello.c其中输入 1 2 3 4 5 #include<stdio.h> main() {    …
这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以) 例: #include<stdio.h> #include<stdlib.h> //int A[5]={0}; int main() { ]={}; //int *A=(int*)calloc(5,sizeof(int)); ;i<;++i) { //A[i]=1; prin…
extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”…
最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Windows10下开的VM虚拟机中的Windows XP C语言程序代码: #include <STDIO.H> int main(){ int age; age=; ){ printf("Successful\n"); }else{ printf("No Access\n…
Visual Studio2013终于开始比较良好地支持C99特性了.在此之前,如果用C语言写代码的话,变量名都需要放到函数体的前面部分,代码写起来十分别扭. 而Visual Studio2013中的C编译器已经支持了不少C99标准,让我来为大家盘点一下. 现在仍然不支持的语法特性有: 1.inline关键字:在VC中,仍然需要用微软自己定义的__inline,而尚不支持inline,尽管inline在C++中是支持的. 2.restrict关键字. 3._Complex与_Imaginary:…
首先,在 https://sourceforge.net/projects/mingw/files/latest/download 下载安装MinGW,如下图所示: 点Installation->Basic Setup,安装里面所有选项. 然后点Installation->Apply all changes.,找到mingw32-gcc.bin(c语言编译器), mingw32-gcc-g++.bin(c++编译器), 和mingw32-gdb.bin(用来调试编译后文件),安装这三个编译器,…
概述 词法分析是编译的第一个环节,其输入是高级语言程序,输出是单词串.词法分析器的主要任务是将高级语言程序作为字符串输入,然后依据词法规则将字符串组合成单词,并输出单词串. 为了方便之后的编译环节,通常将输出的单词串表示成二元组的形式(单词种别码,单词符号的属性值)其中种别码通常用整数表示,按开发者意愿将单词种类分类,相同种类单词使用一个种别码,属性值反映单词符号的特性. 本次实验中保留字.运算符.分界符采用一符一种别码的形式,其定义如表1所示. 为了使程序较为简单,本次实验中的单词符号采用状态…
1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够直接执行的机器代码(各种二进制). 以下就是一个编译过程的简单样例: x=2 (高级语言) MOV x,2 (汇编语言) C7 06 0000 0002 (机器代码) 2.相关程序 a.解释程序(interpreter):它会马上运行程序而不是编译完毕后在运行,典型的解释程序有Java,Lisp等…
稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字符那么长而且没有可读性,所以加一个额外字符串描述一下.它将来会被用于生成编译错误信息. 最后我们来写空白符.换行符和注释的正则表达式.这三个是完全按照C# spec的规范编写的.其中注释包含了两种://开头直到换行的注释已经/*开头直到*/的多行注释.大家可以学习一下它们的正则表达式怎么写: var…
一.设计任务 1.1程序实现要求 PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统.PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关. PL/0的编译程序和目标程序的解释执行程序都是用JAVA语言书写的,因此PL/0语言可在配备JDK的任何机器上实现. 其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序. 用…
某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } void output() { int i; ]; ; i < ; i++) { printf("%d\n", array[i]); } } int main() { input(); output(); ){} ; } 这段代码的目的很简单,在input函数中定义了array[20…
本文是 VMBC / D#  项目 的 系列文章, 有关 VMBC / D# ,  见 <我发起并创立了一个 VMBC 的 子项目 D#>(以下简称 <D#>)  https://www.cnblogs.com/KSongKing/p/10348190.html    . VMBC  需要一个 内置 的  C 编译器,   想来想去, 觉得还是自己写一个, 计划用  C 语言 写,  因为 VMBC 的  C 编译器 要求是一个 本地库,  如果不要求是 本地库,  我就用 C#…
返回总目录 目录: 1.Dev C++的下载&安装: 2.Dev C++的使用: 前言: 那么多编译器,为什么选择Dev C++?理由有下 理由一:Dev C++ 体积比较小,不占用太多的内存. 理由二:Dev C++ 打开速度快,具有自动补齐括号等功能. 理由三:Dev C++ 编译生成的文件简单,操作编写代码方便. 一:Dev C++的下载安装: 1.下载网址:https://sourceforge.net/projects/orwelldevcpp/ 2.傻瓜式安装: (1)双击下载的应用…