编译原理上机报告

合集下载

编译原理上机实验

编译原理上机实验

实验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,()…说明:关键字表的初值。

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

--表达式编译程序上机报告

--表达式编译程序上机报告

《编译原理》上机实验报告计算机科学与技术班---上机一成员:00813035—吴庆周00813003—祝金辉00813015—闫海滨00718100—特日格乐00813023—王仕华一、题目编写编译程序实现多行表达式的<表达式序列>的文法语言的编译执行二、设计和主要结构1词法分析词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号,把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。

(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。

而不是在需要新单词时才调用getsym过程。

)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。

getch过程中使用了行缓冲区技术以提高程序运行效率。

词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。

如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为SYM_IDENTIFIER,把这个单词存入id变量。

查保留字表时使用了二分法查找以提高效率。

如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。

如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym赋成相应的类型。

如果遇到不合法的字符,把sym置成SYM_NULL。

词法分析子程序要完成的工作有:1. 识别一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。

2. 识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;3. 识别=,回车之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_CONTINUE等。

编译原理实验报告

编译原理实验报告

编译原理实验报告实验⼀词法分析⼀、实验⽬的设计、编制并调试⼀个词法分析程序,加深对词法分析原理的理解。

⼆、实验要求2.1 待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是⼩写。

(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空⽩、制表符和换⾏符组成。

空格⼀般⽤来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:表2.1 各种单词符号对应的种别码单词符号种别码单词符号种别码bgin 1 :17If 2 := 18Then 3 < 20wile 4 <> 21do 5 <= 22end 6 > 23lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26—14 ( 27* 15 ) 28/ 16 # 02.3 词法分析程序的功能:输⼊:所给⽂法的源程序字符串。

输出:⼆元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;token为存放的单词⾃⾝字符串;(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的算法思想:算法的基本任务是从字符串表⽰的源程序中识别出具有独⽴意义的单词符号,其基本思想是根据扫描到单词符号的第⼀个字符的种类,拼出相应的单词符号。

3.1 主程序⽰意图:主程序⽰意图如图3-1所⽰。

其中初始包括以下两个⽅⾯:⑴关键字表的初值。

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

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。

三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。

在本次实验中,我们使用有限自动机的理论来设计词法分析器。

首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。

然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。

在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。

(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。

在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。

首先,我们根据给定的语法规则,编写了相应的递归函数。

每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。

在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。

(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。

在本次实验中,我们使用了四元式作为中间代码的表示形式。

在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。

同时,根据语法树的结构,生成相应的四元式中间代码。

(四)代码优化代码优化的目的是提高生成代码的质量和效率。

在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。

通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。

编译原理上机实验-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语法分析。

编译原理实验报告(C语言)

编译原理实验报告(C语言)

编译原理实验报告实验项目1:词法分析程序实验一、实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。

设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。

编译原理是一门理论性和实践性都比较强的课程。

进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。

同时培养学生实际动手能力。

编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译的主要过程和相关方法。

词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。

基本符号是与输入的语言定义的词法所规定的终结符。

本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续进行)二、题目分析1.这里采用C语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分析结果存在“out.txt”记事本中。

词法分析器的源代码使用C语言编写。

2.下面就词法分析程序中的主要变量进行说明:主函数main():打开要分析的C语言源程序,若不能正确打开,则报错。

先从源程序中读入一个字符ch,然后进行如下处理:1、cp消耗掉空格,制表符,换行符后,cp数组复位,开始检测cp;2、数字检测,对照符号表输出,若匹配成功,则返回序号;3、字符串检测, 对照符号表输出,若匹配成功,则返回序号;4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号;5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是否跟着是注释语句。

编译原理实验报告

编译原理实验报告

编译原理实验报告《编译原理》实验教学⼤纲课程编号:课程名称:编译原理/Compiler Principles实验总学时数:8学时适应专业:计算机科学与技术、软件⼯程承担实验室:计算机科学与技术学院实验中⼼⼀、实验教学的⽬的和任务1.上机实习是对学⽣的⼀种全⾯综合训练,是与课堂听讲、⾃学和练习相辅相成的必不可少的⼀个教学环节。

通常,实习题中的问题⽐平时的练习题要复杂,也更接近实际。

编译原理这门课程安排的2次上机实验都属于⼀种设计类型的实验,每个实验的训练重点在于基本的编译技术和⽅法,⽽不强调⾯⾯俱到;实验的⽬的是旨在使学⽣进⼀步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容;培养学⽣编制算法的能⼒和编程解决实际问题的动⼿能⼒。

2.要求学⽣在上机前应认真做好各种准备⼯作,熟悉机器的操作系统和语⾔的集成环境,独⽴完成算法编制和程序代码的编写;上机时应随带有关的编译原理教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。

实验报告的内容应包括:(1)封⾯:实验题⽬、班级、学号、姓名、完成⽇期;(2)简要的需求分析与概要设计;(3)详细的算法描述;(4)程序清单与运⾏结果;(5)收获与体会。

实验成绩占编译原理课程结业成绩的10-20%。

⼆、实验项⽬及学时分配三、每项实验的内容和要求要求每个实验保证每个学⽣⼀台微机。

实验⼀(4学时):单词的词法分析程序设计。

1.问题描述:对于常⽤⾼级语⾔(如Pascal、C语⾔)的各类单词进⾏词法分析。

2.实验内容:完成对某⼀种常⽤⾼级语⾔(如Pascal、C语⾔、PL/0语⾔)的各类单词进⾏词法分析,即对源程序从左到右进⾏扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。

3.实验要求:(1)选择常⽤⾼级程序设计语⾔(如 Pascal、C语⾔、PL/0语⾔)的源程序作为词法分析对象。

(2)根据教学要求和学⽣具体情况,从上列语⾔之⼀中选取它的⼀个适当⼤⼩的⼦集,可以选取⼀类典型单词,也可以尽可能使各种类型的单词都能兼顾到。

编译原理上机报告

编译原理上机报告

编译原理上机报告编译原理基础上机报告册班级: XXXXXX 学号: XXXXXXXX 姓名:XXXXXX目录第一次上机题目:词法分析器的构造............................................................................ . (3)一、任务与目的 ........................................................................... (3)1. 任务............................................................................ .. (3)2. 目的............................................................................ ................................ 3 二、软件设计 ........................................................................... . (3)1. 软件的总体结构与模块划分 (3)2. Java软件包的设计 ....................................................................................... 7 3. 软件中关键的算法............................................................................ ........... 7 三、测试例程设计与测试结果分析 (10)1. 例程1 ............................................................................ ........................... 10 2. 例程2 ............................................................................ ............................11 四、总结、体会及其他............................................................................ ................ 12 第二次上机题目:语法分析器的构造............................................................................ .. 13一、任务与目的 ........................................................................... (13)1. 任务............................................................................ .............................. 13 2. 目的............................................................................ .............................. 13 二、软件设计............................................................................ (13)1. Java软件包的设计 ........................................................................... .......... 13 2. 适合编写递归下降子程序的文法................................................................ 13 3. 表达式的语法树 ........................................................................... ............. 16 4. 语法分析器主程序流程图 ..........................................................................19 5. 语法分析器的递归下降子程序 ................................................................... 19 三、测试例程设计与测试结果分析 (20)1. 例程1 ............................................................................ ........................... 20 2. 例程2 ............................................................................ (21)3. 例程3 ............................................................................ ........................... 22 四、总结、体会及其他............................................................................ ................ 24 附录:源代码............................................................................ . (25)一、 analyser中的代码 ........................................................................... .. (25)1. Token_Type中的代码 ........................................................................... (25)2. Token中的代码 ........................................................................... .............. 25 3. mytokentab中的代码............................................................................ ..... 26 4. scanner2中的代码 ........................................................................... .......... 27 5. viewer中代码............................................................................ ................ 36 二、parser中的代码 ........................................................................... .............. 38 1. ExprNode中的代码 ........................................................................... ......... 38 2. parser中的代码 ........................................................................... .............. 40 3. parsermain中的代码............................................................................ (52)第一次上机题目:词法分析器的构造一、任务与目的1. 任务词法分析器的构造一般有以下几大步骤:(1)用正规式对模式进行描述(2)由正规式构造NFA(3)由NFA转化为DFA且最小化(4)根据最小DFA编写程序并进行测试为函数绘图语言编写一个解释器解释器接受用绘图语言编写的源程序,经语法和语义分析之后,将源程序所规定的图形显示在显示屏(或窗口)中。

编译原理实验报告1

编译原理实验报告1

03091337 李璐 03091339 宗婷婷一、上机题目:实现一个简单语言(CPL)的编译器(解释器)二、功能要求:接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序。

三、试验目的1.加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等2.加深相关基础知识的理解:数据结构、操作系统等3.提高编程能力4.锻炼独立思考和解决问题的能力四、题目说明1.数据类型:整型变量(常量),布尔变量(常量)取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}2、运算表达式:简单的代数运算,布尔运算3、程序语句:赋值表达式,顺序语句,if-else语句,while语句五、环境配置1.安装Parser Generator、Visual C++;2.分别配置Parser Generator、Visual C++;3.使用Parser Generator创建一个工程编写l文件mylexer.l;编译mylexer.l,生成mylexer.h与mylexer.c;4.使用VC++创建Win32 Console Application工程并配置该项目;加入mylexer.h与mylexer.c,编译工程;执行标识符数字识别器;注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程六、设计思路及过程设计流程:词法分析LEX的此法分析部分主要利用有限状态机进行单词的识别,在分析该部分之前,首先应该对YACC的预定义文法进行解释。

在YACC中用%union扩充了yystype的内容,使其可以处理char型,int型,node型,其中Node即为定义的树形结点,其定义如下:typedef enum { TYPE_CONTENT, TYPE_INDEX, TYPE_OP } NodeEnum;/* 操作符 */typedef struct {int name; /* 操作符名称 */int num; /* 操作元个数 */struct NodeTag * node[1]; /* 操作元地址可扩展 */} OpNode;typedef struct NodeTag {NodeEnum type; /* 树结点类型 *//* Union 必须是最后一个成员 */union {int content; /* 内容 */int index; /* 索引 */OpNode op; /* 操作符对象 */};} Node;extern int Var[26];结点可以是三种类型(CONTENT,INDEX,OP)。

编译原理上机报告

编译原理上机报告

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

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

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语法分析器词法分析与语法分析的区别之⼀是,词法分析是线性的,⽽语法分析是⾮线性的。

编译原理第一次上机实验报告软工_李_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 : 定义控制台应用程序的入口点。

编译原理上机实验报告

编译原理上机实验报告

编译技术上机实验题目实验一一、题目编制C语言子集的词法分析程序二、目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

三、要求1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。

2.程序功能输入:字符串。

输出:二元式(种别编码,单词自身)构成的序列。

举例:输入:a=$;#输出:(6,a)(12,=)FOUND ERROR(13,;)#include <iostream>#include <string>using namespace std;string key[6] = {"begin", "if", "then", "while", "do", "end"}; //关键字bool isKey( string str, int &syn) //判断是否为关键字,若是传回相应关键码的种别名{int i;for(i=0; i<6; i++){if(str == key){syn = i + 1;return true;}}return false;}bool isLetter(char c) //是否为字母{if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))return true;else}bool isDigit(char c) //是否为数字{if(c >= '0' && c <= '9')return true;elsereturn false;}void analyse(FILE *fileP){int n;char c;string str = "";while((c = fgetc(fileP)) != EOF){if(c == ' ' || c == '\n' || c == '\t')continue;else if(isDigit(c)) //数字{while(isDigit(c)){str += c;c = fgetc(fileP);}fseek(fileP, -1, SEEK_CUR);cout << "(11, " << str << ")" << endl;str = "";}else if(isLetter(c)) //字母开头的{while(isDigit(c) || isLetter(c)){str += c;c = fgetc(fileP);}fseek(fileP, -1, SEEK_CUR);if(isKey(str, n))cout << "(" << n << ", " << str << ")" << endl; //关键码elsecout << "(10, " << "\'"<< str << "\'" << ")" << endl; //标志符str = "";}{switch(c){case '+':cout << "(13, +)" << endl;break;case '-':cout << "(14, -)" << endl;break;case '*':cout << "(15, *)" << endl;break;case '/':cout << "(16, /)" << endl;break;case ':':{if(c=fgetc(fileP) == '=')cout << "(18, :=)" << endl;else{cout << "(17,编译技术上机实验题目实验一一、题目编制C语言子集的词法分析程序二、目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

西电_编译原理上机报告

西电_编译原理上机报告

编译原理上机报告《DBMS的设计与实现》学号:姓名:手机:邮箱:完成时间:2013 年6月21日目录1.项目概况 (3)1.1基本目标 (3)1.2完成情况 (3)2.项目实现方案 (4)2.1逻辑结构与物理结构 (4)2.2语法结构与数据结构 (7)2.3执行流程 (19)2.4功能测试 (39)3.总结与未来工作 (48)3.1未完成功能 (48)3.2未来实现方案 (48)1.项目概况1.1 基本目标设计并实现一个DBMS原型系统,可以接受基本的SQL语句,对其进行词法分析、语法分析,然后解释执行SQL语句,完成对数据库文件的相应操作,实现DBMS的基本功能。

1.2 完成情况1.CREATE DATABASE 创建数据库2.SHOW DATABASES 显示数据库名3.DROP DATABASE 删除数据库E DATABASE 选择数据库5.CREATE TABLE 创建表6.SHOW TABLES 显示表名7.DROP TABLE 删除表8.INSERT 插入元组9.SELECT 查询元组10.DELETE 删除元组11.UPDATE 更新元组12.EXIT 退出系统2.项目实现方案2.1 逻辑结构与物理结构1.逻辑结构(1)系统数据库1)元数据的逻辑结构在我设计的系统数据库中,虽然建有元数据的文件,但是文件中没有任何数据,所以元数据的逻辑结构不存在。

2)基本数据的逻辑结构表1 系统数据库的基本数据的逻辑结构(2)用户数据库1)元数据的逻辑结构由于在我的设计中,为数据库中每个表创建一个基本数据文件,所以不需要ppt中的“起始页”,添加了一个“表中列的数目”的列,如下表所示:说明:表中col_type列,取值为整数,1表示字符串,2表示整型2)基本数据的逻辑结构与ppt中的参考方案不同的是,对于数据库中的每一个表,我并不是把每个表的基本数据均存放在一个与数据库同名的基本数据文件中,而是为每个表创建一个与表同名的基本数据文件。

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

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

