编译原理上机报告

合集下载

编译原理上机实验-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、加深对编译原理理论知识的理解和掌握,将抽象的概念通过实际操作转化为具体的实现。

2、培养实际动手能力和解决问题的能力,通过编写代码实现编译程序的各个模块,提高编程技能和调试能力。

3、熟悉编译程序的开发流程和工具,掌握相关编程语言和开发环境的使用。

4、培养团队合作精神和沟通能力,在实验过程中与小组成员共同探讨、解决问题,提高协作效率。

二、实验环境本次实验使用的编程语言为 C/C++,开发环境为 Visual Studio 2019。

同时,使用了一些辅助工具,如调试工具、代码管理工具等,以提高开发效率和代码质量。

三、实验内容1、词法分析任务:使用正则表达式或有限自动机实现对输入源程序的词法分析,将源程序分解为一个个单词,并识别出单词的类型,如标识符、关键字、常量、运算符等。

实现方法:采用有限自动机的方法,设计状态转移图,根据输入字符的类型进行状态转移,最终确定单词的类型。

遇到的问题及解决方法:在处理一些边界情况时,如字符串中的转义字符,出现了识别错误。

通过仔细分析正则表达式和有限自动机的规则,对代码进行了相应的修改和完善,解决了问题。

2、语法分析任务:使用自顶向下或自底向上的语法分析方法,对词法分析得到的单词序列进行语法分析,构建语法树。

实现方法:选择了自顶向下的递归下降分析法,根据语法规则编写递归函数,逐个处理单词,构建语法树。

遇到的问题及解决方法:在处理复杂的语法结构时,出现了回溯和左递归的问题,导致分析效率低下。

通过消除左递归和提取公共因子,优化了语法分析算法,提高了分析效率。

3、语义分析任务:在语法分析的基础上,进行语义分析,检查语法正确的程序是否在语义上也是正确的,如类型匹配、变量未定义等。

编译原理语义分析实验报告

编译原理语义分析实验报告

实验3 语义分析实验报告一、实验目的二、通过上机实习, 加深对语法制导翻译原理的理解, 掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

三、实验要求四、采用递归下降语法制导翻译法, 对算术表达式、赋值语句进行语义分析并生成四元式序列。

五、算法思想1.设置语义过程。

(1)emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。

四元式表的结构如下:struct{ char result[8];char ag1[8];char op[8];char ag2[8];}quad[20];(2) char *newtemp()该函数回送一个新的临时变量名, 临时变量名产生的顺序为T1, T2, …char *newtemp(void){ char *p;char m[8];p=(char *)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}六、 2.函数lrparser 在原来语法分析的基础上插入相应的语义动作: 将输入串翻译成四元式序列。

在实验中我们只对表达式、赋值语句进行翻译。

源程序代码:#include<stdio.h>#include<string.h>#include<iostream.h>#include<stdlib.h>struct{char result[12];char ag1[12];char op[12];char ag2[12];}quad;char prog[80],token[12];char ch;int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针, m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();char *factor(void);char *term(void);char *expression(void);int yucu();void emit(char *result,char *ag1,char *op,char *ag2);char *newtemp();int statement();int k=0;void emit(char *result,char *ag1,char *op,char *ag2){strcpy(quad.result,result);strcpy(quad.ag1,ag1);strcpy(quad.op,op);strcpy(quad.ag2,ag2);cout<<quad.result<<"="<<quad.ag1<<quad.op<<quad.ag2<<endl;}char *newtemp(){char *p;char m[12];p=(char *)malloc(12);k++;itoa(k,m,10);strcpy(p+1,m);p[0]='t';return (p);}void scaner(){for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default: syn=-1;break;}}int lrparser(){//cout<<"调用lrparser"<<endl;int schain=0;kk=0;if(syn==1){scaner();schain=yucu();if(syn==6){scaner();if(syn==0 && (kk==0))cout<<"success!"<<endl;}else{if(kk!=1)cout<<"缺end!"<<endl;kk=1;}}else{cout<<"缺begin!"<<endl;kk=1;}return(schain);}int yucu(){// cout<<"调用yucu"<<endl;int schain=0;schain=statement();while(syn==26){scaner();schain=statement();}return(schain);}int statement(){//cout<<"调用statement"<<endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=0;switch(syn){case 10:strcpy(tt,token);scaner();if(syn==18){scaner();strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{cout<<"缺少赋值符!"<<endl;kk=1;}return(schain);break;}return(schain);}char *expression(void){char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt =(char *)malloc(12);strcpy(eplace,term ()); //调用term分析产生表达式计算的第一项eplacewhile((syn==15)||(syn==16)){if(syn==15)strcpy(tt,"+");else strcpy(tt,"-");scaner();strcpy(ep2,term()); //调用term分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *term(void){// cout<<"调用term"<<endl;char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor());while((syn==13)||(syn==14)){if(syn==13)strcpy(tt,"*");else strcpy(tt,"/");scaner();strcpy(ep2,factor()); //调用factor分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *factor(void){char *fplace;fplace=(char *)malloc(12);strcpy(fplace,"");if(syn==10){strcpy(fplace,token); //将标识符token的值赋给fplacescaner();}else if(syn==11){itoa(sum,fplace,10);scaner();}else if(syn==27){scaner();fplace=expression(); //调用expression分析返回表达式的值if(syn==28)scaner();else{cout<<"缺)错误!"<<endl;kk=1;}}else{cout<<"缺(错误!"<<endl;kk=1;}return(fplace);}void main(){p=0;cout<<"**********语义分析程序**********"<<endl;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();}七、结果验证1、给定源程序begin a:=2+3*4; x:=(a+b)/c end#输出结果2、源程序begin a:=9; x:=2*3-1; b:=(a+x)/2 end#输出结果八、收获(体会)与建议通过此次实验, 让我了解到如何设计、编制并调试语义分析程序, 加深了对语法制导翻译原理的理解, 掌握了将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

