编译原理第一次上机课

合集下载

编译原理上机实习指导书解析

编译原理上机实习指导书解析

编译原理上机实习》指导书一、上机实习目的理解编译程序的构造原理,掌握编译程序的构造方法与技术。

通过实习,使学生既加深对编译原理基础理论的理解,又提高动手能力,特别是提高软件设计能力。

二、上机实习要求在理解编译原理基本思想的基础上,选择一个自己熟悉的程序设计语言,完成编译程序的设计和实现过程。

编译程序的设计可以采用自顶向下和自底向上两种不同的方法。

由于许多高级语言(如PASCAL C)中的语法成分都是递归定义的,所以本实验要求学生采用递归下降分析技术,这是一种自顶向下的的编译方法,其基本思想是对语言的每个(或若干个)语法成分编制一个处理子程序,从处理<程序>这个语法成分的子程序开始,在分析过程中调用一系列过程或函数,对源程序进行语法和语义分析,直到整个源程序处理完毕为止。

本上机实习是为C语言(子集)设计一个编译程序,完成词法分析、语法分析、语义分析等功能,并生成某种机器上的目标代码(汇编语言)或中间代码(四元式)。

三、上机实习步骤1.阅读《上机实习指导书》。

2.根据设计要求写算法,画程序框图3.根据框图编写编译程序4.输入编译程序并上机调试5.撰写上机实习报告四、上机实习内容1、题目:C语言小子集编译程序的实现2、C语言小子集的文法规则:<程序>::=ma in (){<分程序>}<分程序>::=< 变量说明部分>;<语句部分><变量说明部分>::=< 变量说明><标识符表><变量说明>::=int<标识符表>::=< 标识符表>,<标识符><标识符表>::=< 标识符><标识符>::=< 字母><标识符>::=< 标识符><字母><标识符>::=< 标识符><数字><语句部分>::=< 语句部分>;<语句>|<语句><语句>::= <赋值语句>|<条件语句>|<循环语句>|<赋值语句>::=< 标识符>=<表达式><条件>::=< 表达式> <关系运算符><表达式><表达式>::=< 项>|< 表达式><加法运算符><项><项>::=< 因子>|< 项> <乘法运算符><因子><因子>::= <标识符>|<常量>|(<表达式>)<常量>::= <无符号整数><无符号整数>::=< 数字序列><数字序列>::=< 数字序列><数字><数字序列>::=< 数字><加法运算符>::=+卜<乘法运算符>::=*| /<关系运算符>::=<|>|!=|>=|<=|==<复合语句>::={< 语句部分>}<语句1>::= <语句>|<复合语句><条件语句>::=if (<条件>)<语句1>else< 语句1><循环语句>::=while (<条件>)do<语句1><字母>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z< 数字>::=0|1|2|3|4|5|6|7|8|93、实现功能:(1)词法分析扫描源程序,根据词法规则,识别单词,填写相应的表。

编译原理上机指导

编译原理上机指导

第一部分词法分析实验一、简单的扫描器设计一、实验目的:熟悉并实现一个简单的扫描器二、实验内容:1.设计扫描器的自动机;2.设计翻译、生成Token的算法;3.编写代码并上机调试运行通过。

·要求:输入——源程序文件;输出——(1)相应的Token序列;(2)关键字、界符表,符号表,常数表。

三、扫描器设计:扫描器单词Token1.自动机:空l/d 关键字表和界符表l -1○0①②-单词编码d program 3d -1 procedure 4③④-begin 5+ end 6⑤-while 7* do 8⑥-+ 9:= * 10⑦⑧-:11-1 := 12⑨-= 13……,14,;15⑩--1○11-2.关键字表和界符表:四、程序实现:1.数据结构:char ch; //当前字符char strToken[]; //当前单词char *keywords[]={“program”, “procedure”, “begin”,……}; //关键字表、界符表char ID[][]; //符号表int Cons[]; //常数表struct TokenType{ int code,value; }struct TokenType Token[]; //Token数组2.算法设计:1.初始化;2.滤除空格,读取第一个非空字符到ch;3.if (ch是一个字母)4.处理关键字或标识符;5. else if (ch是一个数字)6. 处理常数;else7. 处理界符或错误处理;3.算法求精:·step2 :ch=GetChar(); //读取当前字符到chwhile (ch==‟ …)ch=GetChar();·step3:int IsLetter(char ch) //判断ch是否为字母{ if (ch是A~Z或a~z)return 1;elsereturn 0;}·step4:4.1 在strToken中拼成一个单词;//拼关键字或标识符4.2 code=Reserve(strToken); //查关键字表;if (!code) //未查到,是一个标识符{4.3 value=InsertID(strToken); //将strToken中的单词插入到符号表中4.4 生成并输出一个标识符Token;}else4.5 生成并输出一个关键字Token;·step5:int IsDigit(char ch) //判断ch是否为数字{ if (ch是0~9)return 1;elsereturn 0;}6.1 在strToken中拼成一个单词;//拼常数6.2 value=InsertConst(strToken); //将strToken中的单词插入到常数表中6.3 生成并输出一个常数Token;·step7:7.1 将ch中的字符拼接到strToken中;if (ch==‟:‟)7.2 处理双界符“:=”;7.3 code:=Bound(strToken); //查界符表if (!code) //未查到ProcError(); //错误处理else7.4 生成并输出一个界符Token;·step4.1:while (IsLetter(ch)||IsDigit(ch)){ Concat(); //将ch中的字符拼接到strToken中ch=GetChar();}·step4.2:int Reserve(char *strToken)//用strToken中的单词去查关键字表。

编译原理上机实验

编译原理上机实验

实验1简单的词法分析子程序【实验目的】●理解词法分析在编译程序中的作用●初步了解和掌握词法分析程序的实现方法和技术【实验内容】1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量。

2. 无符号数的算术四则运算中的各类单词的识别。

输入:由无符号数、+、-、*、/、(、)构成的算术表达式。

输出:对识别出的每一单词均单行输出。

如,输入:8*2.5-1.0e2则,输出:8*2.5-1.0e2描述无符号数的确定的、最小化的状态转换图如图1所示。

其中编号1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。

图1 文法G[<无符号数>]的状态转换图实验2词法分析程序设计【实验目的】●理解词法分析中的正规式和自动机●掌握词法分析程序的实现方法和技术【实验内容】某一高级程序设计语言的部分语言子集定义如下:(1)关键字:for if then else while do(所有关键字都是小写)(2)运算符和分隔符:+ - * / : = <><= <>>= == ; ( ) #(3)其他标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digit·digit*(4)空格由空白、制表符和换行符组成。

