C编译器的设计

前言:这个是我们这学期编译课所要求的大程,我做的是一个C-的编译器,功能不多,但运行正常,开发步骤比较明确,希望与大家共享。

编译器运行效果图如下:

设计文档基本内容如下:

1) 整体框架

2) 词法分析

Class CTokenizer

Class CScaner

C关键字表

标识符词法

3) 语法分析

Class CParser

Grammar

基本树形结构

支持的语句及运算

4) 建立符号表

Class LineListRec

Class BucketListRec

Class CSymbolTable

Class CFunArgsCheck

5) 类型检测

Class CAnalyzer

类型匹配

函数调用参数检测

6) 代码生成

PCode

80X86 ASM

7) 总结

详细内容请阅读本文提供的设计文档与全部源代码。

时间: 2025-01-19 19:16:42

C编译器的设计的相关文章

《编译与反编译技术实战》——2.3 编译器的设计与实现概述

2.3 编译器的设计与实现概述 根据不同的用途和侧重点,编译程序可以进一步分类,换句话说,有许多不同种类的编译器变体.譬如:用于帮助程序开发和调试的编译程序称为诊断编译程序,这类编译器可对程序进行详细检查并报告错误:另一类侧重于提高目标代码效率的编译程序称为优化编译程序,这类编译器通常使用多种混合的"变换"来改善程序的性能,但这往往是以编译器的复杂性和编译时间的增加为代价的.通常,将运行编译程序的机器成为宿主机,将运行编译程序所产生的目标代码的机器称为目标机.如果一个编译程序产生不同于

《编译与反编译技术实战 》一2.3 编译器的设计与实现概述

2.3 编译器的设计与实现概述 根据不同的用途和侧重点,编译程序可以进一步分类,换句话说,有许多不同种类的编译器变体.譬如:用于帮助程序开发和调试的编译程序称为诊断编译程序,这类编译器可对程序进行详细检查并报告错误:另一类侧重于提高目标代码效率的编译程序称为优化编译程序,这类编译器通常使用多种混合的"变换"来改善程序的性能,但这往往是以编译器的复杂性和编译时间的增加为代价的.通常,将运行编译程序的机器成为宿主机,将运行编译程序所产生的目标代码的机器称为目标机.如果一个编译程序产生不同于

《编译与反编译技术实战》——2.3节编译器的设计与实现概述

2.3 编译器的设计与实现概述根据不同的用途和侧重点,编译程序可以进一步分类,换句话说,有许多不同种类的编译器变体.譬如:用于帮助程序开发和调试的编译程序称为诊断编译程序,这类编译器可对程序进行详细检查并报告错误:另一类侧重于提高目标代码效率的编译程序称为优化编译程序,这类编译器通常使用多种混合的"变换"来改善程序的性能,但这往往是以编译器的复杂性和编译时间的增加为代价的.通常,将运行编译程序的机器成为宿主机,将运行编译程序所产生的目标代码的机器称为目标机.如果一个编译程序产生不同于其

编译器自举和移植

编译器自举和移植 有个著名的问题:Mommy, where do compilers comefrom?要解决这个问题,首先来看看T-Diagram.可以将编译器用一个T形图来表示: --------- | S T | --- --- | I | --- 其中,S表示Souce Language,T表示Target Language,I表示ImplementationLanguage. 根据这个图,可以得到两种组合: 1. 由I实现的将S翻译成A的编译器和将A翻译成T的编译器联合起来工作,可以实

《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的

0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的 首先肯定的是先有的编程语言,哪怕这个语言简单到只有一个符号.先是设计好语言的规则,然后编写能够识别这套规则的编译器,否则若没有语言规则作为指导方向,编译器编写将无从下笔. 第1个编译器是怎么产生的?这个问题我并没有求证,不过可以谈下自己的理解,请大伙儿辩证地看. 这个问题属于哲学中鸡生蛋.蛋生鸡的问题,这种思维回旋性质的本源问题经常让人产生迷惑.可是现实生活中这样的例子太多了. (1)英语老师教学生英语,学生成了英语老师后又可以教

《编译与反编译技术实战》——2.2 编译器的结构

2.2 编译器的结构 目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC.C++有G++和I++.Java有JAVAC和GCJ.然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善.因而,实现这些程序设计语言的编译器也需要做出相应的改动.对于程序设计语言自身的改变,有的是为了弥补自身的一些缺陷,如Java语言从设计至今,其体积已经增大了好几倍:有的是为了适应新的软件开发需求,比如为了更容易地开发大型软件等而进行的改善. 除了那些成熟语言的改动会带来编译器软件

《编译与反编译技术实战 》一2.2 编译器的结构

2.2 编译器的结构 目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC.C++有G++和I++.Java有JAVAC和GCJ.然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善.因而,实现这些程序设计语言的编译器也需要做出相应的改动.对于程序设计语言自身的改变,有的是为了弥补自身的一些缺陷,如Java语言从设计至今,其体积已经增大了好几倍:有的是为了适应新的软件开发需求,比如为了更容易地开发大型软件等而进行的改善.除了那些成熟语言的改动会带来编译器软件编

编译器明明可以确定为错误,为什么只报出警告或任何警告错误都不报出?

问题描述 packagecom.test;publicclassTest2{publicstaticvoidmain(String[]args){methodA();}publicstaticvoidmethodA(){//行1Strings=null;//行2System.out.println(s.length());//这一行报一个警告:Nullpointeraccess:Thevariablescanonlybenullatthislocation}}疑问1:多个地方调用Test2类的m

《编译与反编译技术实战》——2.2节编译器的结构

2.2 编译器的结构目前常用的程序设计语言都已经有很多优秀的编译器,比如C语言有GCC和ICC.C++有G++和I++.Java有JAVAC和GCJ.然而,即使这些常用的程序设计语言,其本身也一直在改变,即不断地完善.因而,实现这些程序设计语言的编译器也需要做出相应的改动.对于程序设计语言自身的改变,有的是为了弥补自身的一些缺陷,如Java语言从设计至今,其体积已经增大了好几倍:有的是为了适应新的软件开发需求,比如为了更容易地开发大型软件等而进行的改善.除了那些成熟语言的改动会带来编译器软件编程