编译原理上机报告

编译原理上机报告

编译原理上机报告编译原理基础上机报告册班级: 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. 词法分析:识别源程序中的单词,将其转换为对应的词法单元。

2. 语法分析:根据文法规则,分析源程序的语法结构,生成抽象语法树(AST)。

3. 语义分析:检查AST的语义正确性,进行类型检查等。

4. 中间代码生成:将AST转换为中间代码。

5. 代码优化:对中间代码进行优化,提高程序性能。

6. 目标代码生成:将优化后的中间代码转换为特定平台的目标代码。

三、实习过程1. 词法分析:- 首先,分析源程序的文法规则,确定需要识别的单词种类和对应的正则表达式。

- 然后,设计状态转换图,实现词法分析器。

- 最后,编写测试用例,验证词法分析器的正确性。

2. 语法分析:- 分析文法规则,确定语法结构,设计抽象语法树(AST)。

- 选择合适的语法分析方法,如递归下降分析、LL分析、LR分析等。

- 实现语法分析器,将词法分析器生成的词法单元转换为AST。

3. 语义分析:- 根据AST,检查语义正确性,如类型检查、作用域分析等。

- 实现语义分析器,处理语义错误,并给出错误信息。

4. 中间代码生成:- 根据AST,生成中间代码,如三地址代码、四元式等。

- 实现中间代码生成器,将AST转换为中间代码。

5. 代码优化:- 分析中间代码,找出可优化的部分。

- 实现代码优化器,优化中间代码,提高程序性能。

6. 目标代码生成:- 根据目标平台的指令集,生成目标代码。

- 实现目标代码生成器,将优化后的中间代码转换为目标代码。

四、实习成果通过本次实习,我成功地设计和实现了一个简单的编译程序,实现了词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等功能。

编译原理上机报告

编译原理上机报告

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

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

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

编译原理上机报告

编译原理上机报告

编译原理上机报告《DBMS的设计与实现》即miniSQL专业:计算机科学与技术班级:0308142011年05月08日目录1 项目概况 (3)1.1 人员组成及分工 (3)1.2 项目完成情况 (4)2 项目实现方案——编译部分 (5)2.1 编程环境及工具 (5)2.2 词法分析 (5)2.3 语法分析 (6)3 项目实现方案——DBMS部分 (12)3.1 物理结构 (12)3.2 主要功能 (15)4 报告总结 (18)4.1 上机心得 (18)1 项目概况1.1 人员组成及分工项目miniSQL 实现简单的SQL 语句功能,数据类型仅支持INT CHAR 类型。

以学会yacc & lex 的使用,加深对于数据库管理系统的理解。

项目分为词法分析、语法分析、存储结构设计与语义实现四个方面。

其中黄建财负责词法分析,王志彪负责语法分析,袁兆祎设计数据库系统的存储结构以及语法数结构,刘德龙完成数据库的语义实现和报告的撰写。

