一个简单的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”视图中查看具体的错误信息,并进行相应的修改。

  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。

相关文档
最新文档