空格一般用来分隔ID、NUM、运算符、分隔符和关键字,词法分析阶段通常被忽略。

各种词法单元对应的词法记号如下:编写程序,实现词法分析功能。

输入:源程序输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列。

例如:输入源程序x=5;if (x>0)thenx=2*x+1/3;elsex=2/x;#(# 表示输入结束)经词法分析后输出如下序列:(10,x)(18,=)(11,5)(26,;)(2,if)(27,()…说明:关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符,查关键字表。

编译原理上机实验-LL(1)语法分析-C#

编译原理上机实验-LL(1)语法分析-C#

编译原理上机实验报告小组成员:王金名、周攀、汪国辉、澎湃、王帅、齐娟娟、刘鸳鸳一、实验目的:了解LL(1)文法分析的基本原理;提高上机实践能力;增强团队协作能力。

二、实验内容:通过LL1文法分析表分析任意一个符号串是否为某文法的句子;显示具体分析过程;打开、新建、保存分析表;保存分析结果三、实验原理:1.C#字符串处理及数组处理,这是本实验最强有力的工具;2.LL(1)文法分析的基本原理,详见教材P80 LL(1)分析器的总控算法;3.C#文件操作,C#常用控件使用。

四、实验步骤:1.构造应用程序框架,利用内置分析表实现分析符号串的最基础功能(1)使用Visual Studio 2005 新建C#语言环境的windows应用程序LL1GAnalysis;(2)将窗体的名称改成From_Main,相应的代码名称会随之更改;(3)添加texbox控件ID为textBox_input,添加listView控件,ID为listView_Result;(4)public partial class Form_Main : Form里面编写相应代码://全局变量const int Max = 100;public string[,] staticmTable ={{"","i","+","*","(",")","#"},{"S","<error>","<error>","<error>","S::=A","S::=A","<error>"},{"A","<error>","<error>","<error>","A::=BA\'","A::=BA\'","<error>"},{"A\'","A\'::=iBA\'","<error>","A\'::=ε","<error>","<error>","A\'::=ε"},{"B","<error>","<error>","<error>","B::=CB\'","B::=CB\'","<error>"},{"B\'","B\'::=ε","B\'::=+CB\'","B\'::=ε","<error>","<error>","B\'::=ε"},{"C","<error>","<error>","<error>","C::=(","C::=)A*","<error>"} };string[] VN = new string[Max]; int VNLength;string[] VT = new string[Max]; int VTLength;//以下是分析过程中要用到的公共函数public void addTolistView_Result(string step, string stack, string input, stringproduction)//分析步骤及结果显示(向listView中添加条目,并保存到string类型变量(analysisResult)作最终保存分析结果时使用{string strResultbuf = "";strResultbuf += step.PadRight(20, ' ');strResultbuf += stack.PadRight(20, ' ');strResultbuf += input.PadRight(20, ' ');strResultbuf += production.PadRight(20, ' ') + "\r\n";analysisResult += strResultbuf;ListViewItem li = new ListViewItem();li.Text = step;ListViewItem.ListViewSubItem ls = new ListViewItem.ListViewSubItem();ls.Text = stack;li.SubItems.Add(ls);ls = new ListViewItem.ListViewSubItem();ls.Text = input;li.SubItems.Add(ls);ls = new ListViewItem.ListViewSubItem();ls.Text = production;li.SubItems.Add(ls);listView_Result.Items.Add(li);}public void GetVN(string[,] table)//从分析表中获取非终结符{int i;for ( i = 1; i < table.GetLength(0);i++ ){VN[i-1] = table[i,0];}VNLength = i;}public void GetVT(string[,] table)//从分析表中获取终结符{int i;for (i = 1; i < table.GetLength(1); i++){VT[i-1] = table[0,i];}VTLength = i;}public int isVT(string str)//判断str是不是VT中的符号{int mark = 0;for (int i = 0; i < VTLength; i++){if (VT[i] == str){mark = 1;}}return mark;}public int isVN(string str)//判断str是不是VN中的符号{int mark = 0;for (int i = 0; i < VNLength; i++){if (VN[i] == str){mark = 1;}}return mark;}public string outStack(string[] Stack, int top)//栈内符号合并输出的时候用 {string str = "";for (int i = 0; i <= top; i++){str += Stack[i];}return str;}public void removeAllItems(ListView list)//清空listview Items{int itemcount = list.Items.Count;for (int i = itemcount; i > 0 ;i-- ){list.Items.RemoveAt(0);}}public string matchInTable(string[,] mt,string stacktop, string nowstr)//查表栈顶与ch 交叉处的标志并返回{int i,j;for (i = 0; i < mt.GetLength(0); i++ ){if (mt[i,0] == stacktop){break;}}for (j = 0; j < mt.GetLength(1);j++ ){if (mt[0,j] == nowstr){break;}}if (i < mt.GetLength(0)&&j<mt.GetLongLength(1)){return mt[i,j];}else{return"error! ";}}//以下是分析过程public void Start_Analysis(string[,] mTable)//开始分析并显示分析过程{tabControl_mTable.SelectTab(tabPage_Show);ShowmTable(mTable);removeAllItems(listView_Result);listView_Result.BeginUpdate();int top = -1; int step = 0;string[] Stack = new string[Max];string str = textBox_input.Text.Trim();//初始化GetVN(mTable); GetVT(mTable);top++; Stack[top] = "#";top++; Stack[top] = VN[0];str += "#";//分析while (true){if (isVT(Stack[top]) == 1)//Stack[top]是终结符,则比较栈顶符与当前符号{if (Stack[top] == str[0].ToString())//匹配当前符号{if (Stack[top] == "#")//ok{step++;addTolistView_Result(step.ToString(), outStack(Stack, top), str, "OK!");step = 0;break;}else//同时退栈{step++;addTolistView_Result(step.ToString(), outStack(Stack, top), str, ""); top--;str = str.Remove(0, 1);}}else//错误{step++;addTolistView_Result(step.ToString(), outStack(Stack, top), str,"Error!");break;}}else if (isVN(Stack[top]) == 1)//Stack[top]是非终结符,则查表{string production = matchInTable(mTable, Stack[top], str[0].ToString());if (production != "<error>"){step++;addTolistView_Result(step.ToString(), outStack(Stack, top), str, production);string probuf = "";if (production[1] == '\''){probuf = production.Remove(0, 5);}else{probuf = production.Remove(0, 4);}char[] chbuf = probuf.ToCharArray();int i = chbuf.Length - 1;string strbuf = "";Stack[top] = null;top--;while (i >= 0){if (chbuf[i] != 'ε'){if (chbuf[i] != '\''){top++;Stack[top] = strbuf.Insert(0, chbuf[i].ToString());strbuf = "";}else if (chbuf[i] == '\''){strbuf += strbuf.Insert(0, chbuf[i].ToString());}}else { break; }i--;}}else//错误production.Length != 0不在分析表中{step++;addTolistView_Result(step.ToString(), outStack(Stack, top), str, "Error!");break;}}else//错误非法字符{step++;addTolistView_Result(step.ToString(), "错误", str, "非法字符:" +str[0].ToString());break;}}//分析结束listView_Result.EndUpdate();}private void button_Start_Click(object sender, EventArgs e)//菜单及按钮开始分析(菜单项及开始按钮公用函数){string[,] mTable;if (radioButton_Staticmt.Checked){mTable = staticmTable;ShowmTable(mTable);Start_Analysis(mTable);}else if (radioButton_Createmt.Checked){if (created == 1){mTable = creamTable;ShowmTable(mTable);Start_Analysis(mTable);}else{MessageBox.Show("你还没有创建分析表,请先创建!", "错误提示",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}else if (radioButton_Openmt.Checked){if (opened == 1){mTable = openmTable;ShowmTable(mTable);Start_Analysis(mTable);}else{MessageBox.Show("你还没有打开分析表,请先打开或创建!", "错误提示",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}}2.实现显示分析表及新建分析表并利用该表分析句子的功能(1)添加tabControl控件ID为tabControl_mTable建立3个页面tabPage_Show显示当前分析表、tabPage_Edit新建分析表、tabPage_Open打开分析表(2)tabPage_Show中添加listView控件ID为listView_mtableshow用于显示分析表(3)tabPage_Edit中添加两个Button 控件ID分别为button_StartAdd开始添加、button_FilishAdd 完成添加;两个textBox控件ID分别为textBox_VT 、textBox_VN、分别用于获取要添加的终结符及非终结符个数;一个tableLayoutPanel控件ID为tableLayoutPanel_mTable用于根据用户输入的VT及VN的个数建立输入表(4)编辑相应代码:private void button_StartAdd_Click(object sender, EventArgs e)//新建分析表并开始输入{try{int conwidth,conheight,col, row;TextBox txb;tableLayoutPanel_mTable.Controls.Clear();conwidth = 50; conheight = 20;col = Convert.ToInt32(textBox_VT.Text)+1;row = Convert.ToInt32(textBox_VN.Text)+1;tableLayoutPanel_mTable.ColumnCount =col;tableLayoutPanel_mTable.RowCount = row;for (int i = 0; i < col;i++ ){for (int j = 0; j < row;j++ ){if (i == 0&&j==0){Label lb = new Label();lb.Text = "VN\\VT";lb.Width = conwidth;lb.ForeColor = Color.Red;tableLayoutPanel_mTable.Controls.Add(lb,i,j);}else{txb = new TextBox();txb.Width = conwidth;txb.Height = conheight;tableLayoutPanel_mTable.Controls.Add(txb,i,j);}}}}catch{MessageBox.Show("终结符或非终结符格式不对!\n请输入数字!","错误提示",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}private void button_FilishAdd_Click(object sender, EventArgs e)//完成添加,更新分析表 {int col = tableLayoutPanel_mTable.ColumnCount;int row = tableLayoutPanel_mTable.RowCount;if (col > 1&&row>1){creamTable = new string[row, col];for (int i = 0; i < row; i++){for (int j = 0; j < row; j++){if (i == 0 && j == 0){creamTable[i, j] = "";}else{creamTable[i, j] =((TextBox)tableLayoutPanel_mTable.GetControlFromPosition(j, i)).Text.Trim();if (creamTable[i,j].Length == 0){creamTable[i, j] = "<error>";}}}}MessageBox.Show("成功更新分析表!");tabControl_mTable.SelectTab(tabPage_Show);radioButton_Createmt.Checked = true;created = 1;ShowmTable(creamTable);}else{MessageBox.Show("请先点击“开始添加”创建表格!","错误提示",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}public void ShowmTable(string[,] mTable)//显示分析表{listView_mtableshow.Clear();ColumnHeader colHeader;ListViewItem lvi;ListViewItem.ListViewSubItem lvsi;for (int i = 1; i <= mTable.GetLength(1); i++){colHeader = new ColumnHeader();colHeader.Text = i.ToString();listView_mtableshow.Columns.Add(colHeader);}for (int i = 0; i < mTable.GetLength(0); i++){lvi = new ListViewItem();lvi.Text = mTable[i, 0];for (int j = 1; j < mTable.GetLength(1); j++){lvsi = new ListViewItem.ListViewSubItem();lvsi.Text = mTable[i, j];lvi.SubItems.Add(lvsi);}listView_mtableshow.Items.Add(lvi);}}private void miFileNew_Click(object sender, EventArgs e)//菜单新建分析表{tabControl_mTable.SelectTab(tabPage_Edit);}3.实现打开、保存分析表、保存分析结果的功能(1)添加主菜单menuStrip_Main两个Item:miFile文件、miGraAnylysis语法分析。