编译原理课程实验上机实习中南大学计算机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.实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验纪录。

表达式编译程序上机报告

表达式编译程序上机报告

《编译原理》上机实验报告计算机科学与技术班---上机一成员:00813035—吴庆周00813003—祝金辉00813015—闫海滨00718100—特日格乐00813023—王仕华一、题目编写编译程序实现多行表达式的<表达式序列>的文法语言的编译执行二、设计和主要结构1词法分析词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号,把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。

(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。

而不是在需要新单词时才调用getsym过程。

)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。

getch过程中使用了行缓冲区技术以提高程序运行效率。

词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。

如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为SYM_IDENTIFIER,把这个单词存入id变量。

查保留字表时使用了二分法查找以提高效率。

如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。

如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym赋成相应的类型。

如果遇到不合法的字符,把sym置成SYM_NULL。

词法分析子程序要完成的工作有:1. 识别一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。

2. 识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;3. 识别=,回车之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_CONTINUE等。

编译原理上机报告

编译原理上机报告

编译原理上机报告编译原理上机报告组员:班级:⼀、上机题⽬:实现⼀个简单的语⾔(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 等。

编译原理语法分析上机实验读书工程汇报(共4页)

编译原理语法分析上机实验读书工程汇报(共4页)

编译原理语法分析上机实验读书工程汇报[范文仅供参考,自行编辑使用]编译原理语法分析上机实验读书工程汇报一、开发环境简介此次编译原理课程设计的编译器的实现是基于VC++编译环境下实现的。

对于VC++,它是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。

它不仅具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点。

VC++不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境。

Visual C++明显缩短程式xx、编译及连结花费的时间,在大型软件计划上尤其显著。

二、基本理论阐述、当前理论1.什么是编译程序语言翻译程序把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价程序。

2.高级语言程序的处理过程3.编译过程三、小型编译器系统架构(最重要)1).词法分析:词法分析是编译过程的第一个阶段。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。