项目总体流程:词法分析输出词法单元 语法分析 语法树存储信息语法树结构到物理结构的转换利用结构信息处理执行语句语义分析阶段1.2 项目完成情况语法分析阶段实现识别上机要求的全部SQL语句。

miniSQL实现语句有:1. CREATE DATABASE 创建数据库2. USE DATABASE 选择数据库3. CREATE TABLE 创建表4. SELECT FROM WHERE 查询5. INSERT INTO V ALUES 插入元组6. DELETE 删除元组7. DROP TABLE 删除表8. SHOW TABLES 显示所有表的名称9. QUIT对于删除语句:6. DELETE 删除元组7. DROP TABLE 删除表数据库系统对于表和元组的删除操作和操作系统类似,并为真正删除而是设置删除标记,这就需要前期数据结构设计增加标志域。

删除数据时只需设标志域为0(假设1数据有效)。

编译原理实验报告1

编译原理实验报告1

编译原理实验报告103091337 李璐 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工程六、设计思路及过程?设计流程:YACC预定义文法BNF递归文法扩展实现函数? 词法分析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)。

编译原理上机实验报告

编译原理上机实验报告

编译技术上机实验题目实验一一、题目编制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.语义分析语义分析是编译器的第三个阶段,其目的是对语法树进行进一步的检查和处理。

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

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

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

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

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

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

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

编译原理实验报告小结

编译原理实验报告小结

一、实验背景编译原理是计算机科学的一个重要分支,主要研究如何将高级语言源代码转换为计算机可以执行的机器代码。

本实验旨在通过实践操作,加深对编译原理基本概念和算法的理解,提高编程能力和解决问题的能力。

二、实验目的1. 理解编译原理的基本概念和流程;2. 掌握词法分析和语法分析的基本方法;3. 熟悉编译过程中的中间代码生成和代码优化;4. 培养编程能力和团队协作精神。

三、实验内容1. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码中的字符序列转换成一个个有意义的符号(单词)。

本实验中,我们实现了词法分析器,能够识别出标识符、关键字、运算符、常量等单词。

2. 语法分析语法分析是编译过程的核心,其主要任务是将词法分析器生成的单词序列按照一定的语法规则进行组织,形成语法树。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

3. 中间代码生成中间代码生成是编译过程中的一个重要环节,其主要任务是将语法树转换为一种抽象的、与具体机器无关的中间代码。

本实验中,我们实现了三地址代码生成,将语法树转换为三地址代码。

4. 代码优化代码优化是编译过程中的一个关键步骤,其主要任务是在保证程序正确性的前提下,提高程序的性能。

本实验中,我们实现了简单的代码优化,如常数传播、变量替换等。

四、实验结果与分析1. 实验结果通过实验,我们成功实现了词法分析、语法分析、中间代码生成和代码优化等功能。

以一个简单的C语言程序为例,我们能够将其转换为三地址代码,并进行简单的优化。

2. 实验分析(1)词法分析:本实验中,我们通过定义状态转换表和动作表,实现了对C语言源代码的词法分析。

实验结果表明,词法分析器能够准确地识别出标识符、关键字、运算符、常量等单词。

(2)语法分析:递归下降解析法是一种较为直观的语法分析方法。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的一门重要课程,通过实验,旨在加深对编译原理相关理论知识的理解,提高实践动手能力和问题解决能力。

具体目标包括:1、熟悉编译程序的基本结构和工作流程。

2、掌握词法分析、语法分析、语义分析及中间代码生成等主要阶段的实现方法。

3、培养运用编程语言实现编译算法的能力。

二、实验环境本次实验使用的编程语言为_____,开发工具为_____,操作系统为_____。

三、实验内容(一)词法分析词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个单词符号。

使用正则表达式和有限自动机的理论,设计并实现了词法分析器。

首先,定义了单词的类别,如标识符、关键字、运算符、常量等。

然后,根据不同单词类别的特征,编写了相应的正则表达式模式。

在实现过程中,通过对输入的源程序进行逐字符扫描,利用正则表达式匹配来识别单词,并将其分类存储。

(二)语法分析语法分析是编译过程的核心部分,其目的是确定输入的单词序列是否符合给定的语法规则。

采用了自顶向下的递归下降分析法和自底向上的算符优先分析法。

对于递归下降分析法,根据语法规则编写了相应的递归函数。