编译原理上机报告

编译原理上机报告

编译原理上机报告⼀.实验⽬的通过设计并完成⼀个简单的”函数图形绘制程序”,使同学基本上学会编译技术中的词法分析器,语法分析器的构造⽅法,并初步掌握语法制导翻译技术,使同学对编译器的构造⽅法以及编译过程有清楚的感性认识..⼆.实验任务语⾔的⾮形式描述,语⾔的描述包括语法和语义两个部分,此处采⽤⾮形式化的描述,.上机实验包括词法分析和语法分析以及语义分析,分别实现戏词法分析器,语法分析器和图形绘制的设计编码与调试。

三.模块的划分和模块间关系此部分主要由三部分组成:词法分析,语法分析和语义分析。

1.词法分析词法分析器⾄少完成两个任务:〈1〉滤掉注释和⽆⽤成分。

〈2〉数别记号供语法分析器使⽤(1)与语法分析器的接⼝:名称:InitScanner 功能:初始化词法分析器参数:被分析的输⼊⽂件名返回值:成功/失败(1/0)名称:GetToken 功能:取得⼀个记号参数:⽆返回值:记号的种别名称:CloseScanner 功能:关闭词法分析器参数:⽆其框图如下:(2)记号的设计为了区分记号,把程序中所能出现的记号名,函数名,常量名,参数名,保留字都包含在⼀个数组中,数组中的成员都是CToken的对象。