这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。

比如标识符是由字母字符开头,后跟字母、数字字符的字符序列组成的一种单词。

保留字(关键字或基本字)是一种单词,此外还有算符、界符等等。

2).语法分析:语法分析是编译过程的第二过程。

语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语;如“程序”、“语句”、“表达式”等。

一般这种语法短语,也称语法单位,可表示成语法树。

词法分析和语法分析本质上都是对源程序的结构进行分析。

但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符。

但这种线性扫描则不能用于识别递归定义的语法成分,比如就不能用此办法去匹配表达式中的括号。

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

编译原理上机报告组员:班级:一、上机题目:实现一个简单的语言(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 等。

利用Lex 构造词法分析器:实质为如何设计正规式和语义动作 Lex 源程序*.l(三段式): [定义C 声明辅助定义正规式*.l]%%lex.yy.cEXE规则词法规则正规式输入字符序列记号流词法分析器人工编写Lex 转化语义动作(C 代码)[%%用户子程序 C 源程序 ]Lex 源程序*.l(三段式): [定义 C 声明辅助定义正规式] %% 规则语义动作(C [%%用户子程序C 源程序]mylexer.l 源代码: //声明部分 %{#define ID 0 #define NUMBER 1 %} char [a-zA-Z] digit [0-9] digits {digit}+optional_fraction (.{digits})?optional_exponent (E[+-]?{digits})?%% {char}({char}|{digit})*{ printf("识别标识符%s :长度为%d\n", yytext, yyleng); return ID;}{digits}{optional_fraction}{optional_exponent} {printf(“识别数字%s :长度为%d\n", yytext, yyleng);return NUMBER;注意:不同版本的Lex 生成的文件不同lex.yy.c 结构:(1)声明的C 语言部分(2)词法分析表(3)词法分析驱动器(yylex())(4)用户定义子程序//C 声明:记号类别将来在Y acc 中使用下列语句代替:%Token ID NUMBER//辅助定义正规式//词法规则正规式 //语义动作:C 代码} %%int main(void) { printf("词法分析成功,返回记号类别为%d\n", yylex());}实验结果:每次输入一个字符串,输出识别结果注意:将来Y acc 自动调用yylex()返回一个记号3、语法分析器生成器Y accY acc 是一个语法分析器生成器,接受产生式表示的语法规则,生成识别产生式所描述语言的源程序,不同版本的Y acc 支持不同的高级语言,如C 、C++、Java 等。

yytext ,yyleng :全局变量,用来存放识别出的输入序列,由词法分析器自动填写//C 源程序yylex():词法分析驱动器,根据语法规则返回记号的类别,如ID 、NUMBER 等。

语法分析器输入记号流人工编写Y acc 转化利用Y acc 构造语法分析器:实质为如何设计产生式和语义动作 Y acc 源程序*.y(三段式): [定义C 声明*.y符号定义]%%y.*EXE规则 语法规则产生式语义动作(C 代码)[%%用户子程序 C 源程序 ]Y acc 源程序*.y(三段式): [定义 C 声明符号定义] %% 规则 语法规则产生式语义动作(C 代码[%%用户子程序C 源程序]实例2:算术运算表达式识别器—仅使用Y acc 基本步骤:1、使用Parser Generator 创建一个工程calc 编写y 文件myparser.y ;注意:不同版本的Y acc 生成的文件不同y.tab.c 结构:(1)声明的C 语言部分(2)语法分析表(3)语法分析驱动器(yyparser())(4)用户定义子程序编译myparser.y ,生成myparser.h 与myparser.c ; 2、使用VC++创建Win32 Console Application 工程calc 配置该项目;加入myparser.h 与myparser.c ,编译工程; 执行算术运算表达式识别器;注意:每次修改y 文件后,需要重新编译y 文件,再重新编译VC 工程 myparser.y 源代码: %{ #include <ctype.h>%}%token NUMBER // 无优先级与结合性 %left '+', '-'// 低优先级与左结合%left '*', '/' // 高优先级与左结合 %%expr : expr '+' expr { printf("识别加法!\n"); } | expr '-' expr { printf("识别减法!\n"); } | expr '*' expr { printf("识别乘法!\n"); } | expr '/' expr { printf("识别除法!\n"); } | '(' expr ')' { printf("识别括号!\n"); }| NUMBER{ printf("识别数字!\n"); };%%int main(void){ return yyparse();}int yylex(void){ int c; while ((c = getchar()) == ' ');//过滤空格 if (isdigit(c)) {//判断是否是数字 ungetc(c, stdin); scanf("%d", &yylval);return NUMBER;}if (c == '\n') return 0;//回车返回0,代表词法分析器读取完毕 return c;}执行结果:每次输入一个算术运算表达式,出分析结果//C 声明//符号定义%token,%left 说明对应 实例1中的define//语法规则产生式//语义动作*//C 源程序yyparse():yacc 自动生成的语法分析驱动器,根据语法规则进行自下而上分析(调用yylex 进行词法分析),同时执行语义动作。

yylex():用户自定义的词法分析驱动器。

yylval :全局变量,用来存放识别出的输入序列。

注意:Y acc 自动调用yylex()返回一个记号实例3:算术运算表达式识别器—同时使用Lex 与Y acc 基本步骤:使用Parser Generator 创建一个工程calc2 编写l 文件mylexer.l; 编写y 文件myparser.y ;编译mylexer.l ,生成mylexer.h 与mylexer.c ; 编译myparser.y ,生成myparser.h 与myparser.c ; 使用VC++创建Win32 Console Application 工程calc2 配置该项目;加入mylexer.h 与mylexer.c ,myparser.h 与myparser.c ,编译工程;执行算术运算表达式识别器;注意:每次修改l 、y 文件后,需要重新编译l 、y 文件,再重新编译VC 工程 mylexer.l 主要源代码: digit [0-9]digits {digit}+optional_fraction ("."{digits})? optional_exponent (E[+-]?{digits})? %%[]+ ; //过滤空格{digits}{optional_fraction}{optional_exponent} { return NUMBER; } "+" { return '+'; } "-" { return '-'; } "*" { return '*'; } "/" { return '/'; } "(" { return '('; }")" { return ')'; }"\n" { return 0; //回车返回0,代表词法分析器读取完毕} mylexer.y 主要源代码:%token NUMBER // 无优先级与结合性 %left "+", "-" // 低优先级与左结合%left "*", "/" // 高优先级与左结合 %%expr : expr "+" expr { printf("识别加法!\n"); } | expr "-" expr { printf("识别减法!\n"); } | expr "*" expr { printf("识别乘法!\n"); } | expr "/" expr { printf("识别除法!\n"); } | "(" expr ")" { printf("识别括号!\n"); } | NUMBER{ printf("识别数字!\n"); };%%int main(void){ return yyparse(); }//符号定义%token,%left 说明对应执行结果:每次输入一个算术运算表达式,输出分析结果注意:Y acc自动调用Lex返回一个记号七、实验总结扛天身运盛,畏死意气折。

相关文档
最新文档