每个函数处理一种语法结构,通过递归调用实现对整个语法的分析。

算符优先分析法则通过定义算符的优先级和结合性,构建算符优先关系表,然后依据表进行语法分析。

(三)语义分析语义分析阶段主要检查语法正确的句子是否具有实际的意义,并进行类型检查、语义计算等操作。

在实现中,通过构建符号表来记录变量的信息,包括名称、类型、作用域等。

同时,在语法分析的过程中,根据语义规则进行相应的检查和计算。

(四)中间代码生成中间代码生成是将源程序转换为一种便于优化和目标代码生成的中间表示形式。

选择了三地址码作为中间代码。

在生成中间代码时,根据语法分析和语义分析的结果,按照一定的规则将源程序转换为三地址码的形式。

四、实验步骤1、需求分析仔细研究实验要求,明确各个阶段的任务和目标,确定所需的数据结构和算法。

编译原理上机实验报告

编译原理上机实验报告

《编译原理》课内实验报告学院计算机学院专业计算机科学与技术年级班别2012级6班学号 3112006028 学生姓名曾主赐辅导教师刘添添成绩2014年12月一.完成内容1. 扩充单词:(1)保留字:for,step, until,char,real,return;(2)双字符:*=,/=;(3)单字符:[,],*,/ ;2. 扩充语句:var a;begina:=1;doa:=a+1while a<5;write(a);end.二.设计思路1. 扩充单词1)修改变量定义:void init(){int i;for(i=0;i<=255;i++){ssym[i]=nul;}ssym['+']=plus;ssym['-']=minus;ssym['*']=times;ssym['/']=slash;ssym['(']=lparen;ssym[')']=rparen;ssym['=']=eql;ssym[',']=comma;ssym['.']=period;ssym['#']=neq;ssym[';']=semicolon;ssym['[']=l1;ssym[']']=r1;/*设置保留字名字,按照字母顺序,便于折半查找*/ strcpy(&(word[0][0]),"begin");strcpy(&(word[1][0]),"call");strcpy(&(word[2][0]),"char");strcpy(&(word[3][0]),"const");strcpy(&(word[4][0]),"do");strcpy(&(word[5][0]),"end");strcpy(&(word[6][0]),"for");strcpy(&(word[7][0]),"if");strcpy(&(word[8][0]),"odd");strcpy(&(word[9][0]),"procedure");strcpy(&(word[10][0]),"read");strcpy(&(word[11][0]),"real");strcpy(&(word[12][0]),"return");strcpy(&(word[13][0]),"step");strcpy(&(word[14][0]),"then");strcpy(&(word[15][0]),"until");strcpy(&(word[16][0]),"var");strcpy(&(word[17][0]),"while");strcpy(&(word[18][0]),"write");/*设置保留字符号*/wsym[0]=beginsym;wsym[1]=callsym;wsym[2]=charsym;wsym[3]=constsym;wsym[4]=dosym;wsym[5]=endsym;wsym[6]=forsym;wsym[7]=ifsym;wsym[8]=oddsym;wsym[9]=procsym;wsym[10]=readsym;wsym[11]=realsym;wsym[12]=returnsym;wsym[13]=stepsym;wsym[14]=thensym;wsym[15]=untilsym;wsym[16]=varsym;wsym[17]=whilesym;wsym[18]=writesym;修改pl0.h头文件里定义的全局数据:# define norw 19 /*关键字个数*/# define txmax 100 /*名字表容量*/# define nmax 14 /*number的最大位数*/# define al 10 /*符号的最大长度*/# define amax 2047 /*地址上界*/# define levmax 3 /*最大允许过程嵌套声明层数[0,lexmax]*/ # define cxmax 200 /*最多的虚拟机代码数*//*符号*/enum symbol{nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq, lparen,rparen, comma, semicolon,period, becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,forsym,stepsym,untilsym,charsym,realsym,returnsym,p,q,l1,r1};#define symnum 42/*-------------*/2)修改GetSym()方法:/*词法分析,获取一个符号*/int getsym(){int i,j,k;while( ch==' '||ch==10||ch==9){getchdo;}if(ch>='a'&&ch<='z'){k=0;do{if(k<al){a[k]=ch;k++;}getchdo;}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');a[k]=0;strcpy(id,a);i=0;j=norw-1;do{k=(i+j)/2;if(strcmp(id,word[k])<=0){j=k-1;}if(strcmp(id,word[k])>=0){i=k+1;}}while(i<=j);if(i-1>j){sym=wsym[k];printf("保留字\n");}else{sym=ident;printf("标识符\n");}}else{if(ch>='0'&&ch<='9'){k=0;num=0;sym=number;do{num=10*num+ch-'0';k++;getchdo;}while(ch>='0'&&ch<='9'); /*获取数字的值*/k--;if(k>nmax){error(30);}}else{if(ch==':') /*检测赋值符号*/{getchdo;if(ch=='='){sym=becomes;printf(":=\n");getchdo;}else{sym=nul; /*不能识别的符号*/printf("\n");}}elseif(ch=='*') /*xiugai*/{getchdo;if(ch=='='){sym=p;printf("*=\n");getchdo;}else{sym=times;printf("*\n");getchdo;}}elseif(ch=='/'){getchdo;if(ch=='='){sym=q;printf("/=\n");getchdo;}else{sym=slash;printf("/\n");getchdo;}}else{if(ch=='<') /*检测小于或小于等于符号*/{getchdo;if(ch=='='){sym=leq;printf("<=\n");getchdo;}else{sym=lss;printf("<\n");}}else{if(ch=='>') /*检测大于或大于等于符号*/{getchdo;if(ch=='='){sym=geq;printf(">=\n");getchdo;}else{sym=gtr;printf(">\n");}}else{ sym=ssym[ch];/* 当符号不满足上述条件时,全部按照单字符号处理*/printf("单字符\n");//getchdo;//richardif(sym!=period){getchdo;}//end richard}}}}}return 0;}2. 扩充语句1)产生式以及语法描述图:产生式:a:=1 do a:=a+1 while a<5语法描述图:2)递归下降子程序:if(sym==dosym){ getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[whilesym]=true; statementdo(fsys,ptx,lev); do a:=a+1 while a<5 a:=1if(sym==whilesym){getsymdo;conditiondo(nxtlev,ptx,lev);}else{error(18);}3)举例设计语句的pcode代码:var a;begina:=1;doa:=a+1while a<5;write(a);end.1 int 0 42 int 0 13 sto 0 34 lod 0 35 lit 0 16 opr 0 27 sto 0 38 lod 0 39 lit 0 510 opr 0 1011 jpc 0 1312 jmp 0 413 lod 0 314 opr 0 1415 opr 0 1516 opr 0 04)在递归下降子程序中增加语义动作:if(sym==dosym){cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[whilesym]=true;statementdo(fsys,ptx,lev);if(sym==whilesym){getsymdo;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);gendo(jmp,0,cx1);code[cx2].a=cx;}else{error(18);}三.运行测试1. 扩充单词的测试(贴运行结果截图)ps: 测试情况要全!图片大小合适!截图如下所示:2. 语句的测试(贴运行结果截图)截图如下所示:四.心得归纳完成过程的心得:。

编译原理 上机实验报告

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

编译原理上机报告

编译原理上机报告

《编译原理》课程实验指导书目录序言_______________________________________________________________ 2实验一设计实现简单语言的词法分析器_______________________________ 3实验二设计实现简单语言的语法分析器______________________________ 17序言编译原理实验环节,主要通过对编译器的两个重要模块-词法和语法模块编程调试实现,使学生能应用编译原理的基本理论和方法,学会用C/C++高级程序设计语言设计词法分析器和语法分析器,加深对编译原理理论的分析理解,巩固所学知识,培养和提高学生的动手实践能力。

实验一设计实现简单语言的词法分析器1、实验目的通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

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

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

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

4、主要参考步骤(1)画出识别上述语言单词的状态转换图(2)用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)(3)预处理,去除注释、多余空格、Tab字符、回车换行符等(4)设计若干用例,上机测试并通过所设计实现的词法分析器1.+++-123.456e-127*+45.99e+200++abc+-cnt++492.(+123.456+-456.789e-120)*m2+(a++456)*-c1233.++4+1.44.a+-149+49.7e+127+m1235.x=a++1.27e+186.--20+-124.987e+127+-xyzbegin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+1277.--20+-124. e+111-137++569.246e+(123+ivar);x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)5、思考数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。