其定义如下:2(3)与实现有关的问题A.字符输⼊缓冲区在设计的语⾔中,最多只预读⼀个字符,假设输⼊⽂件为InFile,,则Char=getc(InFile) //完成读字符ungetc(Char,InFile) //完成回退字符B.模式识别记号按如下⽅法分类:〈1〉标⽰符⼀个模式,包括保留字,函数名,T及Pi,E〈2〉常数字⾯量⼀个模式〈3〉其它符号每种⼀个模式C.词法分析器的调试词法分析器的主代码如下:#include"scanner.h"void main(int argc,char*argv[]){Token token;if(argc<2){printf("please input Source File!\n");return;}if(!InitScanner(argv[1])) //初始化词法分析器{printf("Open Source File Error!\n"); return;}printf("记号类型字符串常数值函数指针\n");printf("_________________________________________________________\n");while(1){token=GetToken(); //获得记号if(token.type!=NONTOKEN) //打印记号的内容printf("%4d,%12s,%12f,%12x\n",token.type,token.lexeme,token.value,token.FuncPtr);else break;};printf("___________________________________________________________\n");CloseScanner();}如有绘图语句如下:scale is(100, 100);for t from 0 to 2*pi step pi/300经词法分析器编译可得结果如下:2语法分析器词法分析与语法分析的区别之⼀是,词法分析是线性的,⽽语法分析是⾮线性的。

编译原理上机报告 target=blank

编译原理上机报告 target=blank

编译原理上机报告target=blank编译原理上机报告学号: 9761072姓名:褚瑞一.实习目的:通过上机实习加深对编译原理的理解和熟悉编译程序的构造方法。

二.实习方法:出于熟悉编译原理的目的,我用C语言重写了整个程序,由于工作量的原因,没有设计新的程序结构和虚拟机指令等等,全部编译程序源代码包括下列文件:symbol.cpp 用于词法分析declaration.cpp 用于语法分析的声明部分expression.cpp 用于语法分析的表达式处理部分semantic.cpp 用于语法分析的其它部分objcode.cpp 用于生成代码error.cpp 用于错误处理main.cpp 主程序另外,interpret目录下有interpret.cpp和main.cpp,用于编译成为一个虚拟机的解释程序。

全部源代码在Windows 2000 Professional,Visual C++ 6.0以及Red Hat 7.0下编译调试通过。

使用标准C语言编写,从而能在Linux下运行,是我的程序的一个特色。

三.测试程序为了测试所有可能的代码,我编写了下面的测试PL程序。

这个程序可以编译,但是运行起来是没有意义的,它仅仅是为了包括常量,变量,数组等类型,并且包括比较复杂的表达式处理和几乎所有支持的语句,以便对编译程序进行测试。

program pp;const PI=3 testconst='z' testconst1=TRUEtype testtype=BOOLEAN testarray=array[2..20,0..50] of booleanvar n,p:integer cr:charprocedure p1(n:integer;var p:integer);var in_proc:char cr1:testarraybegincr1(2,3):=cr1(n,cr1(n,p))+ p;in_proc:=2+p*(testconst+1);if n<=1 thenwhile testconst1 do n:=PIelseif p>1 thenbeginp:=n*p;n:=p/n;end;call p1(n,cr1(2,5));end;begincall read(n);call p1(n,p);call write(p)end.为了测试运行的情况,我们编写一个稍稍简单的例子,这是参考教材中求阶乘的源程序:program pp;var n,p:integerprocedure p1(n:integer;var p:integer);var in_proc:charbeginif n<=1 then p:=1elsebegincall p1(n-1,p);p:=n*pendend;begincall read(n);call p1(n,p);call write(p)end.四.编译结果采用编译程序对这两个PL源程序进行编译。

《编译原理》课程设计说明-第1次

《编译原理》课程设计说明-第1次

《编译原理》课程设计1. 要求完成一个简化C语言——TINY C语言的编译程序,最终能为用TINY C语言编写的源程序(后缀为.tny,已给sample.tny,用一般的文本编辑程序即可打开)生成目标代码,并在给定的虚拟机TM上运行得到运行结果。

TINY C语言中允许出现的字词:⏹整数、标识符;⏹算术运算符/关系运算符/赋值运算符/界符:+、-、*、/、=、<、:=、;、{、}、(、)⏹其它保留字:IF THEN ELSE END REPEAT UNTIL READ WRITETINY C语言中允许出现的语法单位⏹表达式:简单整型算术表达式、关系表达式⏹语句:◆条件语句(IF THEN ELSE END)◆循环语句(REPEA T UNTIL)◆赋值语句(:=)◆读写语句(READ WRITE)◆{ }中可以有注释,但不能嵌套2. 步骤1)、词法分析2)、语法分析3)、语义分析4)、生成目标代码3. 源码构成⏹MAIN.C 主程序⏹GLOBALS.H 全局类型及变量(如Token类属及语法树结点的组成)⏹UTIL.H、UTIL.C 各步骤的实用函数。

如输出Token,生成语法树结点等⏹SCAN.C、SCAN.H 词法分析程序及其头文件⏹PARSE.C、PARSE.H 语法分析程序及其头文件⏹ANAL YZE.C、ANAL YZE.H 语义检查程序及其头文件⏹SYMTAB.C、SYMTAB.H 符号表生成程序及其头文件⏹CGEN.H、CGEN.C、CODE.C、CODE.H 目标代码生成程序及其头文件⏹TM 编译sample.tny源程序后得到目标代码,在该虚拟机上运行得到结果步骤1——词法分析要求:填写getToken( )函数,完成词法分析器scan.c。

约定:⏹仅允许整数类型,不允许实数类型⏹标识符由大小写英文字母组成,最多52个。

其识别按最长匹配原则⏹整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始⏹由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉⏹识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。

编译原理 第1讲(第一章)

