编译原理课程设计----C语言编译器的实现

合集下载

C语言编译器前端的设计与实现 实训报告

C语言编译器前端的设计与实现  实训报告
-1-
第 1 章 绪论
1.1 C 语言及编译器概述
C 语言是在 70 年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式 发表了 C 语言。同时由 B.W.Kernighan 和 D.M.Ritchit 合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并 没有定义一个完整的标准 C 语言,后来由美国国家标准学会在此基础上制定了一个 C 语言 标准,于一九八三年发表。通常称之为 ANSI C。C 语言是一种结构化语言。它层次清晰, 便于按模块化方式组织程序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅 具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的 物理地址,进行位(bit)一级的操作。由于 C 语言实现了对硬件的编程操作,因此 C 语言集 高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。 此外,C 语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上, 从而形成了多种版本的 C 语言。
2.3.1 自顶向下的语法分析...........................................................................................5 2.3.2 自底向上的语法分析...........................................................................................5 2.4 语义分析.........................................................................................................................6 2.5 符号表.............................................................................................................................6 2.6 类型检查.........................................................................................................................7 第 3 章 系统详细设计..................................................................................................................8 3.1 系统设计基本思路.........................................................................................................8 3.2 词法分析模块设计.........................................................................................................8 3.3 语法分析模块设计.......................................................................................................11 3.4 语义分析模块设计.......................................................................................................14 第 4 章 结束语............................................................................................................................16 参考文献...................................................................................................................................... 16 附录: 附录 1:词法分析核心代码............................................................................................17 附录 2:语法分析核心代码............................................................................................18

实现C#即时编译器

实现C#即时编译器

实现C#即时编译器结合控制台重定向和C#即使编译器(见我上⾯两篇⽂章)写的WinForm即时C#编译器,功能还不错。

