一个简单的C语言编译器

合集下载

简单C语言编译器

简单C语言编译器

简单C语言编译器编译器是一种将高级语言转换为机器语言的软件工具。

它是编译原理中的一个重要概念,负责将程序源代码转换成可执行文件。

在这个过程中,编译器会对源代码进行词法分析、语法分析、语义分析和代码优化等操作。

一个简单的C语言编译器包含以下主要组件:1. 词法分析器(Lexer):词法分析器将源代码分割成一个个词素(token),例如关键字、标识符、运算符和常量等。

它可以通过有限自动机(DFA)来实现,也可以使用现有的词法分析工具如Lex。

2. 语法分析器(Parser):语法分析器根据对应的语法规则,将一系列的词素组合成语法树。

它可以通过上下文无关文法(CFG)来实现,例如使用自顶向下的递归下降分析法或自底向上的移入-规约分析法。

3. 语义分析器(Semantic Analyzer):语义分析器对语法树进行语义检查,例如检查变量的声明和使用是否匹配、类型转换是否合法、函数调用是否正确等。

它还可以生成符号表,用于存储程序中的变量、函数和类型等信息。

4. 中间代码生成器(Intermediate Code Generator):中间代码生成器将语法树转换成一种中间表示形式,通常是三地址码、虚拟机指令或者抽象语法树。

该中间表示形式能够方便后续的代码优化和目标代码生成。

5. 代码优化器(Code Optimizer):代码优化器对中间代码进行优化,以提高目标代码的性能。

常见的优化技术包括常量折叠、复写传播、循环展开、函数内联等。

优化器的目标是在不改变程序行为的前提下,尽可能地减少执行时间和存储空间。

6. 目标代码生成器(Code Generator):目标代码生成器将优化后的中间代码转换成机器语言代码。

它可以根据目标平台的特点选择合适的指令集和寻址方式,并生成可以被计算机硬件执行的程序。

7. 符号表管理器(Symbol Table Manager):符号表管理器负责管理程序中的符号表,其中包含了变量、函数和类型等信息。

简单C语言编译器(编译原理)