编译原理 第1讲(第一章)
Program … CONST c=100;
•记录源程序中使用的名字 •收集每个名字的各种属性信息 类型、作用域、分配存储 信息 c 常量 值:35
x 变量 类型:实 层次:2
VAR procedure… var procedure var x:real;//层次为2 …. end ….. end
…..
解释程序直接将4的值输出(显示)。有些象单步调试

1)遍:指对源程序或其内部表示从头 到尾扫视一遍,并进行有关的加工处理。 2)一遍扫描:以语法分析程序为中心。 编译一次完成,但是运行效果不是很好。 3)多遍扫描:每遍扫描完成不同的任 务。优点: 功能独立;结构清晰;利于 优化;节省空间。 2~8遍。
–编译方式:首先由编译程序将程序翻译成为 机器语言(或者虚拟机的语言,如java),然 后执行。
•比较:
–编译的方式可以使得一次翻译过后,多次运 行。适于花较大的精力进行优化工作。
解释执行和编译执行的区别
如:… … b := 2 ; a := b+2 ; write a ; ……
编译程序
生成代码
Int 2 St b Ld b add 2 St a
赋值语句的语法树
赋值语句 标识符 := 表达式 表达式 + 表达式
标识符
表达式
*
表达式
标识符
整数
赋值语句的语法树另一种表达形式
id1:=id2+id3*N
:= id1 Position id2 initial
+
*
id3 rate N 60
(3)语义分析
•变量声明 •类型匹配 •类型转换 例: Program p(); Var rate:real; procedure initial; … position := initial + rate * 60 /* error */ /* error */ /* warning */; …

《编译原理上机实验指导》

《编译原理上机实验指导》

《编译原理上机实验指导》实验一词法分析1 实验目的设计编制并调试一个词法分析程序,加深对构造词法分析器的原理和技术理解与应用。

2 实验要求选择一种计算机高级程序语言子语言,运用恰当的词法分析技术线路,设计和实现其子语言的词法分析器。

语言选择,建议为《计算机程序设计》课程所采用的语言。

技术线路建议如下两种之一:正则式→NFA→DFA→min DFA→程序设计和正则文法→NFA →DFA→min DFA→程序设计。

分析器输出结果存入到磁盘文件中。

具有出错处理功能。

选择子语言方法举例。

以教材选取的PASCAL语言为例,确定其子语言涉及的单词类如下:(1)关键字begin end if then while do(2)运算符和界符:= +-* /< <= <> > >= = ; ( ) :#(3)标识符正则式:ID=letter(letter|digit)*(4)整型常数正则式:NUM= digit(digit)*3 算法设计(1)单词种别码设计(2)输出形式设计词法分析器的输入是源程序字符串,输出是对应的单词串。

每个单词按照二元组(种别码,单词符号本身)格式输出。

例如:假设源程序为begin x:=9; if x>0 then x:=2*x+1/3;end #,则词法分析器对应输出的结果是:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)(10,x)(23,>)(11,0)(3,then)(10,x)(18,:=)(11,2)(15, *)(10,x)(13, +)(11,1)(16,/)(11,3)(26,;)(6,end)(0,#)(3)算法思想依据建立的识别单词的DFA,设计算法,其框架如下。

其中,①syn存放单词的种别码;②token存放符合标识符规则的单词;③sum存放整型常量的单词。

实现技术细节注意的几个要点:A)标识符和关键字,属于同一构词规则,识别方法是建立一个关键字表,在识别出标识符单词时,查关键字表,以确认或区别是否是关键字,还是标识符。

中南大学《编译原理》上机实习课程实验报告

中南大学《编译原理》上机实习课程实验报告

编译原理课程实验上机实习中南大学计算机0706班方文一、目的加强学生对编译过程的整体认识,而不是个别阶段的实习。

二、实习要求扩充语句部分:for语句、repeat语句、case语句;三、PL语言及其编译程序1.词法分析2.语法分析3.语义分析及中间代码生成4.汇编代码生成四、扩充1.扩充repeat语句扩充文法<循环语句>::=”repeat”<语句>”until”<表达式>扩充函数:详见文件夹Assignment运行示例:示例代码:program pp;var n,p:integer;procedure p2(n:integer);beginrepeatbegincall write(n);n:=n-1enduntil n=0end;begincall p2(5)end.生成中间代码:0 JMP 0 , 15 ------> 无条件跳转1 JMP 0 ,2 ------> 无条件跳转2 ENTP 2 , 4 ------> 进入过程3 LOD 2 , 3 ------> 装入变量值4 WRITE 0 , 0 ------> 写指令5 LODA 2 , 3 ------> 装入变量地址6 LOD 2 , 3 ------> 装入变量值7 LIT 0 , 1 ------> 装入常量8 SUB 0 , 0 ------> 减9 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元10 LOD 2 , 3 ------> 装入变量值11 LIT 0 , 0 ------> 装入常量12 EQ 0 , 0 ------> ==13 JPC 0 , 3 ------> 栈顶值为0时跳转14 RETP 0 , 0 ------> 过程返回15 ENTP 1 , 4 ------> 进入过程16 OPAC 0 , 0 ------> 打开活动记录17 LIT 0 , 5 ------> 装入常量18 CALL 1 , 2 ------> 转子19 ENDP 0 , 0 ------> 程序结束解释运行结果:Your Output:5Your Output:4Your Output:3Your Output:2Your Output:12.扩充for语句扩充文法<循环语句>::=“for”“(”<赋值语句> “;”<表达式> “;”<语句> “)”扩充函数详见文件夹Assignment运行示例示例代码:program pp;var n,p:integer;procedure p1(n:integer;var p:integer);beginfor(p:=1;p<=5;p:=p+1)begincall write(p);endend;begincall read(n);call p1(n,p);call read(n);end.生成中间代码:0 JMP 0 , 19 ------> 无条件跳转1 JMP 0 ,2 ------> 无条件跳转2 ENTP 2 , 5 ------> 进入过程3 LOD 2 ,4 ------> 装入变量值4 LIT 0 , 1 ------> 装入常量5 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元6 ILOD 2 , 4 ------> 间接装入7 LIT 0 , 5 ------> 装入常量8 LEQ 0 , 0 ------> <=9 JPC 0 , 18 ------> 栈顶值为0时跳转10 LOD 2 , 4 ------> 装入变量值11 ILOD 2 , 4 ------> 间接装入12 LIT 0 , 1 ------> 装入常量13 ADD 0 , 0 ------> 加14 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元15 ILOD 2 , 4 ------> 间接装入16 WRITE 0 , 0 ------> 写指令17 JMP 0 , 6 ------> 无条件跳转18 RETP 0 , 0 ------> 过程返回19 ENTP 1 , 5 ------> 进入过程20 LODA 1 , 3 ------> 装入变量地址21 READ 0 , 0 ------> 读指令22 OPAC 0 , 0 ------> 打开活动记录23 LOD 1 , 3 ------> 装入变量值24 LODA 1 , 4 ------> 装入变量地址25 CALL 1 , 2 ------> 转子26 LODA 1 , 3 ------> 装入变量地址27 READ 0 , 0 ------> 读指令28 ENDP 0 , 0 ------> 程序结束解释运行结果:29翻译开始Your Output:2Your Output:3Your Output:4Your Output:5Your Output:6翻译结束。