⽂本框就是你Main⽅法内的语句,可以输⼊任意测试代码,⽀持错误⾏号定位,编译结果捕获,⾃动拆分窗格等,程序按F5执⾏,F5……忘记在代码⾥⾯加说明了:( 时间不早了,上传睡觉,带批处理build代码和SharpDevelop⽅式源代码哦。

可以拿下⾯的代码测试程序//F5: Compile and Run the app F6:Kill current Running App//-----------------------------------------------------------System.Diagnostics.Process.Start("notepad");//test Generic CollectionList<int> lstInt = new List<int>{1,3,5,7,9,11};foreach(var v in lstInt)Console.WriteLine(v);//test TimerSystem.Timers.Timer timer = new System.Timers.Timer(1000);timer.Elapsed += delegate{System.Console.WriteLine(DateTime.Now.TimeOfDay.ToString());};timer.Start();Console.ReadKey();//test WinForm Application//Application.Run(new Form());这个程序⽤了我两天的时间,涉及到技术有:1、同线程的控制台重定向到⽂本框2、不同线程的控制台重定向到⽂本框-异步⽅式3、编译代码并执⾏(Invoke⽅式和Process⽅式)4、结束进程树5、⽂件操作等实现编译器的代码如下://#define CompileIntoMemoryusing System;using piler;using System.Collections.Generic;using System.Drawing;using System.Windows.Forms;namespace PhoenixCompiler{///<summary>/// director the Console output to ListBox/// in MainForm Construction:///</summary>public class PhoenixWriter : System.IO.TextWriter{delegate void VoidAction();System.Windows.Forms.TextBox txtBox;public PhoenixWriter(System.Windows.Forms.TextBox box){this.txtBox = box;}public override System.Text.Encoding Encoding {get { return System.Text.Encoding.UTF8;}}//here, must use parameter: char valuepublic override void Write(char value){VoidAction action = delegate{txtBox.AppendText(value.ToString());};txtBox.BeginInvoke(action);}}///<summary>/// Description of PhoenixCompiler.///</summary>public class PhoenixCompiler{public PhoenixCompiler(){}public string GenerateCode(string userCode){string namespaces =@"using System;using ponentModel;using System.Text;using System.Text.RegularExpressions;using System.IO;using System.Collections;using System.Collections.Generic;using System.Windows.Forms;using System.Threading;using System.Reflection;";string codeHead = @"sealed class Phoenix{public static void Main(){//----------your code here-----------";//userCode herestring codeTail = @"//----------your code here-----------}}";string compileCodes = namespaces + codeHead + userCode + codeTail;return compileCodes;}public CompilerResults Compile(string codes){//CSharpCodeProviderpiler.CodeDomProvider compiler = new Microsoft.CSharp.CSharpCodeProvider();//CompilerParameterspilerParameters parameters = new CompilerParameters();parameters.WarningLevel = 4;parameters.ReferencedAssemblies.Add("System.dll");parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");#if CompileIntoMemoryparameters.GenerateInMemory = true;#elseparameters.GenerateExecutable=true;#endifreturn pileAssemblyFromSource(parameters,codes);}}///<summary>/// Description of MainForm.///</summary>public partial class MainForm : Form{System.Diagnostics.Process process;public MainForm(){InitializeComponent();//redirector Console output to ListBox lstResultConsole.SetOut(new PhoenixWriter(txtResult));}//KillProcessTreeByIdpublic void KillProcessTreeById(int parentId){//find all the process id created by parentId, Saved it to List childIdsSystem.Collections.Generic.List<int> childIds=new System.Collections.Generic.List<int>();System.Diagnostics.Process[] processes =System.Diagnostics.Process.GetProcesses();foreach (var element in processes) {string path = string.Format("win32_process.handle='{0}'",element.Id);using (var mo= new System.Management.ManagementObject(path)) {try {mo.Get();} catch (System.Management.ManagementException me) {throw me;}int id=Convert.ToInt32(mo["ParentProcessId"]);if (id==parentId) {childIds.Add(element.Id);}}}foreach (var element in childIds) {//Console.WriteLine(element);System.Diagnostics.Process processKill =System.Diagnostics.Process.GetProcessById(element);if (processKill.ProcessName !="conhost") {processKill.Kill();}//processKill.CloseMainWindow();//processKill.Close();}var processParent = System.Diagnostics.Process.GetProcessById(parentId);if (processParent !=null) {processParent.Kill();}}void TxtCodeKeyDown(object sender, System.Windows.Forms.KeyEventArgs e) {//F5:116 e.KeyCode.ToString() + ":" + e.KeyValue.ToString();if (e.KeyValue == 116) {if (process!=null) {this.KillProcessTreeById(process.Id);process=null;}PhoenixCompiler compiler = new PhoenixCompiler();string code = compiler.GenerateCode(txtCode.Text);pilerResults result = pile(code);ShowResult(result);}if (e.KeyValue==117) {//F6:117 here should terminate the process tree ... ...if (process != null) {this.KillProcessTreeById(process.Id);process=null;}}}public void ShowResult(pilerResults result){txtResult.Text="";Console.WriteLine("Phoenix Compiler! \r\n\tCopyright by XUMINGHUI(2013)");Console.WriteLine("-----------------------------------------------\n");if (result.Errors.HasErrors) {Console.WriteLine("Build ERROR:\r\n");foreach (pilerError error in result.Errors) {Console.WriteLine(error.Line + ":" + error.ErrorText);}return;}//build OKConsole.WriteLine("Build Successfully:\r\n");try {//call Main entry, Console output --> WinForm Control#if CompileIntoMemoryType Phoenix = piledAssembly.GetType("Phoenix");Phoenix.GetMethod("Main").Invoke(null,new string[]{});#else//start another thread to run the generated applicationSystem.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo{ FileName=result.PathToAssembly,UseShellExecute=false,CreateNoWindow=true,RedirectStandardError=true,RedirectStandardOutput=true};process = new System.Diagnostics.Process();process.OutputDataReceived +=(s,e)=>{if (e.Data!=null) {Console.WriteLine(e.Data);}};process.ErrorDataReceived +=(s,e)=>{if (e.Data!=null) {Console.WriteLine(e.Data);}};process.StartInfo = info;process.EnableRaisingEvents = true;process.Start();process.BeginOutputReadLine();process.BeginErrorReadLine();#endif} catch (System.Reflection.TargetInvocationException ex) {Console.WriteLine("Exception:" + ex.InnerException.Message);}}void MainFormFormClosing(object sender, FormClosingEventArgs e){if (process != null) {this.KillProcessTreeById(process.Id);process=null;}}void TxtResultDoubleClick(object sender, EventArgs e) {if (txtResult.Text=="") {return;}string path = System.IO.Path.GetTempFileName();System.IO.File.AppendAllText(path,txtResult.Text); System.Diagnostics.Process.Start("notepad",path); }void TxtCodeDoubleClick(object sender, EventArgs e) {PhoenixCompiler compiler = new PhoenixCompiler();string code = compiler.GenerateCode(txtCode.Text);string path = System.IO.Path.GetTempFileName();System.IO.File.AppendAllText(path,code);System.Diagnostics.Process.Start("notepad",path); }}}。

简单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=='_'||

编译原理_教学设计方案

编译原理_教学设计方案

一、课程概述编译原理是计算机科学中的一个核心课程,主要研究如何将高级语言程序转换为机器语言或中间代码的过程。

本课程旨在使学生掌握编译器的基本原理和设计方法,培养学生分析和解决问题的能力。

二、教学目标1. 知识目标:- 理解编译器的基本概念、工作原理和设计方法。

- 掌握词法分析、语法分析、语义分析、代码生成和优化等编译器核心组件的工作原理。

- 了解编译器在软件工程中的重要作用。

2. 能力目标:- 能够分析和设计简单的编译器。

- 能够运用编译原理知识解决实际问题。

- 培养学生的编程能力和算法设计能力。

3. 素质目标:- 培养学生的逻辑思维能力和严谨的学术态度。

- 增强学生的团队合作意识和沟通能力。

三、教学内容1. 引言:编译器的概念、发展历史和作用。

2. 词法分析:正规表达式、有限自动机、词法分析器设计。

3. 语法分析:上下文无关文法、递归下降分析、LL(1)分析、LR分析。

4. 语义分析:类型检查、作用域分析、语义规则。

5. 中间代码生成:三地址码、四元式、逆波兰表示法。

6. 代码优化:数据流分析、代码优化策略。

7. 目标代码生成:机器代码、汇编语言、目标代码生成技术。

8. 编译器构造工具:编译器生成器、代码优化工具。

四、教学方法1. 讲授法:系统讲解编译原理的基本概念、原理和方法。

2. 案例分析法:通过分析经典的编译器案例,加深对理论知识的理解。

3. 实验法:设计实验,让学生动手实现编译器的基本组件。

4. 讨论法:组织课堂讨论,激发学生的学习兴趣,培养学生的批判性思维。

5. 项目法:设计编译器开发项目,让学生综合运用所学知识。

五、教学过程1. 导入:介绍编译原理的重要性,激发学生的学习兴趣。

2. 讲解:系统讲解编译原理的基本概念和原理。

3. 案例分析:分析经典的编译器案例,帮助学生理解理论知识。

4. 实验:设计实验,让学生动手实现编译器的基本组件。

5. 讨论:组织课堂讨论,解决学生在学习过程中遇到的问题。

编译原理第四版附录c编译程序实验

编译原理第四版附录c编译程序实验

编译原理第四版附录c编译程序实验
编译原理第四版附录C编译程序实验指的是一项编译器开发实验,旨在让学生通过实践掌握编译器的设计和实现原理。

该实验一般分为以下几个步骤:
1. 了解编译器的基本原理和流程:这包括词法分析、语法分析、语义分析、代码生成等基本步骤,以及编译器的组成结构、工作流程等概念。

2. 设计编译器的语法和语义规则:在了解编译器的基本原理之后,需要根据具体的编译语言和需求设计语法和语义规则,通常采用自顶向下或自底向上的语法分析方法。

3. 实现编译器的核心算法和数据结构:编译器的核心算法包括词法分析器、语法分析器、语义分析器和代码生成器等,需要实现相应的数据结构和算法。

4. 测试和调试编译器:在完成编译器的实现之后,需要进行测试和调试,包括对编译器的正确性、效率和容错性进行测试和评估,以及对编译器的性能进行优化。

5. 扩展编译器的功能:在完成基本的编译器实现之后,可以考虑对编译器进行功能扩展,例如支持更丰富的语言特性、优化代码生成等。

总的来说,编译原理第四版附录C编译程序实验是一项非常有挑战性和实用性的实验,旨在让学生深入了解编译器的设计和实现原理,提高编程能力和实践经验。

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计报告课落款称: C-编译器词法分析与语法分析的实现提交文档学生姓名:黄臻旸提交文档学生学号: 1043041227 同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时刻:2021年 6 月 5 日编译原理课程设计报告 (1)一、课程设计目标 (3)二、分析与设计 (3)2.一、说明所用的方式: (3)2.二、系统总图: (3)2.2.一、scanner部份: (3)2.2.二、parse部份: (5)2.2.3、代码设计说明 (7)3、程序代码实现 (10)3.一、获取输入部份(在main.c中): (10)3.二、词法分析部份(在scan.c中): (10)3.3、语法分析部份(在parse.c中): (15)3.4、输出与结点的成立(在util.c中) (29)3.五、TokenType、treeNode与结点类型的声明(在globals.h中) (35)4、测试结果 (36)五、总结 (40)5.一、收成 (43)5.二、不足 (43)一、课程设计目标本次实验,本C- 编译器要紧设计而且实现了C- 编译器的词法分析功能与语法分析功能。

二、分析与设计2.一、说明所用的方式:各部份的实现方式(scanner:手工实现、Lex;parser:递归下降、LL(1)、LR(0)、SLR(1)、2.二、系统总图:2.2.一、scanner部份:2.2.1.一、实验原理:扫描程序的任务是从源代码中读取字符并形成由编译器的以后部份(一般是分析程序)处置的逻辑单元。

由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母将字母组成单词并确信单次的含义很相像。

在此程序中,我将记号分成了以下类型:typedef enum {ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,L T,LET,BT,BET,EQ,NEQ,// = + - * / < <= > >= == !=LPAREN_1,RP AREN_1,SEMI,COM,LPAREN_2,RP AREN_2,LPAREN_3,RP AREN_3,LIN,RIN// { } ; , [ ] ( ) /*} TokenType;其中,关键字有:else、if、int、return、void、while;专用符号有:+、-、*、/、<、<=、>、>=、==、~=、=、;、,、(、)、[、]、{、}、/*、*/其他标记是ID、NUM,通过以下正那么表达式概念:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9小写大写字母是有区别的。

编译原理课程设计___C语言编译器的实现

编译原理课程设计___C语言编译器的实现

扬州大学编译原理课程设计学号:*********姓名:专业:计算机科学与技术课程:编译原理指导教师:***目录一.程序简介与分析---------------------------------------------------------3 二.程序适用范围-----------------------------------------------------------3 三.词法分析---------------------------------------------------------------3 四.语法分析---------------------------------------------------------------4 五.语义分析和中间代码生成------------------------------------------------10 六.代码生成--------------------------------------------------------------12 七.流程图----------------------------------------------------------------13 八.实现------------------------------------------------------------------14 九.程序运行结果----------------------------------------------------------14 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------18简单的编译程序设计一.程序简介与分析本程序由四个部分组成:词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。

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

$编译原理课程设计报告设计题目编译代码生成器设计、学生姓名班级学号指导老师成绩`一、课程设计的目的编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。

为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。

二、课程设计的要求1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。

2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正确。

3、@4、写出完整的算法框架。

5、编写完整的编译程序。

三、课程设计的内容课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。

通过课程设计可以达到综合设计编译程序的目的。

本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。

四、总体设计方案及详细设计总体设计方案:1.总体模块【2.\详细设计:界面导入设计(1)一共三个选项:①choice 1--------cifafenxi②choice 2--------yufafenxi③choice 3--------zhongjiandaima(2)界面演示}图一图二\图三词法分析程序 %(1)流程图设计、置初值调用扫描子程序输出单词二元组 输入串结束结束否是[(2)具体功能的具体设计1、cifafenxi( )首先设置prog[n]来接收输入的语句,以‘#’来结束;调用扫描子程序 scaner1( ),每一次得到一个类型码;用switch判别相应输出;直到syn1=0为止。

2、扫描子程序scaner1( )-----------------扫描输入的语句首先设置3个变量:,①token1用来存放构成单词符号的字符串;②sum1用来存放整型单词;③syn1用来存放单词符号的类型码。

有关scaner1()中关键点解析:①while((ch==' ')||(ch=='\n')) ch=prog[p++]; ;忽略空格②if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))…{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) { token[m++]=ch;ch=prog[p++];} ;判别标识符③for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){ syn=n+1;;break;} ;标识符是否是关键字④if((ch>='0')&&(ch<='9')){ while((ch>='0')&&(ch<='9')){ sum=sum*10+ch-'0';ch=prog[p++];} }/;判别整数(3) 词法分析的运行结果输入begin x:=1; y:=1+2;end #输出语法分析程序(1) 具体功能的具体设计!()---------------分析程序给出算术表达式文法,进行适当的文法变换输入——表达式;输出——表达式语法是否正确。

2.子程序的功能描述"(3) 语法分析的运行结果分析成功图分析失败图【中间代码生成程序(1)总体描述采用递归下降(自上而下)的语法制导翻译法。

在前两次试验的基础上改进。

词法分析程序语法分析程序语义分析程序编译器。

不断完善,不断改进。

渐变的过程。

.种别编码单词值单词符号main1int 2.float3double4char…5if 6else 7…8dowhile9l(l|d)*10;内部字符串( +|-|ε ) d*(.dd* | ε)( e ( +|-|ε )20二进制数值表示dd*|ε)=21+/22- 23* 24(25/(26)27'{28}29,#30;31>32|33>=<34<=35】==36!=37}(2)程序结构描述(3) 程序的功能描述从文件中读入表达式,输出其四元式的结果序列递归下降示意图[…】(4)详细功能描述void scanner(); int merge(int p1,int p2)该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。

|void backpatch(int p,int t)该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。

void fuzhi()该函数的功能是对赋值语句进行分析。

void tiaojian(int *nChain)该函数的功能是对条件语句进行分析。

void xunhuan()该函数的功能是对循环语句进行分析。

.(4) 结果演示图一简单语句生成四元式图二if语句的四元式生成?图三循环语句四元式生成(5)汇编生成if(strcmp(fourCom[i].opera,"=")==0){printf("Move AX,%1s\n",fourCom[i].arg1);printf("Move %5s,Ax\n",fourCom[i].result); <}if(strcmp(fourCom[i].opera,"+")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("ADD Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}、if(strcmp(fourCom[i].opera,"-")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("SUB Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"*")==0){。

printf("Mov AL,%1s\n",fourCom[i].arg1);printf("MUL %1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"/")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("DIv %1s\n",fourCom[i].arg2);@printf("Mov %1s,AL\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"goto")==0){printf("jmp L%1s\n",i);}结果演示<五、课程设计的体会与总结经过一个星期的编译原理课程设计,本人在陈宏建老师的指导下,顺利完成该课程设计。

通过该课程设计,收获颇多。

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

通过本试验的完成,更加加深了对词法分析原理的理解。

通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。

递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。

不成立则“出错处理”。

一、对实验原理有更深的理解通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。

通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。

二、对该理论在实践中的应用有深刻的理解}通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。

三、激发了学习的积极性通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。

把死板的课本知识变得生动有趣,激发了学习的积极性。

把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

以前对与计算机操在这次课程设计中,我就是按照实验指导的思想来完成。

加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

附录-----程序清单#include<>#include<>>#include<fstream>#include<iostream>using namespace std;#define MAX 100char inputstream[50]; esult); esult,t); esult,"%d",t);circle=w; esult)) esult);esult,p1);:sprintf(fourCom[circle].result,"%s",p1);}esult,res);strcpy(fourCom[nextq].arg1,num1);strcpy(fourCom[nextq].opera,op);strcpy(fourCom[nextq].arg2,num2);nextq++;}、void scanner(){sum=0;decimal=0;m=0;(for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++];{isDecimal=1;ch=prog[p++];count=0; pera,fourCom[i].arg1,fourCom[i].arg2,fourCom[i].result); if(strcmp(fourCom[i].opera,"=")==0)>{printf("Move AX,%1s\n",fourCom[i].arg1);printf("Move %5s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"+")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("ADD Ax,%1s\n",fourCom[i].arg2);~printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"-")==0){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("SUB Ax,%1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);~}if(strcmp(fourCom[i].opera,"*")==0){printf("Mov AL,%1s\n",fourCom[i].arg1);printf("MUL %1s\n",fourCom[i].arg2);printf("Mov %1s,Ax\n",fourCom[i].result);}if(strcmp(fourCom[i].opera,"/")==0)){printf("Mov AX,%1s\n",fourCom[i].arg1);printf("DIv %1s\n",fourCom[i].arg2);printf("Mov %1s,AL\n",fourCom[i].result);}if(strcmp(fourCom[i].arg2,"goto")==0&&strcmp(fourCom[i].arg1,"if")==0){)printf("cmp %1s\n",fourCom[i].opera);printf("jnc %1s\n",fourCom[i].result);}else{printf("jmp %1s\n",fourCom[i].result);}~}return;}void main(){ printf(" \n");printf(" \n");printf("##################################################################### \n");-printf(" choice 1--------cifafenxi\n");printf(" choice 2--------yufafenxi\n");printf(" choice 3--------zhongjiandaima\n\n");printf("##################################################################### \n");scanf("%d",&r1);do{switch(r1)《{case 1: cifafenxi();scanf("%d",&r1);break;case 2:yufafenxi() ;scanf("%d",&r1);break;case 3:zhongjiandaima();】scanf("%d",&r1);break;default: printf("error,please input again");break;}}while(r1!=0);;}cifafenxi(){p1=0;printf(" ------------------Welcome!!!(cifafenxi)-----------------");printf("\n please input a string(end with '#'):/n");do{scanf("%c",&ch1);【prog1[p1++]=ch1;}while(ch1!='#');p1=0;do{scaner1();switch(syn1){case 11:printf("( %-10d%5d )\n",sum1,syn1);break;\case -1:printf("you have input a wrong string\n");exit(0);default: printf("( %-10s%5d )\n",token1,syn1);break;}}while(syn1!=0);@}scaner1(){ sum1=0;for(m1=0;m1<8;m1++)token1[m1++]=NULL;ch1=prog1[p1++];m1=0;while((ch1==' ')||(ch1=='\n'))ch1=prog1[p1++];,if(((ch1<='z')&&(ch1>='a'))||((ch1<='Z')&&(ch1>='A'))){ while(((ch1<='z')&&(ch1>='a'))||((ch1<='Z')&&(ch1>='A'))||((ch1>='0')&&(ch1<= '9'))){token1[m1++]=ch1;ch1=prog1[p1++];}p1--;syn1=10;for(n1=0;n1<6;n1++)%if(strcmp(token1,rwtab1[n1])==0){ syn1=n1+1;break;}}else if((ch1>='0')&&(ch1<='9')){ while((ch1>='0')&&(ch1<='9')){ sum1=sum1*10+ch1-'0';|ch1=prog1[p1++];}p1--;syn1=11;}else switch(ch1){ case '<':token1[m1++]=ch1;ch1=prog1[p1++];》if(ch1=='='){ syn1=22;token1[m1++]=ch1; }else{ syn1=20;p1--;}¥break;case '>':token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='='){ syn1=24;token1[m1++]=ch1; }else?{ syn1=23;p1--;}break;case '+': token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='+'){ syn1=17;\token1[m1++]=ch1; }else{ syn1=13;p1--;}break;,case '-':token1[m1++]=ch1; ch1=prog1[p1++];if(ch1=='-'){ syn1=29;token1[m1++]=ch1; }else{ syn1=14;`p1--;}break;case '!':ch1=prog1[p1++]; if(ch1=='='){ syn1=21;token1[m1++]=ch1;—}else{ syn1=31;p1--;}break;case '=':token1[m1++]=ch1;:ch1=prog1[p1++];if(ch1=='='){ syn1=25;token1[m1++]=ch1; }else{ syn1=18;p1--;)}break;case '*': syn1=15;token1[m1++]=ch1;break;case '/': syn1=16;token1[m1++]=ch1;break;。

相关文档
最新文档