简单C语言编译器(编译原理)
}
//======================================================================================================
//词法分析函数: void scan()
//数据传递:形参fp接收指向文本文件头的文件指针;
flag=3;
else if(ch==' ')
flag=4;
else if(ch=='\n')
flag=5;
else if(ch=='?')
flag=6;
else if(feof(fp1))
flag=7;//结束
else
flag=0; //illegal character
return(flag);
else if(strcmp(ft->name,"||")==0){ft->mark_name='|';}
else if(strcmp(ft->name,"!=")==0){ft->mark_name='@';}
if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;}
else if(flag==4) {i++;buffer[i]='?';line[i]=row;}
else if(flag==5) {i++;buffer[i]='~';row++;}
{
int flag;
if(ch=='!'||ch=='$'||ch=='&'||ch=='*'||ch=='('||ch==')'||ch=='-'||ch=='_'||

C语言GNU编译器详解

C语言GNU编译器详解

C语言GNU编译器详解在计算机科学领域中,编译器是一种将高级语言代码转化为机器语言的工具。

作为一门广泛应用的编程语言,C语言的GNU编译器(GNU Compiler Collection,简称GCC)在软件开发过程中扮演着重要的角色。

本文将对C语言GNU编译器进行详细解析,帮助读者更好地理解和利用该工具。

一、C语言GNU编译器概述C语言GNU编译器是自由软件基金会(Free Software Foundation)开发的一款编译器集合,旨在为多种计算机平台提供高质量、高效的编译器支持。

它不仅适用于C语言,还可编译C++、Objective-C、Fortran等多种编程语言。

C语言GNU编译器的主要组成部分包括前端(Frontend)和后端(Backend)。

前端负责将源代码转化为GCC内部的一种中间表示形式,而后端则将中间表示形式转化为目标平台的机器码。

二、C语言GNU编译器的重要功能1. 编译:C语言GNU编译器可以将C语言源代码编译成可执行文件。

它支持多种优化选项,可以提升程序的执行效率和性能。

2. 调试支持:GCC提供了丰富的调试功能,如生成调试符号表、支持断点设置、变量追踪等。

这些功能有助于程序员快速定位和修复代码中的错误。

3. 代码优化:GCC具备强大的代码优化能力,可以在编译过程中对源代码进行各种优化,使得生成的机器码更加高效、紧凑,并且减少执行时间和内存占用。

4. 多平台支持:C语言GNU编译器可在不同的操作系统和架构下使用,如Linux、Windows、MacOS等。

它支持多种目标平台,如x86、ARM等。

三、C语言GNU编译器使用示例为了更好地理解C语言GNU编译器的使用方法,以下演示了一个简单的示例:```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```上述代码为经典的Hello, World!程序。

tcc研究tinyccompiler最小的c语言编译器自己编译自己

tcc研究tinyccompiler最小的c语言编译器自己编译自己

TCC研究(1) Tiny C Compiler最小的C语言编译器,自己编译自己原创2015年03月22日02:16:55最近,在学习编译器技术,研究了一下TCC,记录一下。

Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C 语言编译器,而且是开源的,小到只有约100K. (VC, GCC 动不动几十M几百M的, 汗)别看它小, 功能还是很强. 可以编译所有C99标准的ANSI C 程序, 支持CPU包括:X86 32或64位, ARM,支持Windows, Linux, OSX.(跨平台跨系统的能力,比VC强)TCC是由大牛Fabrice Bellard开发的,这位大牛还开发过Qemu, FFMpeg (没有FFMpeg, 就没有抄它的腾讯视频,暴风影音...)一、下载TCC主页:/tcc/下载页:/releases/tinycc/TCC最新版本是0.9.26下载执行程序:tcc-0.9.26-win32-bin.zip 无需安装的,只需要解压即可。

解压缩到c:\tcc , 可见目录下有tcc.exe, 这个是编译器命令行程序,没有IDE界面的将c:\tcc 加入到系统路径中(PATH)后,则可以在任何命令行窗口中使用了。

二、使用TCC用notepad写一个测试用的c程序,如下,存盘为hello.c [html] view plain copy #include &lt;stdio.h&gt; main() { printf("hello,world\n"); }用tcc编译,命令如下:tcc hello.c则将生成hello.exe , 运行hello.exe看看TCC可以不编译C程序,而是把它直接运行,就像脚本解释语言那样。

命令行如下:tcc -run hello.c效果:hello.c不需编译,直接运行了这个将C程序直接运行的功能,是TCC独有的,其它C编译器都不行。

c语言编程软件有哪些

c语言编程软件有哪些

c语言编程软件有哪些C语言是一种广泛应用于系统软件和应用软件开发的高级编程语言。

为了编写和运行C语言程序,开发者需要借助特定的编程软件。

在本文中,我们将介绍几种常用的C语言编程软件。

1. Visual StudioVisual Studio是由微软公司开发的集成开发环境(IDE)。

它支持多种编程语言,包括C语言。

Visual Studio提供了强大的调试工具、自动代码补全功能和丰富的插件生态系统,方便开发者编写和调试C语言程序。

2. EclipseEclipse是一款开源的跨平台集成开发环境。

虽然Eclipse主要用于Java开发,但它也提供了C/C++插件,支持C语言开发。

Eclipse具有高度可定制性,并且拥有强大的代码编辑功能和智能提示功能,能够提高开发效率。

3. Code::BlocksCode::Blocks是一款免费、开源的C/C++集成开发环境。

它提供了友好的用户界面和简洁的布局,使得开发者可以轻松地编写和调试C语言程序。

Code::Blocks支持多编译器,包括GCC和Clang,同时还支持多种操作系统,如Windows、Linux和macOS。

4. Dev-C++Dev-C++是一款简单易用的集成开发环境,专为C和C++开发者设计。

它提供了快速编译和调试功能,同时还具备代码自动完成和语法高亮等特性。

Dev-C++是免费软件,并且支持Windows操作系统。

5. XcodeXcode是苹果公司开发的集成开发环境,主要用于开发基于macOS 和iOS的应用程序。

虽然Xcode的主要语言是Objective-C和Swift,但它也支持C语言开发。

Xcode拥有丰富的工具和调试功能,适用于开发Mac和iOS平台上的C语言程序。

总结:以上是几种常用的C语言编程软件。

每个软件都有其独特的特点和优势,开发者可以根据自己的喜好和需求选择适合自己的工具。

通过这些编程软件,开发者能够更加高效地编写和调试C语言程序,并且提高开发效率。

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤C语言是一种高级编程语言,由于其结构化编程,声明式语法,高效性和可靠性,被广泛用于很多领域。

gcc是一种C语言编译器,是Unix系统中最常用的编译器之一,它可以编译C、C++、JAVA等语言。

本文将为读者介绍对于gcc编译器的基本概念、相关命令以及实践操作步骤。

一、gcc基本概念1. 什么是编译器?先来了解一下编译器的作用。

编译器是将高级语言编写的程序转换成计算机可执行的机器语言的软件程序。

程序员可以使用高级语言编写程序,编译器将高级语言转换成计算机能够理解的机器语言。

2. 什么是gcc?GCC是GNU编译器集合(GNU Compiler Collection)的缩写。

它是一个重要的语言编译器,可以编译C、C++、JAVA等语言的程序。

gcc包含了一系列的编译器,每一个编译器都可以编译不同的语言,它不仅是Linux系统中的常用编译器,也被广泛使用于其他操作系统中。

3. gcc优点- 开源软件:可以透明、高效地利用计算机系统资源,让整个编译过程更灵活。

- 软件体积小:由于每次都是重新编译,因此gcc生成的二进制文件体积很小。

- 可移植性:gcc可以在不同的操作系统上进行编译。

同一份源代码,在不同的系统上编译,可以得到相同的结果。

- 动态链接库:gcc支持动态链接库,可以减少程序的代码冗余问题。

二、gcc常用命令以下是gcc编译器的常用命令:1. gcc -ogcc命令使用" -o"选项可以把源文件编译成可执行文件,例如:```$ gcc -o hello hello.c```上述命令的含义是将hello.c文件编译成hello可执行文件。

2. gcc -cgcc命令使用" -c"选项将源文件编译成目标文件。

目标文件是不可执行的文件,它包含了已经编译过的程序的一部分,这些程序可以用作最终的可执行文件中的一部分。

例如:```$ gcc -c hello.c```上述命令的含义是将hello.c文件编译成目标文件hello.o。

用python做一个C类编译器——语法翻译器

用python做一个C类编译器——语法翻译器

⽤python做⼀个C类编译器——语法翻译器本⽂2017年⾸发⾃本⼈原独⽴站点,后来疲于⽣活,不想折腾个⼈独⽴站点,将⽂章搬运⾃博客园编程语⾔:Python 3.7项⽬地址:python做编译器——语法翻译器编程平台:manjaro编程环境:vscode完成的内容:承接上次的词法分析器,将其输出的字符表转成⼀个语法树,并完成四元式的转换。

采⽤的⽅法:⾃上⽽下的递归⽅式具体实现的语法:语法树⽀持:变量声明语句,赋值语句,输出语句,程序块四元式⽀持:变量声明语句,四则表达式的赋值语句。

⽂件结构词法分析见我的上⼀篇⽂章python做编译器——词法分析除去之前完成的词法分析器,本语法分析程序共涉及1个⽂件,四元式转化涉及⼀个⽂件现将其说明如下:parser.py 语法分析程序generate.py 语法分析程序⽂法说明刚开始很难⾃⼰写出⼀个完整的语法产⽣式,后来借鉴⽹上的语法产⽣式,⾃⼰对其⼀点⼀点扩展,最终形成适合⾃⼰程序的语法产⽣式。

下⾯先给出⼀个四则运算的⽂法Expr -> Term ExprTailExprTail -> + Term ExprTail| - Term ExprTail| nullTerm -> Factor TermTailTermTail -> * Factor TermTail| / Factor TermTail| nullFactor -> (Expr)| num将其⽤python代码实现,⽤⼀个字典存储该⽂法,每个产⽣式的左部作为字典的“键“,⽽产⽣式右部存储在该键值所对应的数组中中。

实现如下grammars = {"E": ["T ET"],"ET": ["+ T ET", "- T ET", "null"],"T": ["F TT"],"TT": ["* F TT", "/ F TT", "null",],"F": ["NUMBER", "BRA"],"BRA": ["( E )",],"END_STATE":r"(null)|(NUMBER)|(ID)|[+-*/=]|(LBRA)|(RBRA)"}可以看出,每个产⽣式左部键值对应的数组内容为相应的右部内容。

eclipse编译c程序

eclipse编译c程序

eclipse编译c程序Eclipse是一款功能强大的开发工具,不仅可以用于Java开发,还可以用于C语言的开发。

本文将介绍如何使用Eclipse来编译C程序。

我们需要安装Eclipse软件。

可以从Eclipse官网下载最新版本的Eclipse,根据操作系统选择对应的安装包进行下载和安装。

安装完成后,打开Eclipse。

接下来,我们需要安装C/C++开发工具。

在Eclipse的菜单栏中选择“Help” -> “Eclipse Marketplace”,在弹出的对话框中搜索“C/C++ Development Tools”,找到对应的插件并进行安装。

安装完成后,重启Eclipse。

现在,我们可以开始编写C程序了。

在Eclipse的菜单栏中选择“File” -> “New” -> “C Project”,输入项目的名称并点击“Next”。

在接下来的对话框中,选择“Executable”作为项目的类型,并选择“C Project”作为工具链。

点击“Finish”完成项目的创建。

在项目中创建一个新的源文件。

在Eclipse的“Project Explorer”视图中,右键点击项目名称,选择“New” -> “Source File”,输入源文件的名称并点击“Finish”。

在源文件中编写C代码。

可以使用Eclipse提供的代码编辑器,输入C语言的代码。

保存文件后,Eclipse会自动进行代码格式化,使代码更加规范。

在编写完代码后,我们需要进行编译。

在Eclipse的菜单栏中选择“Project” -> “Build Project”,或者使用快捷键“Ctrl + B”进行编译。

Eclipse会自动进行编译,并将编译结果显示在“Console”视图中。

如果编译成功,可以在“Console”视图中查看编译后的可执行文件的路径。

如果编译失败,可以在“Problems”视图中查看具体的错误信息,并进行相应的修改。

qt编译c语言

qt编译c语言

QT编译C语言一、概述编写C语言程序是开发软件的基础,而QT是一个跨平台的应用程序开发框架,它提供了丰富的工具和功能,可以帮助开发者轻松地编写和编译C语言程序。

本文将介绍如何使用QT进行C语言的编译,并提供一些实用的技巧和注意事项。

二、QT的安装和配置在开始编译C语言之前,我们需要先安装和配置QT开发环境。

以下是安装和配置QT的步骤:1.下载QT:首先,我们需要从QT官方网站上下载适用于您的操作系统的QT安装包。

在下载过程中,请确保选择与您的操作系统和版本相匹配的安装包。

2.安装QT:下载完成后,双击安装包并按照提示进行安装。

在安装过程中,您可以选择安装的组件和目标文件夹。

建议选择默认选项,以确保安装的完整性。

3.配置QT:安装完成后,打开QT Creator(QT的集成开发环境)并进行一些必要的配置。

首先,选择“工具”菜单下的“选项”选项。

在“构建和运行”选项中,选择您想要使用的编译器(如GCC)并配置相应的路径。

三、创建C语言项目在QT中创建C语言项目非常简单。

按照以下步骤操作:1.打开QT Creator:双击桌面上的QT Creator图标或通过开始菜单打开。

2.创建新项目:选择“文件”菜单下的“新建文件或项目”。

在弹出的对话框中,选择“非QT项目”并选择“C++项目”。

3.配置项目:在配置项目的对话框中,选择“纯C项目”并输入项目的名称和路径。

点击“下一步”并按照提示完成项目的配置。

4.编写C代码:在项目创建完成后,可以在QT Creator中编写C语言代码。

右键单击项目文件夹,并选择“新建文件”。

选择“C源文件”并输入文件名。

然后,您可以在新建的文件中编写C语言代码。

四、编译C语言项目编写完C语言代码后,我们需要将其编译成可执行文件。

在QT中,编译C语言项目也非常简单。

按照以下步骤进行操作:1.打开QT Creator:如果您尚未打开QT Creator,请按照第三节中的步骤打开。

2.打开项目:选择“文件”菜单下的“打开文件或项目”。

c语言编译器的用法

c语言编译器的用法

c语言编译器的用法C语言编译器是一种将C语言源代码转换为机器码的工具。

相信大家都知道,C语言是一种高级编程语言,它能用更接近自然语言的方式描述程序逻辑。

但是,计算机只能理解机器码,所以我们需要使用编译器将C语言源代码转换为机器码,从而使计算机能够执行程序。

本文将围绕C语言编译器的用法进行详细介绍。

一、安装编译器首先,我们需要安装一款C语言编译器,并将其配置到环境变量中,以便在任何地方都能够使用它。

目前,比较流行的C语言编译器有GCC 和Clang,它们都是跨平台的,可以在Windows、Mac和Linux等操作系统中使用。

在Windows系统中,我们可以通过MinGW或者Cygwin来安装GCC编译器。

在Mac系统中,我们可以通过Homebrew来安装。

在Linux系统中,很多发行版中都已经预装了GCC或者Clang编译器。

二、编写源代码安装好编译器之后,我们就可以开始编写C语言源代码了。

首先,我们需要编写一个简单的“Hello World”程序:#include <stdio.h>int main(){printf("Hello World\n");return 0;}这个程序可以在控制台中输出“Hello World”字符串。

请注意,这个程序必须保存为“.c”文件才能够被编译器识别。

三、编译源代码编写好源代码之后,我们就可以使用编译器将其转换为机器码。

在命令行中,进入保存源代码的文件夹,然后输入以下命令:gcc hello.c -o hello这条命令的含义是,使用GCC编译器将hello.c文件编译为一个可执行文件,并将其命名为hello。

请注意,我们可以自己指定可执行文件的名称,这里我们将其命名为hello。

四、运行程序编译完成后,我们就可以运行可执行文件了。

在命令行中,输入以下命令:./hello程序就会在控制台中输出“Hello World”字符串。

五、调试程序在编写程序过程中,我们难免会犯错。

TCC研究(1):TinyCCompiler最小的C语言编译器,自己编译自己

TCC研究(1):TinyCCompiler最小的C语言编译器,自己编译自己

TCC研究(1):TinyCCompiler最小的C语言编译器,自己编译自己原创 2015年03月22日 02:16:55最近,在学习编译器技术,研究了一下TCC,记录一下。

Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器,而且是开源的,小到只有约100K. (VC, GCC动不动几十M几百M的, 汗)别看它小, 功能还是很强. 可以编译所有C99标准的ANSI C程序 , 支持CPU包括:X86 32或64位, ARM,支持Windows, Linux, OSX.(跨平台跨系统的能力,比VC强)TCC是由大牛Fabrice Bellard开发的,这位大牛还开发过 Qemu, FFMpeg (没有FFMpeg, 就没有抄它的腾讯视频,暴风影音...)一、下载TCC主页: /tcc/下载页: /releases/tinycc/TCC最新版本是0.9.26下载执行程序:tcc-0.9.26-win32-bin.zip无需安装的,只需要解压即可。

解压缩到 c:\tcc , 可见目录下有 tcc.exe, 这个是编译器命令行程序,没有IDE界面的将 c:\tcc 加入到系统路径中 (PATH)后,则可以在任何命令行窗口中使用了。

二、使用TCC用notepad写一个测试用的c程序,如下,存盘为 hello.c[html] view plain copy1.#include <stdio.h>2.3.main() {4.printf("hello,world\n");5.}用tcc编译,命令如下:tcc hello.c则将生成 hello.exe , 运行hello.exe看看TCC可以不编译C程序,而是把它直接运行,就像脚本解释语言那样。

命令行如下:tcc -run hello.c效果:hello.c不需编译,直接运行了这个将C程序直接运行的功能,是TCC独有的,其它C编译器都不行。

irun 编译c代码

irun 编译c代码

irun 编译c代码(实用版)目录1.irun 的作用2.编译 C 代码的过程3.使用 irun 编译 C 代码的步骤4.常见问题与解决方案正文1.irun 的作用irun 是一个用于编译和运行 C 语言代码的工具,它可以将 C 语言源代码转换为可执行文件,从而实现在计算机上运行 C 程序的目的。

irun 与其他编译器(如 gcc、clang 等)配合使用,共同完成编译和运行 C 代码的任务。

2.编译 C 代码的过程编译 C 代码的过程可以分为以下几个步骤:(1)预处理:预处理器根据预处理指令(如#include、#define 等)对源代码进行处理,生成一个没有预处理指令但包含预处理结果的文件。

(2)编译:编译器将预处理后的文件作为输入,将其转换为汇编语言代码。

(3)汇编:汇编器将汇编语言代码转换为机器语言代码。

(4)链接:链接器将编译后生成的目标文件(.o 文件)与库文件(.a 文件)进行链接,生成一个可执行文件(如.out 文件)。

(5)运行:最后,通过操作系统运行可执行文件,实现 C 程序的功能。

3.使用 irun 编译 C 代码的步骤(1)安装 irun:在开始使用 irun 之前,需要确保计算机上已经安装了 irun。

可以通过运行以下命令进行安装:```sudo apt-get install irun```(2)编写 C 代码:在文本编辑器中编写 C 代码,并保存为文件(如main.c)。

(3)编译 C 代码:在终端中,切换到 C 代码文件所在的目录,并运行以下命令进行编译:```irun -c main.c```该命令将生成一个名为 main.o 的目标文件。

(4)运行编译后的代码:在终端中,切换到目标文件所在的目录,并运行以下命令:```./main.o```该命令将运行编译后的 C 程序,并显示运行结果。

4.常见问题与解决方案(1)无法找到 irun:如果终端中无法找到 irun 命令,可能是因为irun 没有安装。

使用VS2013做C语言编译器的创建方法

使用VS2013做C语言编译器的创建方法

使用VS2013做C语言编译器的创建方法前言,C语言是一个历史悠久的计算器编程语言,几十年的发展,现在任然经久不衰。

有很多C语言编译器。

这里介绍用强大的VS2013 做C编译器学习C语言方便快捷。

一.打开VS2013IDE二.新建一个项目。

选中Win32 项目,点确定。

三.下一步。

四.选控制台应用程序,钩上空项目。

五.鼠标放在源文件上右击。

六.添加- 新建项七.添加一个welcome.c 文件。

注意默认文件后缀是.cpp ,这里把它改成.c 。

这样就是一个C程序的源文件了。

八.这样就得到了一个空的,C源文件。

九.先输入一行#include “stdio.h”#include 表示包含头文件,在这里是包含了stdio.h包含也就是相当于在这里把stdio.h 文件里的内容,插入到这里。

这是在编译的时候编译器做的处理。

我们只要这样,一行语句就行了。

Stdio.h 这个头文件,是标准输入输出头文件,作用是提供一些,屏幕输出,键盘输入之类的一些api函数。

十.键入main 函数。

main() 函数c语言的入口函数。

一个工程里必须要有一个main函数,并且只能有一个,不能重复。

十一。

这样一个基本的C语言,建成了。

按下“F5”可以运行了。

可能会出现这个对话框。

钩上不再显示。

即可。

十二。

程序运行完了,c窗口会自动关掉。

为了不认他自动关掉。

加了一个函数getchar(); 这样就可以看到测序的结果了。

十三。

这样就可以输出了。

kali编译c语言

kali编译c语言

kali编译c语言Kali是一款基于Debian的Linux发行版,它的目的是为了提供一个专业的安全测试平台。

在Kali上,我们可以使用各种工具来测试和评估计算机系统的安全性,包括渗透测试、漏洞扫描、网络分析等等。

如果你想在Kali上编译C语言程序,下面是一些步骤和建议。

1. 安装编译工具在Kali上编译C语言程序,我们需要安装一些编译工具,包括C语言编译器(如gcc)、g++、make等工具。

你可以使用以下命令来安装这些工具:```sudo apt-get updatesudo apt-get install build-essential```这个命令将会安装所有必需的编译工具,包括gcc、g++、make、libc-dev等等。

2. 编写C语言程序在Kali上编译C语言程序前,我们需要先编写代码。

你可以使用任何文本编辑器来编写代码,如vim、nano、gedit等等。

下面是一个简单的helloworld程序的例子:```#include<stdio.h>int main(){printf("Hello, world!\n");return 0;}```你可以将这个程序保存成一个文件,如helloworld.c。

3. 编译C语言程序我们使用gcc来编译C语言程序。

以下是一个示例命令:```gcc -o helloworld helloworld.c```这个命令将会把helloworld.c编译成一个可执行文件helloworld。

你可以使用以下命令来运行它:```./helloworld```你应该看到“Hello, world!”这个输出。

如果你需要使用Makefile来编译程序,下面是一个示例:```CC=gccCFLAGS=-Wallall: helloworldhelloworld: helloworld.o$(CC) $(CFLAGS) -o helloworld helloworld.ohelloworld.o: helloworld.c$(CC) $(CFLAGS) -c helloworld.cclean:rm -f *.o helloworld```这个Makefile将会编译helloworld程序。

C语言编译器MINGW的使用说明

C语言编译器MINGW的使用说明

编译时将自己的头文件目录设为默认头文件目录
gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o
这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头文件。
gcc -s -o yours yours.o
因为有人说Visual-MinGW生成的代码小,于是研究了一下它的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。
反汇编
gcc -S yours.c
用这个指令能把C语言变成汇编语言,不过不是常见的Intel语法,而是AT&T语法。两者的语法有很大的区别。
2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。输入./test执行程序。
3. 选项 -E <大写,注意>
用法:#gcc -E test.c -o test.i
or
win32api:win32的API函数头文件和连接库
mingw-runtime:MinGW的运行时库
把以上的压缩包解压到一个目录中,如F:\MinGW。
注:MinGW还包括一个MSYM(Minimal SYStem)。这个工具是用来模仿Unix Shell,它可以把Unix上的命令转换成Windows命令,如果习惯Unix可以下载这个工具。
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

gcc编译c文件并运行的方法

gcc编译c文件并运行的方法

gcc编译c文件并运行的方法GCC是一款广泛使用的编译器,可用于编译多种编程语言,包括C语言。

它是一个开源软件,可以在多种平台上使用,如Linux、Windows和Mac OS等。

GCC编译器可以将C语言程序源代码编译为计算机可以执行的机器代码,这些机器代码可以在计算机上直接运行。

本文将介绍如何使用GCC编译C语言程序,并在计算机上运行它们。

步骤1:安装GCC编译器要使用GCC编译C语言程序,首先需要安装GCC编译器。

在Linux系统上,可以使用以下命令来安装GCC:```sudo apt-get install build-essential```在Windows系统上,可以下载MinGW安装包进行安装。

MinGW(Minimalist GNU for Windows)是一套在Windows上使用GCC编译器的工具集。

在Mac OS系统上,可以使用Homebrew包管理器来安装GCC编译器。

在终端上输入以下命令:```brew install gcc```步骤2:编写C语言程序要编译和运行C语言程序,首先需要编写一个C源代码文件。

C源代码文件通常以“.c”为扩展名。

可以编写一个简单的“hello world”程序,并将其保存为“hello.c”文件。

下面是一个示例程序:```#include <stdio.h>printf("Hello, World!");return 0;}```步骤3:使用GCC编译器编译C语言程序一旦编写好了C语言程序,就可以使用GCC编译器将其编译为可执行程序。

在终端上,进入C语言程序所在目录,并使用以下命令编译程序:```gcc -o hello hello.c```在这个命令中,“-o”参数指定编译器编译完后生成的可执行文件的名称。

在本例中,编译器将生成一个名为“hello”的可执行文件。

步骤4:运行已编译的C语言程序执行上述编译命令后,GCC编译器将生成一个可执行文件。

学习C语言用什么编程软件好?说一下理由,谢谢?

学习C语言用什么编程软件好?说一下理由,谢谢?

学习C语⾔⽤什么编程软件好?说⼀下理由,谢谢?C语⾔编程软件其实⾮常多,有轻量级的,也有重量级的,下⾯我简单介绍⼏个不错的C语⾔编程软件,感兴趣的朋友可以⾃⼰尝试⼀下:Dev-C++这是Windows平台下的⼀个轻量级C语⾔编程软件,完全免费,⽬前,许多学校都采⽤这个软件进⾏C语⾔教学,基本使⽤和VC⾮常像,⽀持C++11标准,没有任何⾃动补全、语法检查的功能,纯粹靠⾃⼰⼀⾏⼀⾏撸码,对于初学者来说,⾮常适合锻炼基本功,是⼀个不错的⼊门C语⾔编程软件:Code::Blocks这是⼀个免费、开源、跨平台的C语⾔编程软件,也是轻量级的,插件扩展丰富,⽀持常见的代码补全、语法提⽰、语法检查等功能,可以快速创建Qt、DirectX、GUI等应⽤,使⽤起来也⾮常不错,对于初学者来说,也是⼀个⾮常不错的C语⾔软件:VS Code这是⼀个免费、开源、跨平台的轻量级代码编辑器,可以编辑的编程语⾔⾮常多,插件扩展⾮常丰富,安装C/C++插件,配置本地GCC编译器后,也可以直接编辑运⾏C语⾔程序,智能补全、代码⾼亮、Git、语法提⽰等功能都⾮常不错,如果你想⾃⼰⼿动搭建⼀个C语⾔环境,体验⼀下配置过程,可以使⽤⼀下这个软件,也⾮常不错,很轻巧也很灵活:CLion这也是⼀个跨平台的C语⾔编程软件,JetBrains公司的产品,⽀持Mac、Linux、Windows平台,不是免费的,功能⾮常强⼤,集成了代码分析、代码重构和CMake等功能,对于项⽬开发和管理来说⾮常⽅便,如果你经常做项⽬的话,可以考虑使⽤⼀下这个软件,⾮常不错:Visual Studio这个使⽤的⼈应该是最多的,重量级的,Windows下⼀个⾮常不错的C语⾔编程软件,微软⾃⼰设计研发,插件众多,功能强⼤,代码调试、单元测试、代码重构等功能都⾮常不错,可以快速创建GUI、Web应⽤,对于项⽬开发和管理来说⾮常⽅便,如果你经常在Windows环境下做项⽬开发,可以使⽤⼀下这个软件,也⾮常不错:其实,除了这5个C语⾔编程软件,还有许多其他的,像Linux下的Vim、Emacs,Mac下的Xcode等,使⽤起来也⾮常不错,⾃⼰亲⾝感受⼀下,选择适合⾃⼰的⼀个软件就⾏,⽹上也有相关资料可供参考,希望以上分享的内容能对你有所帮助吧,也欢迎⼤家评论、留⾔。

c语言vscode编译

c语言vscode编译

c语言vscode编译C语言是一种广泛使用的编程语言,而VSCode是一款开发人员常用的集成开发环境(IDE)。

本文将介绍如何在VSCode中编译C语言程序,以及一些相关的注意事项。

我们需要在电脑上安装好VSCode和C语言编译器。

VSCode可以从官网下载并安装,而C语言编译器可以选择常用的GNU GCC编译器。

安装完成后,我们可以打开VSCode并进行相关的配置。

在VSCode中编写C语言程序有两种方式,一种是使用自带的终端,另一种是使用插件。

对于初学者来说,使用自带的终端是比较简单方便的方法。

我们可以在VSCode中打开终端,并进入到我们保存C 语言程序的文件夹中。

接下来,我们可以使用以下命令来编译C语言程序:```gcc -o output_file input_file.c```其中,output_file是编译后生成的可执行文件的名称,input_file.c是我们保存C语言程序的文件名。

在编译过程中,编译器会对程序进行语法检查,并生成可执行文件。

编译完成后,我们可以使用以下命令来运行程序:```./output_file```这样就可以执行我们编写的C语言程序了。

在程序运行过程中,我们可以根据需要输入相应的数据,并查看程序的输出结果。

需要注意的是,在编写C语言程序时,我们需要遵循C语言的语法规则。

例如,变量的声明要在使用之前,函数的定义要在调用之前等。

此外,C语言是一种强类型的语言,不同类型的数据需要通过类型转换才能进行运算。

在程序中,我们还可以使用条件语句、循环语句等控制结构来实现不同的逻辑功能。

在编写C语言程序时,我们还可以使用一些常用的库函数来简化开发过程。

例如,stdio.h库提供了输入输出函数,math.h库提供了数学运算函数等。

通过调用这些库函数,我们可以更方便地实现各种功能。

除了使用自带的终端,我们还可以通过安装C/C++插件来编写和调试C语言程序。

该插件提供了更多的功能,例如代码自动补全、代码调试等。

LCC-Win32介绍C语言编译器

LCC-Win32介绍C语言编译器

LCC-Win32介绍LCC-Win32原来是一个免费的WIN32编译器,包含一个很好用的IDE,用起来很爽,但是最近的版本是要付费的了(40美圆)。

详情请见LCC-Win32官方网站。

它的免费版本可以在国内得到,到云风工作室看一下,你会有所收获。

简介其实所谓的简介这个部分的内容趋向取决于作者。

但是我所读过的一些指南都是由一个“简介”开始的,这部分的内容通常都是在重复读者会在下面看到的东西,但是也有的简介只是作者的一些想法。

仔细的想一下,其实这个介绍并不是一件简单的事情。

首先,如果你要是开门见山的直奔主题,这是不礼貌的,而且基于web的指南也不应该有超大个的简介,不应该让读者在这个东西上浪费时间和金钱。

看来我的废话也够多的了,让我们切入正题。

这个指南是单页的,建议你等浏览器下载完毕后保存一份拷贝来离线阅读。

编译器的安装编译器的安装简单极了,只要把您下载的文件运行一下就OK了,应该不会遇到什么问题。

但是注意安装的最后要编译库文件,可能要花点时间,要视你的机器速度而定。

Lcc-Win32的一些基本概念Lcc-Win32编译系统是由多个文件构成的。

它们的共同的任务是把文本格式的源代码编译位可以运行的二进制格式。

优良个重要的文件分别是编译器(lcc.exe)和连接器(lcclnk.exe)。

编译器是用来把你编写的文本翻译成处理器可以执行的格式的程序。

连接器用来转换编译器生成的二进制文件(通常叫做目标文件),并添加操作系统用来把程序调入内存并执行所需要的信息它可以把多个目标文件链接为一个单独的程可执行程序,这样就可以使你可以把一个程序的代码文档分割为几个模块,这个能力在你开发大型程序时是很重要的。

虽然这些听起来好像十分的简单,但是实际上并不是这个样子的。

编辑器和链接器需要你在命令行方式下键入你要建立的程序的所有信息,这将需要你记住大量的命令行参数和各种各样的开关,这时就需要IDE——集成开发环境(edit.exe)来提供方便了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

个简单的C语言编译器源代码:////#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers#include <windows.h>#include <string>#include <fstream>#include <list>#include <stack>#include <ctype.h>using namespace std;class Symbol{public:int line;string word;char group;Symbol();Symbol(const Symbol &b);virtual ~Symbol();operator =(const Symbol &b);string code;};class Label{public:Label();virtual ~Label();string text;private:int n;static int next();static int _label;};class Action{public:static int lookUp(char v,int s); private:Action();~Action();static int Table[54][19];static string vs;};class Goto{public:static int lookUp(char v,int s); private:Goto();~Goto();static int Table[54][9];static string vs;};class Compiler{public:optimize();string code;char nextChar();preProcess();//预处理器parser();//语法分析器Symbol *lexer();//词法分析器void emitter();//生成器Compiler(string CmdLine);virtual ~Compiler();err(int no,int line);int hasError;//错误发生状态private:int lookup(string m);char currentChar;string fileName;int line;//行数状态Compiler();int hasFile;//源文件打开状态int needOutSuppose;//输出支持状态ifstream in;//输入CRR文件ofstream log;//输出日志文件ofstream out;//输出ASM文件list<string> symbolList;//符号表};Compiler::Compiler(string CmdLine){line=1;hasError=0;needOutSuppose=0;hasFile=0;fileName=CmdLine;log.open((fileName + "_Log.txt").c_str(),ios::out);//char c; //测试nextChar()//do{c=nextChar();log<<c;}while(c!='#');log<<endl; }Compiler::Compiler(){}Compiler::~Compiler(){log.close();}Symbol *Compiler::lexer() {char c;int s=1;Symbol *r;r=new Symbol();c=currentChar;while(s){switch(s){case 1:if(c=='\x0A')line++;else if(isspace(c))s=1;else if(isalpha(c)||c=='_'){ s=2;r->word=c;}else if(isdigit(c)){s=3;r->word=c;}else{switch(c){case '+':case '-':s=0;r->word=c;r->group='+';r->line=line;case '*':case '%':s=0;r->word=c; r->group='*'; r->line=line; break;case '&':case '|':r->word=c; s=4;break;case '>':case '<':r->word=c; s=5;break;case '!':r->word=c; s=6;break;case '=':r->word=c; s=7;break;case ',':case ';':case '{':case '}':case '(':case ')':case '$':s=0;r->word=c; r->group=c; r->line=line; break;case '/':r->word=c; s=8;break;case '#':s=11;default:s=1;err(1,line);}}c=nextChar();break;case 2:if(isalnum(c)||c=='_'){s=2;r->word+=c;c=nextChar();}else{s=0;r->line=line;if(r->word=="int")r->group='z';else if(r->word=="if")r->group='i';else if(r->word=="else") r->group='e';else if(r->word=="do")r->group='d';else if(r->word=="while") r->group='w';else if(r->word=="return") r->group='r';elser->group='@';}break;case 3:if(isdigit(c)){s=3;r->word+=c;c=nextChar();}else if(isalpha(c)||c=='_'){ s=2;r->word+=c;err(2,line);c=nextChar();}else{s=0;r->line=line;r->group='n';}break;case 4:if((r->word.c_str())[0]==c){ s=0;r->word+=c;r->group='&';r->line=line;c=nextChar();}else {s=1;err(3,line);}break;case 5:if(c=='='){r->word+=c;c=nextChar();}s=0;r->line=line;r->group='>';break;case 6:if(c=='='){r->word+=c;r->group='>';c=nextChar();}else{r->group='!';}s=0;r->line=line;break;case 7:if(c=='='){r->word+=c;r->group='>'; c=nextChar(); }else{r->group='='; }s=0;r->line=line; break;case 8:if(c=='*'){s=9;r->word=""; c=nextChar(); }else{r->line=line; r->group='*'; s=0;}break;case 9:if(c=='*')s=10;elses=9;c=nextChar(); break;case 10:if(c=='/')s=1;else if(c=='*') s=10;elses=9;c=nextChar(); break;case 11:if(c=='\n'){s=1;line++;}elses=11;c=nextChar();break;default:s=1;err(0,line);c=nextChar();}}currentChar=c;log<<"词法分析:"<<r->word<<endl;return r;}Compiler::parser(){log<<endl;log<<"*******************************************"<<endl; log<<"语法分析开始..."<<endl;if(hasFile)in.open((fileName+".crr").c_str(),ios::in);currentChar=nextChar();//词法分析器初始化// Symbol *s=NULL; //测试lexer()// do{// if(s!=NULL)// delete s;// s=lexer();// log<<s->word;// log<<" ";// log<<s->group;// log<<'\t';// log<<s->line;// log<<endl;// }while(s->group!='#');// delete s;int r,s=1,t=1;Symbol *ip,*iq,*it=NULL;Symbol *s1,*s2,*s3,*s4,*s5,*s6,*s7,*m;Label *l1,*l2;stack<int> ss;stack<Symbol *> sos;ss.push(s);ip=lexer();while(t){s=ss.top();t=Action::lookUp(ip->group,s);if(t>0){sos.push(ip);ss.push(t);if(it==NULL)ip=lexer();elseip=it;it=NULL;}else if(t<0){switch(-t){case 1://OK//D->@()Slog<<"语法分析:D->@()S"<<endl; ss.pop();ss.pop();ss.pop();ss.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='D';m->line=s1->line;sos.push(m);//动作if(s1->word!="main")err(5,s1->line);code=s4->code;delete s2;delete s3;delete s4;break;case 2://OK//S->@=E;log<<"语法分析:S->@=E;"<<endl;ss.pop();ss.pop();ss.pop();ss.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作if(lookup(s1->word))m->code=s3->code+"\tpop ax\n\tmov "+s1->word+",ax\n"; elseerr(10,s1->line);delete s1;delete s2;delete s3;delete s4;break;case 3://OK//S->{W}log<<"语法分析:S->{W}"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作m->code=s2->code;delete s1;delete s2;delete s3;break;case 4://OK//S->i(G)Sss.pop();ss.pop();ss.pop();ss.pop();ss.pop();s5=sos.top();sos.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作if(s1->word=="if"){l1=new Label;m->code=s3->code+"\tpop ax\n\tcmp ax,1\n\tjne "+l1->text+"\n"+s5->code+l1->text+":\n"; delete l1;log<<"语法分析:S->i(G)S"<<endl;}if(s1->word=="while"){l1=new Label;l2=new Label;m->code=l1->text+":\n"+s3->code+"\tpop ax\n\tcmp ax,1\n\tjne"+l2->text+"\n"+s5->code+"\tjmp "+l1->text+"\n"+l2->text+":\n";delete l1;delete l2;log<<"语法分析:S->w(G)S"<<endl;}delete s1;delete s2;delete s3;delete s4;delete s5;break;case 5://OK//S->i(G)SeSss.pop();ss.pop();ss.pop();ss.pop();ss.pop();ss.pop();ss.pop();s7=sos.top();sos.pop();s6=sos.top();sos.pop();s5=sos.top();sos.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作l1=new Label;l2=new Label;if(s1->word=="if"){m->code=s3->code+"\tpop ax\n\tcmp ax,1\n\tjnz "+l1->text+"\n"+s5->code+"\tjmp "+l2->text+"\n"+l1->text+":\n"+s7->code+l2->text+":\n";log<<"语法分析:S->i(G)SeS"<<endl; }elseerr(8,s6->line);delete l1;delete l2;delete s1;delete s2;delete s3;delete s4;delete s5;delete s6;delete s7;break;case 6://ok//S->w(G)Slog<<"语法分析:S->w(G)S"<<endl; ss.pop();ss.pop();ss.pop();ss.pop();ss.pop();s5=sos.top();sos.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作delete s1;delete s2;delete s3;delete s4;delete s5;break;case 7://OK//S->zL;log<<"语法分析:S->zL;"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作delete s1;delete s2;delete s3;break;case 8://OK//S->@(E);log<<"语法分析:S->@(E);"<<endl;ss.pop();ss.pop();ss.pop();ss.pop();ss.pop();s5=sos.top();sos.pop();s4=sos.top();sos.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='S';m->line=s1->line;sos.push(m);//动作if(s1->word=="out"&&needOutSuppose)m->code=s3->code+"\tpop ax\n\tcall outint\n"; elseerr(6,s1->line);delete s1;delete s2;delete s3;delete s4;delete s5;break;case 9://OK//W->WSlog<<"语法分析:W->WS"<<endl;ss.pop();ss.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='W';m->line=s1->line;sos.push(m);//动作m->code=s1->code+s2->code;delete s1;delete s2;break;case 10://OK//W->Slog<<"语法分析:W->S"<<endl;ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='W';m->line=s1->line;sos.push(m);//动作m->code=s1->code;delete s1;break;case 11://OK//L->@log<<"语法分析:L->@"<<endl;ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='L';m->line=s1->line;sos.push(m);//动作if(!lookup(s1->word))symbolList.insert(symbolList.end(),s1->word); elseerr(11,s1->line);delete s1;break;case 12://OK//L->L,@log<<"语法分析:L->L,@"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='L';m->line=s1->line;sos.push(m);if(!lookup(s3->word))symbolList.insert(symbolList.end(),s3->word); elseerr(11,s3->line);delete s1;delete s2;delete s3;break;case 13://OK//G->G&Mlog<<"语法分析:G->G&M"<<endl;ss.pop();ss.pop();ss.pop();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='G';m->line=s1->line;sos.push(m);//动作if(s2->word=="&&")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tand ax,bx\n\tpush ax\n"; if(s2->word=="||")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tor ax,bx\n\tpush ax\n"; delete s1;delete s2;delete s3;break;case 14://OK//G->Mlog<<"语法分析:G->M"<<endl;ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='G';m->line=s1->line;sos.push(m);//动作m->code=s1->code;delete s1;break;case 15://M->E>Elog<<"语法分析:M->E>E"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();m=new Symbol;m->group='M';m->line=s1->line;sos.push(m);//动作l1=new Label;l2=new Label;m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tcmp ax,bx\n";if(s2->word==">")m->code+="\tjg "+l1->text+"\n";if(s2->word=="<")m->code+="\tjl "+l1->text+"\n";if(s2->word=="==")m->code+="\tje "+l1->text+"\n";if(s2->word=="!=")m->code+="\tjne "+l1->text+"\n";if(s2->word==">=")m->code+="\tjge "+l1->text+"\n";if(s2->word=="<=")m->code+="\tjle "+l1->text+"\n";m->code+="\tmov ax,0\n\tjmp "+l2->text+"\n"+l1->text+":\tmov ax,1\n"+l2->text+":\tpush ax\n"; delete l1;delete l2;delete s1;delete s2;delete s3;break;case 16://OK//M->!Mlog<<"语法分析:M->!M"<<endl;ss.pop();ss.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='M';m->line=s1->line;sos.push(m);//动作m->code="\tpop ax\n\txor ax,ax\n\tpush ax\n";delete s1;break;case 17://OK//M->(G)log<<"语法分析:M->(G)"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='M';m->line=s1->line;sos.push(m);//动作m->code=s2->code;delete s1;delete s2;delete s3;break;case 18://OK//E->E+Tlog<<"语法分析:E->E+T"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->line=s1->line;m->group='E';sos.push(m);//动作if(s2->word=="+")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tadd ax,bx\n\tpush ax\n"; if(s2->word=="-")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tsub ax,bx\n\tpush ax\n";delete s1;delete s2;delete s3;break;case 19://OK//E->Tlog<<"语法分析:E->T"<<endl;ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='E';m->line=s1->line;sos.push(m);//动作m->code=s1->code;delete s1;break;case 20://OK//T->T*Flog<<"语法分析:T->T*F"<<endl;ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='T';m->line=s1->line;sos.push(m);//动作if(s2->word=="*")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tmul bx\n\tpush ax\n"; if(s2->word=="/")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush ax\n"; if(s2->word=="%")m->code=s3->code+s1->code+"\tpop ax\n\tpop bx\n\tmov dx,0\n\tdiv bx\n\tpush dx\n"; delete s1;delete s2;delete s3;break;case 21://OK//T->Flog<<"语法分析:T->F"<<endl; ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='T';m->line=s1->line;sos.push(m);//动作m->code=s1->code;delete s1;break;case 22://OK//F->(E)log<<"语法分析:F->(E)"<<endl; ss.pop();ss.pop();ss.pop();s3=sos.top();sos.pop();s2=sos.top();sos.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='F';m->line=s1->line;sos.push(m);//动作m->code=s2->code;delete s1;delete s2;delete s3;break;case 23://OK//F->@log<<"语法分析:F->@"<<endl; ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='F';m->line=s1->line;sos.push(m);//动作if(lookup(s1->word))m->code="\tmov ax,"+s1->word+"\n\tpush ax\n"; elseerr(10,s1->line);delete s1;break;case 24://OK//F->nlog<<"语法分析:F->n"<<endl;ss.pop();s1=sos.top();sos.pop();m=new Symbol;m->group='F';m->line=s1->line;sos.push(m);//动作m->code="\tmov ax,"+s1->word+"\n\tpush ax\n"; delete s1;break;case 30://elseerr(8,line);ss.push(0);ss.push(0);ss.push(0);ss.push(0);ss.push(45);s1=new Symbol;s1->group='i';s1->line=line;sos.push(s1);s1=new Symbol;s1->group='(';s1->line=line;sos.push(s1);s1=new Symbol;s1->group='G';s1->line=line;sos.push(s1);s1=new Symbol;s1->group=')';s1->line=line;sos.push(s1);s1=new Symbol;s1->group='S';s1->line=line;sos.push(s1);continue;case 31:err(7,line);it=ip;ip=new Symbol;ip->group=';';ip->line=line;continue;case 32:err(9,line);s1=new Symbol;s1->line=line;s1->group='S';sos.push(s1);break;default:err(4,ip->line);goto label1;}//switchr=ss.top();iq=sos.top();r=Goto::lookUp(iq->group,r);if(r)ss.push(r);elseerr(4,iq->line);}//elseelse if(t==0&&!hasError){log<<endl;log<<"代码通过语法检查,未发现语法错误."<<endl; }}//whilelabel1:in.close();log<<"词法分析完毕..."<<endl;log<<"*******************************************"<<endl; }Compiler::preProcess(){string tmpstr;ifstream ins((fileName+".crr").c_str(),ios::in);log<<"*******************************************"<<endl; log<<"程序预处理开始"<<endl;if(ins.is_open()){hasFile=1;log<<"打开文件\'"<<fileName<<".crr\' 成功!"<<endl;}else{hasFile=0;log<<"打开文件失改!"<<endl;}while(getline(ins,tmpstr)){if(tmpstr.substr(0,18)=="#import system.out"){needOutSuppose=1;break;}}if(needOutSuppose)log<<"需要引入系统函数\'System.out\'."<<endl;elselog<<"不需要引入系统函数\'System.out\'."<<endl;log<<"程序预处理完成!"<<endl;log<<"*******************************************"<<endl; ins.close();}char Compiler::nextChar(){char ch;if(in.get(ch)){currentChar=ch;return ch;}else{currentChar=ch;return '$';}}void Compiler::emitter(){if(hasError){log<<endl;log<<"*******************************************"<<endl; log<<"源代码中有错误,不能生成目标代码!"<<endl;log<<"*******************************************"<<endl; return;}log<<endl;log<<"*******************************************"<<endl; log<<"开始生成目标代码..."<<endl;out.open((fileName + ".asm").c_str(),ios::out);if(out.is_open()){log<<"创建文件"<<(fileName + ".asm").c_str()<<"成功!"<<endl;out<<"\t.model small"<<endl;out<<"\t.stack"<<endl;out<<"\t.data"<<endl;while(!symbolList.empty()){out<<symbolList.front().c_str()<<"\tdw ?"<<endl;symbolList.pop_front();}out<<"__end\tdb 13,10,\'Press Any Key To Continue...\',\'$\'"<<endl; out<<"\t.code"<<endl;out<<endl;if(needOutSuppose){log<<"写入被引入系统函数代码."<<endl;out<<"outint proc near"<<endl;out<<"\tmov cx,0"<<endl;out<<"\tmov bx,10"<<endl;out<<"again:\tmov dx,0"<<endl;out<<"\tdiv bx"<<endl;out<<"\tpush dx"<<endl;out<<"\tinc cx"<<endl;out<<"\tcmp ax,0"<<endl;out<<"\tjne again"<<endl;out<<"print:\tpop dx"<<endl;out<<"\tadd dl,30h"<<endl;out<<"\tmov ah,02h"<<endl;out<<"\tint 21h"<<endl;out<<"\tloop print"<<endl;out<<"\tmov dl,20h"<<endl;out<<"\tmov ah,02h"<<endl;out<<"\tint 21h"<<endl;out<<"\tret"<<endl;out<<"outint\tendp"<<endl;out<<endl;}out<<"main\tproc near"<<endl;out<<"\t;***CODE START***"<<endl;log<<"开始优化代码."<<endl;optimize();log<<"优化代码完毕."<<endl;out<<code;log<<"写入目标代码."<<endl;out<<"\t;***CODE END***"<<endl;out<<"\tret"<<endl;out<<"main endp"<<endl;out<<endl;out<<"start:"<<endl;out<<"\tmov ax,@data"<<endl;out<<"\tmov ds,ax"<<endl;out<<"\tcall main"<<endl;out<<"\tlea dx,__end"<<endl;out<<"\tmov ah,09h"<<endl;out<<"\tint 21h"<<endl;out<<"\tmov ah,08h"<<endl;out<<"\tint 21h"<<endl;out<<"\tmov ah,4ch"<<endl;out<<"\tint 21h"<<endl;out<<"\tend start"<<endl;out.close();log<<endl;log<<"代码生成完成!"<<endl;log<<"*******************************************"<<endl; }else{log<<endl;log<<"无法创建文件!"<<endl;log<<"*******************************************"<<endl;}// Label *q;//测试Label// for(int i=0;i<10;i++){// q=new Label;// log<<q->text.c_str()<<endl;// delete q;// }return;}Compiler::err(int no,int line){string errText;hasError=1;switch(no){case 1:errText="出现无法识别的符号.";break;case 2:errText="错误的标识符.";break;case 3:errText="运算符\'&&\'(\'||\')写成\'&\'(\'|\')了.";break;case 4:errText="语法错误,编译停止!";break;case 5:errText="找不到main()函数.";break;case 6:errText="所使用的函数未定义";break;case 7:errText="语句后缺少\';\'.";break;case 8:errText="else没有与之匹配的if.";break;case 9:errText="缺少语句.";break;case 10:errText="变量未定义.";break;case 11:errText="变量以定义过,不能重新定义.";break;default:errText="未知错误!";}log<<"发生错误:文件"<<fileName<<".crr第"<<line<<"行:"<<errText<<endl; }int Compiler::lookup(string m){list<string>::iterator i;for (i = symbolList.begin(); i != symbolList.end(); ++i)if(*i==m)return 1;return 0;}Symbol::Symbol(){}Symbol::Symbol(const Symbol &b) {group=b.group;line=b.line;word=b.word;}Symbol::~Symbol(){}Symbol::operator =(const Symbol &b) {group=b.group;line=b.line;word=b.word;}Label::Label(){n=next();char buffer[6];text=_itoa(n,buffer,10);text="L"+text;}Label::~Label(){}int Label::next(){return ++_label;}int Label::_label=0;Action::Action(){}Action::~Action(){}int Action::lookUp(char v,int s) {int n=vs.find_first_of(v,0);return Table[s-1][n];}string Action::vs ="+*>&=!@n(){};,ziew$";int Action::Table[54][19]={-40,-40,-40,-40,-40,-40,3,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state1-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,0,//state2-40,-40,-40,-40,-40,-40,-40,-40,4,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state3-40,-40,-40,-40,-40,-40,-40,-40,-40,5,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state4-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-40,-40,-40,11,9,-30,10,-40,//state5-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-1,//state6 -40,-40,-40,-40,12,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state7 -40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-32,-32,-40,11,9,-30,10,-32,//state8-40,-40,-40,-40,-40,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state9 -40,-40,-40,-40,-40,-40,-40,-40,13,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state10 -40,-40,-40,-40,-40,-40,17,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state11 -40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state12 -40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state13-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,29,-40,-40,11,9,-30,10,-40,//state14-40,-40,-40,-40,-40,-40,-10,-40,-40,-40,-10,-10,-40,-40,-10,-10,-30,-10,-40,//state15 -40,-40,-40,-40,-40,-40,-31,-40,-40,-40,-31,-31,31,32,-31,-31,-30,-31,-31,//state16 -40,-40,-40,-40,-40,-40,-31,-40,-40,-40,-31,-31,-11,-11,-31,-31,-30,-31,-31,//state17 35,-40,-40,-40,-40,-40,-31,-40,-40,34,-31,-31,33,-40,-31,-31,-30,-31,-31,//state18 -19,36,-19,-19,-40,-40,-31,-40,-40,-19,-31,-31,-19,-40,-31,-31,-30,-31,-31,//state19 -21,-21,-21,-21,-40,-40,-31,-40,-40,-21,-31,-31,-21,-40,-31,-31,-30,-31,-31,//state20 -40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state21 -23,-23,-23,-23,-40,-40,-31,-40,-40,-23,-31,-31,-23,-40,-31,-31,-30,-31,-31,//state22 -24,-24,-24,-24,-40,-40,-31,-40,-40,-24,-31,-31,-24,-40,-31,-31,-30,-31,-31,//state23 -40,-40,-40,38,-40,-40,-40,-40,-40,34,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state24 35,-40,39,-40,-40,-40,-31,-40,-40,34,-31,-31,33,-40,-31,-31,-30,-31,-31,//state25-40,-40,-40,-14,-40,-40,-40,-40,-40,-14,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state26 -40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state27-40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state28-40,-40,-40,-40,-40,-40,-3,-40,-40,-40,-3,-3,-40,-40,-3,-3,-3,-3,-3,//state29-40,-40,-40,-40,-40,-40,-9,-40,-40,-40,-9,-9,-40,-40,-9,-9,-9,-9,-40,//state30-40,-40,-40,-40,-40,-40,-7,-40,-40,-40,-7,-7,-40,-40,-7,-7,-7,-7,-7,//state31-40,-40,-40,-40,-40,-40,44,-40,-40,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state32 -40,-40,-40,-40,-40,-40,-2,-40,-40,-40,-2,-2,-40,-40,-2,-2,-2,-2,-2,//state33-40,-40,-40,-40,-40,-40,7,-40,-40,-40,8,-32,46,-40,11,9,-30,10,-32,//state34-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state35 -40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state36 35,-40,-40,-40,-40,-40,-40,-40,-40,49,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state37 -40,-40,-40,-40,-40,27,22,23,28,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state38-40,-40,-40,-40,-40,-40,22,23,21,-40,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state39 -40,-40,-40,-16,-40,-40,-40,-40,-40,-16,-40,-40,-40,-40,-40,-40,-30,-40,-40,//state40。

相关文档
最新文档