编译原理上机实验报告

编译原理上机实验报告

编译原理上机实验报告一、实验目的本次实验旨在通过实践的方式理解和掌握编译原理中的一些重要概念和技术,包括词法分析、语法分析和语义分析等。

通过实验的操作,了解和体验编译器的工作过程,深入理解编译原理的相关理论知识。

二、实验环境本次实验使用了Java语言作为编程语言,使用Eclipse作为开发环境,实验所需的相关工具和库已经提前配置完成。

三、实验内容本次实验主要分为三个部分,分别是词法分析、语法分析和语义分析。

1.词法分析词法分析是编译器的第一个阶段,也是最基础的阶段。

在本次实验中,我们首先需要实现一个词法分析器,该分析器可以将源代码分割成一个个的词法单元,将其存储到一个词法单元表中。

我们首先需要定义一些词法单元的模式,比如关键字、标识符、常量等。

然后,我们使用正则表达式和有限自动机的思想来实现一个可以识别各种模式的词法分析器。

2.语法分析语法分析是编译器的第二个阶段,其目的是将词法单元表中的内容按照语法规则进行分析,生成一个语法树。

在本次实验中,我们需要实现一个递归下降的语法分析器。

我们首先需要定义一些语法规则,然后根据这些规则逐条实现相应的语法分析函数。

最终,我们可以通过递归调用这些函数,将源代码转换成语法树的形式。

3.语义分析语义分析是编译器的第三个阶段,其目的是对语法树进行进一步的检查和处理。

在本次实验中,我们需要实现一个简单的语义分析器。

我们可以在语法分析的基础上,增加一些语义规则,然后对生成的语法树进行检查。

比如,我们可以检查变量的定义和使用是否一致,是否存在未定义的变量等。

最终,我们可以通过语义分析器发现和纠正一些潜在的错误。

四、实验总结通过本次实验,我深入学习了编译原理的相关知识,并通过实践中加深了对这些知识的理解和掌握。

实验中,我了解到了词法分析、语法分析和语义分析在编译器设计中的重要性,也学会了如何使用相关工具和技术来实现这些功能。

通过实验,我发现编译原理是一门非常有趣且实用的课程,它既涉及到理论知识,又需要实践操作。

编译原理 上机实验报告

编译原理 上机实验报告
一、课程简介
本课程是计算机科学与技术专业的重要专业课。主要讲授编译技术的基本原理、编译程序的组成及编译程序的开发,让学生充分认识和了解程序设计语言编译程序的基本结构和各部分的功能,使学生掌握设计和构造程序语言编译系统的基本原理和技术。
二、实验目的与要求
编译原理是一门理论性和实践性都比较强的课程。上机实验的目的使学生掌握文法和语言的形式定义、单词的描述工具和词法单元的识别、理解中间代码的含义和形式、了解各种语句的翻译、了解代码生成的基本方法等内容,完成词法分析程序的设计、语义分析程序的设计和中间代码生成程序的设计。通过培养学生实际动手能力,使学生既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
4
1
设计
必做
E05200102
语法分析程序设计
设计exl语言的语法分析程序,使用递归下降分析作为编制语法分析程序的依据,输出分析树和3
语义分析程序设计
设计exl语言的语义分析程序,完成类型检查和类型转换。
4
1
设计
必做
E05200104
中间代码生成程序设计
设计exl语言的中间代码生成程序,输出三地址代码序列。
4
1
设计
必做
三、实验方式与注意事项
本课程所有实验均需上机进行,每个实验都有明确的实验目的。具体要求如下:
1.学生按照实验要求,上机前做好上机实验预习,内容包括:实验的目的、内容、实验步骤。
2.上机实验时按实验要求完成每一个实验的内容。
3.课后认真书写实验报告。
四、实验报告
1.实验报告采用统一的实验报告纸。
2.实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验纪录。

编译原理上机报告

编译原理上机报告

编译原理上机报告编译原理上机报告组员:班级:⼀、上机题⽬:实现⼀个简单的语⾔(Core Programming Language,CPL)的编译器(解释器)(或者其他⾃⼰想完成的编译器)⼆、上机⽬的加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等加深相关基础知识的理解:数据结构、操作系统等提⾼编程能⼒锻炼独⽴思考和解决问题的能⼒三、上机要求1、功能要求接收以CPL编写的程序,对其进⾏词法分析、语法分析、语法制导翻译等,然后能够正确的执⾏程序2、验收要求条件:1.完成CPL词法分析器;2.完成CPL语法分析器;3.完成CPL语法制导翻译;⽅法:1.演⽰程序的功能;2.解释程序的源代码;四,基本步骤1.分别配置Parser Generator、Visual C++;2.使⽤Parser Generator创建⼀个⼯程number编写l⽂件mylexer.l;编译mylexer.l,⽣成mylexer.h与mylexer.c;3.安装Parser Generator、Visual C++;4.使⽤VC++创建Win32 Console Application⼯程number配置该项⽬;加⼊mylexer.h与mylexer.c,编译⼯程;执⾏标识符数字识别器;注意:每次修改l⽂件后,需要重新编译l⽂件,再重新编译VC⼯程五、⼯具:编译器:Visual C++,EclipseLex与Yacc:Parser Generator(⽀持C/C++/Java,带实例)或者其他⾃⼰擅长的语⾔和环境六、相关介绍1、Core Programming Language(CPL)数据类型:整型变量(常量),布尔变量(常量)取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}运算表达式:简单的代数运算,布尔运算程序语句:赋值表达式,顺序语句,if-else语句,while语句语⾔特点:简单、易处理如果加⼊浮点数及相应的除操作,那么该语⾔的表达能⼒相当于C, C++,JAVA 等便于关注语⾔实现的本质,⽽不受繁冗细节的⼲扰基本框架:CPL 程序CPLComplier执⾏结果词法分析器语法分析器语义⼦程序C/C++/Java 编译器CPL Compiler(1) ⼿⼯编写(2)⼯具⽣成词法l ⽂件C/C++编译器CPL C语法y ⽂件2、词法分析器⽣成器LexLex 是⼀个词法分析器⽣成器,接受正规式表⽰的词法规则,⽣成识别正规式所描述语⾔的源程序,不同版本的Lex ⽀持不同的⾼级语⾔,如C 、C++、Java 等。