编译原理上机报告

编译原理上机报告

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

编译原理课程设计课设题目:函数绘图语言解释器负责人:学号:专业:计算机科学与技术指导老师:**起止时间:2015 年4月至2015年5月目录一任务与目的 (3)二软件设计 (3)2.1软件的总体结构与模块划分 (3)2.1.1词法分析器 (3)2.1.2语法分析器 (3)2.1.3语义分析器 (4)2.2关键算法与重要数据结构 (4)2.2.1词法分析器 (4)2.2.2语法分析器 (6)2.2.3语义分析器 (10)三测试例程设计与测试结果分析 (12)例程一 (12)绘图语言: (12)结果: (12)例程二 (13)绘图语言: (13)结果: (14)四总结与体会 (14)一任务与目的任务:为简单的函数绘图语言编写一个解释器。

该解释器接受用绘图语言编写的简单的源程序,经过语法和语义分析后,直接将源程序所规定的图形显示在显示屏或者显示窗口上。

目的:通过自己动手编写解释器,掌握语言翻译,特别是语言识别的基本方法。

二软件设计2.1软件的总体结构与模块划分本软件用C语言实现,通过词法分析器、语法分析器和语义分析器三个部分来逐步解析写入文本中的函数绘图语言,并最终通过opengl画出来。