编译原理上机1

编译原理上机1

由于是手工构造词法分析 器,而正规式个数越少越便于 程序的编写,因此设计上采用 相同模式的记号共用一个正规 式的方法。 常数的字面量部分设计为 CONST_ID,而常量名则合并到 ID中。 这就带来一个问题,函数 绘图语言中的保留字、常量名、 参数名、以及函数名均被描述 为ID,当识别出ID时,如何再 细分它们?
2.2.5
注释的作用:便于理解; 屏蔽暂时不需要的语句。 语法: // This is a comment line 或 -- 此行是注释 语义: // 或 -- 之后,直到行尾,均是注释
注释语句
7
语句功能的测试
ORIGIN IS (360, 240); SCALE IS (100, 100); SCALE IS (100, 100/3); ROT IS PI/2; // // // // (1) (2) (3) (4) 原点移至(360, 240) 图形放大100 纵坐标缩小为三分之一 逆时针旋转90度
11
2.3 记号的语法和语义(续)
三、 题目与要求
题目:为函数绘图语言编写一个解释器 解释器接受用绘图语言编写的源程序,经语法和语义分析 之后,将源程序所规定的图形显示在显示屏(或窗口)中。 目的:通过自己动手编写解释器,掌握语言翻译特别是语言识 别的基本方法。
3.1 解释器的实现方法
1. 用某种程序设计语言(如C/C++、Pascal、Java等)和 递归下降子程序方法编写完整的解释器,由于环境限制, 本书统一采用C/C++程序设计语言; 2. 利用编译器编写工具LEX/YACC提供的方式规定绘图语言 的词法和语法,用C/C++语言编写解释器的语义。
上一页 关系
17

《编译原理》课程设计说明-第1次

《编译原理》课程设计说明-第1次

《编译原理》课程设计说明-第1次第一篇:《编译原理》课程设计说明-第1次《编译原理》课程设计《编译原理》课程设计1.要求完成一个简化C语言——TINY C语言的编译程序,最终能为用TINY C语言编写的源程序(后缀为.tny,已给sample.tny,用一般的文本编辑程序即可打开)生成目标代码,并在给定的虚拟机TM上运行得到运行结果。

TINY C语言中允许出现的字词:ν整数、标识符;ν算术运算符/关系运算符/赋值运算符/界符:+、-、*、/、=、<、:=、;、{、}、(、)ν其它保留字:IF THEN ELSE END REPEAT UNTIL READ WRITE TINY C语言中允许出现的语法单位ν表达式:简单整型算术表达式、关系表达式ν语句:υ条件语句(IF THEN ELSE END)υ循环语句(REPEAT UNTIL)υ赋值语句(:=)υ读写语句(READ WRITE)υ{ }中可以有注释,但不能嵌套2.步骤1)、词法分析2)、语法分析3)、语义分析4)、生成目标代码3.源码构成ν MAIN.C 主程序ν GLOBALS.H 全局类型及变量(如T oken类属及语法树结点的组成)νUTIL.H、UTIL.C 各步骤的实用函数。

如输出Token,生成语法树结点等ν SCAN.C、SCAN.H 词法分析程序及其头文件ν PARSE.C、PARSE.H 语法分析程序及其头文件ν ANALYZE.C、ANALYZE.H 语义检查程序及其头文件νSYMTAB.C、SYMTAB.H 符号表生成程序及其头文件νCGEN.H、CGEN.C、CODE.C、CODE.H 目标代码生成程序及其头文件《编译原理》课程设计νTM 编译sample.tny源程序后得到目标代码,在该虚拟机上运行得到结果步骤1——词法分析要求:填写getToken()函数,完成词法分析器scan.c。

约定:ν仅允许整数类型,不允许实数类型ν标识符由大小写英文字母组成,最多52个。

编译原理第一次上机实验报告软工_李_U2014172xx

编译原理第一次上机实验报告软工_李_U2014172xx

编译原理第一次上机实验报告姓名:李x班级:软工140x班学号:U2014172xx实验一设计实现简单语言的词法分析器1、实验目的通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件计算机上安装C/C++编译处理软件。

3、实验内容及要求对下述单词表定义的语言设计编制一个词法分析器。

单词符号及种别表和词法分析器功能及基本要求如下:(1)单词符号及种别表(2)词法分析器功能及基本要求处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

(1)总体设计思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单一符号;(2)详细算法设计当ch!=’$’时,while循环扫描输入的每一个字符;跳过空格、换行、注释;如果是字符,则拼字符串;判断是否为关键字,是则输出对应关键字的单词种别码,否则表明是l(l|d)*即内部字符串;如果是数字,则拼数,整型、浮点型、指数;如果是运算符、界符,输出相应种别码;算符中应该注意+号和-号,做出相应判断是运算符还是表示数字的正负号;如果是表示正负号则调到判断数字的地方;其他则报错;(3) 流程框图(4) 函数相关说明void main()主函数void scanner()扫描判断函数char input[300];//存放输入的字符串char token[20];//存放符合C语言词法规则的单词char ch;//单个字符char previous;//ch的前一个字符char latter;//ch的后一个字符char ch1, ch2;//当处理注释的时候使用int typenum;//表示单词的种别码int p, m, n, cx;double decimal;//记录小数double sum;//存放数字int index;//存放指数int isNum;//是否是数字int isDecimal;//记录是否为小数int isExp;//记录是否为指数int isNegative;//是否带负号(对于指数)int isNegative1;//是否为负数(5)输入与输出(包括出错处理)输入以$结束回车即可运行程序输出以(xxx,typenumber)的形式;出错则会报error!例如:输入:a+b=5$输出:(10, a)(22, +)(10, b)(21, =) (20, 5)(0, $)(6) 程序运行结果(屏幕截图)1.+++-123.456e-127*+45.99e+200++abc+-cnt++49(7) 词法分析器使用说明打开编译器VS或者VC++;文件→新建→项目;将代码复制粘贴,编译运行,按照提示输入即可使用;(8) 心得与体会提高了自己的编程能力,在上机实验中,特别是后期细节的处理很繁琐,需要很多的判断,判断+、-号是否为数字正负号时需要判断前面和后面的字符;又分为好几种情况,每一种情况的判断语句很长容易出错;同时还有指数的处理,e/E后面需要判断正负号以及把字符转换成数字以及识别数字的DFA和运算符加减等融合在一起;(9) 源程序清单// 词法编译器01.cpp : 定义控制台应用程序的入口点。

编译原理第一次上机(词法分析器) (1)

编译原理第一次上机(词法分析器) (1)

《词法分析器的构造》综合性实验大纲一、实验目的设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。

二、设计内容设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。

例如下面为一段C语言源程序:main(){int a,b;a = 10;b = a + 20;}要求输出如下(可以自行分类,分类原则请在报告中说明)(1,’main’)(5,’(’)(5,’)’)(5,’{ ’)(1,’int’)(2,’a’)(5,’,’)(2,’b’)(5,’;’)(2,’a’)(4,’=’)(3,’10’)(5,’;’)(2,’b’)(4,’=’)(2,’a’)(4,’+’)(3,’20’)(5,’;’)(5,’}’)三、实验要求1、允许用户自己输入源程序并保存为文件2、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)3、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。

定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:识别保留字:if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、>、<、>=、<=、!=等;分隔符包括:,、;、{、}、(、)等。

4、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。

文本内容为待分析的类C语言程序。

四、实验报告实验报告的内容:实验名称、实验目的、实验任务、实验内容、实验过程描述(包括实验结果分析、实验过程遇到的问题及体会)。

实验报告的要求:实验报告以文本或电子版形式递交,实验报告书写要求如下:1. 问题描述:包括实验名称、目的、内容(包括所识别的单词文法),以简洁明了的叙述说明本次上机实验的任务和目标,程序的输入和输出要求以及程序的功能。

上海大学 编译原理上机实习

上海大学 编译原理上机实习

(4) 在题 在题(3)的语法分析器中加入语义处理,对于语法正确的 的语法分析器中加入语义处理, 的语法分析器中加入语义处理 算术表达式,输出其计算值。 算术表达式,输出其计算值。 例:输入 2 + 3 * 5 输出 17 (5) 在题 在题(3)的语法分析器中加入语义处理,对于语法正确的 的语法分析器中加入语义处理, 的语法分析器中加入语义处理 表达式,输出其中间代码(四元式序列)。 表达式,输出其中间代码(四元式序列)。 例:输入 a+b*c ( + a t1 t2 ) 输出 ( * b c t1 )
(number , 15 )
(2)构造 )构造PL/0语言的表达式部分的语法分析器 语言的表达式部分的语法分析器 要求:处理为独立一遍,采用递归子程序法。 要求:处理为独立一遍,采用递归子程序法。 表达式, 输入 PL/0表达式,形式为题(1)的输出。 表达式 形式为题( )的输出。 输出 对于语法正确的表达式,报告“语法正确”; 对于语法正确的表达式,报告“语法正确” 对于语法错误的表达式,报告“语法错误” 对于语法错误的表达式,报告“语法错误”, 指出错误原因。 指出错误原因。
编译原理上机实习报告
1. 每个实习小组交一份报告; 每个实习小组交一份报告; 2.对每一小题: 对每一小题: 对每一小题 1)题目 ) 2)设计思想 ) 3) 算法 ) 4) 调试数据(输入 输出) ) 调试数据(输入/输出 输出) 3. 小结部分: 小结部分: 1)组内成员分工 ) 2)心得体会 ) 3)其它 ) 4. 各题算法的重复部分可省略
词法分析器与题(2)语法分析器之间的 (3)把题 词法分析器与题 语法分析器之间的 )把题(1)词法分析器与题 衔接方式由独立一遍改为独立子程序。 衔接方式由独立一遍改为独立子程序。 表达式, 输入 PL/0表达式,形式为源程序。 表达式 形式为源程序。 对于语法正确的表达式,报告“语法正确” 输出 对于语法正确的表达式,报告“语法正确”; 对于语法错误的表达式,报告“语法错误” 对于语法错误的表达式,报告“语法错误”,并指 出错误原因。 出错时间 第 周至第 周 每周 第 -第 节课 第 地点:行健楼六楼机房 地点 行健楼六楼机房 分组: 每个实习小组3位成员 位成员,自由组 分组 每个实习小组 位成员 自由组 合
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.编译器到底能做什么?有什么作用?搜集资料列出你所知道的编译器。

简单讲,编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。

一个现代编译器的主要工作流程:源代码(source code) → 预处理器(preprocessor) → 编译器(compiler) → 目标代码(object code) → 链接器 (Linker) → 可执行程序 (executables)。

典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。

一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,所以我们电脑上的文件都是经过编译后的文件。

编译器有:连线编译器(on-line compiler)、预编译器(precompiler)、串行编译器(serial compiler)、特殊系统编译器(system-specific compiler)、信息展示设施编译器(Information Presentation Facility Compiler)。

C语言编译器:TC、VC6.0、GC、Dev C++、Visual Studio;C++的编译器:Borland C++ Compiler 5.5、.Dev-C++ 5.0、DJGPP、LCC-Win32、OpenWatcom:Watcom系统编译器。

2.你对编译器了解多少?举例某某编译器的发展情况。

20世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。

但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。

与此同时,Noam Chomsky开始了他对自然语言结构的研究。

他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。

分析问题的研究是在60年代和70年代,它相当完善的解决了这个问题。

现在它已是编译原理中的一个标准部分。

人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。

当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。

这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。

编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。

其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。

其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。

这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向
3.搜集资料了解编译的第一部分----词法分析的情况。

词法分析是计算机科学中将字符序列转换为单词序列的过程。

进行语法分析的程序或者函数叫做词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。

词法分析器一般以函数的形式存在,供语法分析器调用。

词法分析阶段是编译过程的第一个阶段,是编译的基础。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

词法分析程序实现这个任务。

词法分析程序可以使用Lex等工具自动生成。

相关文档
最新文档