2.1.1词法分析器主要工作:1.滤掉源程序中的无用成分;2.输出记号供语法分析器使用;3.识别非法输入,并将其标记为“出错记号”。

2.1.2语法分析器主要工作:1.设计函数于存绘图语言的文法,适合递归下降分析;2.设计语法树的节点结构,用放表达式的语法树;3.设计递归下降子程序,分析句子并构造表达式的语法树;4.设计测试程序和测试用例,以检验分析器是否正确。

2.1.3语义分析器语法制导翻译的基本思想是,根据语法分析所得到的语言结构加入相应的语义动作,以实现设计者所希望的目标。

对于递归下降子程序,就是在各子程序中的适当位置嵌入相应的语义函数。

绘图语言的语义由两大部分组成:表达式值的计算和图形的绘制。

由于在语法分析阶段已经为表达式构造了语法树,因此表达式的计算十分简单,只要从分析树的根节点出发,对分析树进行一次深度优先遍历即可得到表达式的值。

2.2关键算法与重要数据结构2.2.1词法分析器主要函数:void cinit(){//COS(-T *( (10/7)-1)),int i;//tokenstr[mem].lexeme =TokenBuffer; 记号的字符指针指向字符缓冲区char word;while(word=GetChar()) // 从源文件中读取一个字符{if(tokenstr[mem].type==ERRTOKEN)//break;if(tokenstr[mem].type==NNTOKEN)//break;if(word==' '||word=='\n'){if(isalpha(TokenBuffer[0])){output1();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}if(isdigit(TokenBuffer[0])){output2();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}continue;}// 空格、TAB、回车等字符的过滤if(isalpha(word)){if(isdigit(TokenBuffer[0])){output2();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}AddCharTokenString(word);} // 识别IDelse if(isdigit(word)||word=='.'){/*if(isalpha(TokenBuffer[0])){output1();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}*/AddCharTokenString(word);} // 识别数字常量else{if(isalpha(TokenBuffer[0])){output1();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}if(isdigit(TokenBuffer[0])){output2();for(i=0;i<num;i++)TokenBuffer[i]=0;num=0;}switch(word){case ';': {tokenstr[mem++].type=SEMICO;}break;case '(': {tokenstr[mem++].type =L_BRACKET;}break;case ')': {tokenstr[mem++].type =R_BRACKET;}break;case ',': {tokenstr[mem++].type =R_COMMA;}break;case '+': {tokenstr[mem++].type =PLUS;}break;case '-': {tokenstr[mem++].type =MINUS;}break;case '*': {word=GetChar();if(word=='*')tokenstr[mem++].type=POWER;else{tokenstr[mem++].type=MUL;switch(word){case ';': {tokenstr[mem++].type=SEMICO;}break;case '(': {tokenstr[mem++].type =L_BRACKET;}break;case ')': {tokenstr[mem++].type =R_BRACKET;}break;case ',': {tokenstr[mem++].type =R_COMMA;}break;case '+': {tokenstr[mem++].type =PLUS;}break;case '-': {tokenstr[mem++].type =MINUS;}break;case '/': {tokenstr[mem++].type =DIV;}break;default:AddCharTokenString(word);}}}break;case '/': {tokenstr[mem++].type =DIV;}break;default:tokenstr[mem++].type=ERRTOKEN;}}}close_scanner();}2.2.2语法分析器主要函数:tree_node_ptr Expression(){tree_node_ptr left=NULL;tree_node_ptr right;// 左右子树节点的指针Token_Type token_tmp;// 当前记号if(token.type!=NNTOKEN){left=term();// 分析左操作数且得到其语法树while (token.type==PLUS || token.type==MINUS){token_tmp = token.type;if(token.type!=NNTOKEN){match_token(token_tmp);right=term();// 分析右操作数且得到其语法树left = make_tree_node(token_tmp, left, right);}}}// 构造运算的语法树,结果为左子树//tree_trace(left);// 打印表达式的语法树**************************************return left;// 返回最终表达式的语法树}void tree_trace(tree_node_ptr x){print_syntax_tree(x, 1);}void print_syntax_tree(tree_node_ptr root, int indent){int temp;for (temp=1; temp<=indent; temp++) printf( "");// 缩进switch(root->OpCode)// 打印根节点{case PLUS:printf( "+\n");break;case MINUS: printf( "-\n");break;case MUL: printf( "*\n");break;case DIV: printf( "/\n");break;case POWER: printf( "**\n");break;case FUNC: printf("%x\n",root->content.tag_func.MathFuncPtr);break;case CONST_ID: printf("%lf\n",root->content.tag_const);break;case T: printf( "T\n");break;default: printf( "非法的树节点!\n");exit(0);}if(root->OpCode == CONST_ID || root->OpCode == T) return;// 叶子节点返回if(root->OpCode == FUNC)// 递归打印一个孩子的节点print_syntax_tree(root->content.tag_func.Child,indent+1);else// 递归打印两个孩子的节点{print_syntax_tree(root->content.tag_op.Left, indent+1);print_syntax_tree(root->content.tag_op.Right, indent+1);}}tree_node_ptr term(){tree_node_ptr left, right;Token_Type token_tmp;left=factor();while (token.type==MUL||token.type==DIV){token_tmp=token.type;match_token(token_tmp);right=factor();left=make_tree_node(token_tmp, left, right);}return left;}// ------------------------ factor 的递归子程序tree_node_ptr factor(){tree_node_ptr left, right;if(token.type==PLUS) // 匹配一元加运算{match_token(PLUS);right = factor();// 表达式退化为仅有右操作数的表达式}else if(token.type == MINUS){ // 匹配一元减运算match_token(MINUS); // 表达式转化为二元减运算的表达式right = factor();left = (tree_node_ptr)malloc(sizeof(struct ExprNode));left->OpCode=CONST_ID;left->content.tag_const=0.0;right = make_tree_node(MINUS, left, right);}else right = component();// 匹配非终结符componentreturn right;}// ------------------------ component 的递归子程序tree_node_ptr component(){tree_node_ptr left, right;left = atom();if(token.type == POWER){match_token(POWER);right = component();// 递归调用component以实现POWER的右结合性质left=make_tree_node(POWER, left, right);}return left;}// ------------------------ atom 的递归子程序tree_node_ptr atom(){struct Token t=token;tree_node_ptr t_ptr=NULL;tree_node_ptr tmp;switch (token.type){case CONST_ID:match_token(CONST_ID);t_ptr=make_tree_node(CONST_ID,t.value);break;case T:match_token(T);t_ptr = make_tree_node(T);break;case FUNC:match_token(FUNC);match_token(L_BRACKET);tmp = Expression();t_ptr = make_tree_node(FUNC,t.FuncPtr,tmp);match_token(R_BRACKET);break;case L_BRACKET:match_token(L_BRACKET);t_ptr = Expression();match_token(R_BRACKET);break;default:SyntaxError(2);}return t_ptr;}2.2.3语义分析器主要函数:void cal_coord(tree_node_ptr x_ptr,tree_node_ptr y_ptr,double *x_ret,double *y_ret){double x_val, x_temp, y_val;// 计算表达式的值,得到点的原始坐标x_val=get_tree_value(x_ptr);y_val=get_tree_value(y_ptr);// 比例变换x_val *= Scale_x ;y_val *= Scale_y ;// 旋转变换x_temp=x_val*cos(rot_angle)+y_val*sin(rot_angle);y_val =y_val*cos(rot_angle)-x_val*sin(rot_angle);x_val =x_temp;// 平移变换x_val+=Origin_x;y_val+=Origin_y;// 返回变换后点的坐标*x_ret=x_val;*y_ret=y_val;}// ------------------------循环绘制点坐标void draw_loop(double start_val,double end_val,double step_val,tree_node_ptr x_ptr,tree_node_ptr y_ptr){extern double Parameter;//它是在语法分析器中声明的double *x_val=(double*)malloc(sizeof(double));double *y_val=(double*)malloc(sizeof(double));for(Parameter=start_val;Parameter<=end_val;Parameter+=step_val){cal_coord(x_ptr, y_ptr, x_val, y_val);//y_val = 460-y_val;// 修改显示屏的直角坐标系draw_pixel(*x_val,*y_val);}}void drawinit(){glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(0,0);glutCreateWindow("Bingo");glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_FLAT);glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)//glOrtho(0,500.0,0*(GLfloat)h/(GLfloat)w,500.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);glOrtho(0,750.0,0*(GLfloat)h/(GLfloat)w,400.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);else//glOrtho(0.0*(GLfloat)h/(GLfloat)w,500.0*(GLfloat)h/(GLfloat)w,0,500.0,-50.0,5 0.0);glOrtho(0.0*(GLfloat)h/(GLfloat)w,400.0*(GLfloat)h/(GLfloat)w,0,750.0,-50.0,50.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}// ------------------------绘制一个点void draw_pixel(double a,double b){//printf("%.2lf %.2lf\n",a,b);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(a,b);//表示一个空间顶点glVertex2f(a+1,b);glVertex2f(a,b+1);glVertex2f(a+1,b+1);glEnd();}三测试例程设计与测试结果分析例程一绘图语言:ROT IS 0;ORIGIN IS (50,50);SCALE IS (2,1);FOR T FROM 0 TO 300 STEP 1 DRAW (T,0);FOR T FROM 0 TO 300 STEP 1 DRAW (0,T);FOR T FROM 0 TO 300 STEP 1 DRAW (T,T);SCALE IS (2,0.1);FOR T FROM 0 TO 55 STEP 1 DRAW (T,(T*T));SCALE IS (10,5);FOR T FROM 0 TO 60 STEP 1 DRAW (T,SQRT(T));SCALE IS (20,0.1);FOR T FROM 0 TO 8 STEP 0.1 DRAW (T,EXP(T));SCALE IS (2,20);FOR T FROM 1 TO 300 STEP 1 DRAW (T,LN(T));结果:绘图语言:ROT IS 0;ORIGIN IS (375,375);SCALE IS (1,1);FOR T FROM -350 TO 350 STEP 1 DRAW (T,0);FOR T FROM -350 TO 350 STEP 1 DRAW (0,T);ORIGIN IS (20,200);ROT IS 0;SCALE IS (40,40);FOR T FROM 0 TO 2*PI+PI/50 STEP PI/50 DRAW (T, SIN(T)); ORIGIN IS (20,240);FOR T FROM 0 TO 2*PI+PI/50 STEP PI/50 DRAW (T, SIN(T)); ORIGIN IS (20,280);FOR T FROM 0 TO 2*PI+PI/50 STEP PI/50 DRAW (T, SIN(T)); ORIGIN IS (560,530);ROT IS 0;SCALE IS (50, 50);FOR T FROM 0 TO 2*PI STEP PI/100 DRAW(COS(T), SIN(T)); SCALE IS (100, 100);FOR T FROM 0 TO 2*PI STEP PI/200 DRAW(COS(T), SIN(T)); ORIGIN IS (160,550);SCALE IS (80,80/3);ROT IS PI/2+0*PI/3;FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T),SIN(T)); ROT IS PI/2+2*PI/3;FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T),SIN(T)); ROT IS PI/2-2*PI/3;FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T),SIN(T)); ORIGIN IS (580,240);SCALE IS (80,80);ROT IS 0;FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (COS(T), SIN(T)); FOR T FROM 0 TO 20*PI STEP PI/50 DRAW((1-1/(10/7))*COS(T)+1/(10/7)*COS(-T*((10/7)-1)),(1-1/(10/7))*SIN(T)+1/(10/7)*SIN(-T*((10/7)-1)));四总结与体会这次编译原理上机练习不仅让我对绘图语言解释器有了更加深刻的理解,而且巩固了渐渐淡忘的C语言和刚刚学习的OpenGL,达到了复习与学以致用的双重目的。

相关文档
最新文档