您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 词法分析器设计实验报告
计算机与信息学院(信息工程系)编译原理实验报告专业班级12级计算机二班学生姓名及学号孙铭银2012217166课程教学班号计算机二班任课教师李宏芒实验指导教师李宏芒实验地点计算机中心第四机房2014~2015学年第一学期实验一词法分析器设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、实验内容用VC++/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。(2)统计行数和列数用于错误单词的定位。(3)删除空格类字符,包括回车、制表符空格。(4)按拼写单词,并用(内码,属性)二元式表示。(属性值——token的机内表示)(5)如果发现错误则报告出错7(6)根据需要是否填写标识符表供以后各阶段使用。三、实验流程图四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;直至能够得到完全满意的结果。3、书写实验报告;实验报告正文的内容:五、实验结果六、实验代码(C#)usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace词法分析器{/*单词符号种别码单词符号种别码*if1标识符40*else2常量41*then3*42*while4/43*do5+44*begin6-45*end746*printf847*main948*scanf10=49*return11=50*=51*;52*(53*)54*{55*}56*++57*--58*出错符-1*#0**/publicpartialclassForm1:Form{/**成员变量*/Stringtext=;Char[]text_is;//输入流inttype_code=10;//单词种别码intnumber;//整形常量intline=1;//行号intcolumn=1;//列号charch;intp=0;String[]keyword=newString[]{if,else,then,while,do,begin,end,printf,main,scanf,return};publicForm1(){InitializeComponent();}/**对输入流进行操作*/privatevoidreadIo(){text=;try{ch=text_is[p++];}catch(Exception){;}/*预处理*/while(ch==''){ch=text_is[p];p++;}if((ch='a'&&ch='z')||(ch='A'&&ch='Z'))//标识符或变量名检测{while((ch='0'&&ch='9')||(ch='a'&&ch='z')||(ch='A'&&ch='Z')){text=text+ch;ch=text_is[p++];}p--;type_code=40;for(inti=0;ikeyword.Length;i++)//保留字检测if(text==keyword[i]){type_code=i+1;break;}}elseif((ch='0'&&ch='9'))//数字检测{if((text_is[p]='a'&&text_is[p]='z')||(text_is[p]='A'&&text_is[p]='Z')){while(ch!=''&&ch!=';'&&ch!='#'){text=text+ch;ch=text_is[p++];}type_code=-1;}else{number=0;while((ch='0'&&ch='9')){number=number*10+ch-'0';ch=text_is[p++];}p--;type_code=41;if(number32767)number=-1;}}elseswitch(ch)//其他字符{case'':text=text+ch;ch=text_is[p++];if(ch==''){type_code=48;text=text+ch;}elseif(ch=='='){type_code=49;text=text+ch;}else{type_code=47;p--;}break;case'':text=text+ch;ch=text_is[p++];if(ch=='='){type_code=50;text=text+ch;}else{type_code=46;p--;}break;case'+':text=text+ch;ch=text_is[p++];if(ch=='+'){text=text+ch;ch=text_is[p++];if(ch=='+'||ch=='-'){text=text+ch;type_code=-1;}elsetype_code=57;p--;}else{type_code=44;p--;}break;case'-':text=text+ch;ch=text_is[p++];if(ch=='-'){text=text+ch;ch=text_is[p++];if(ch=='+'||ch=='-'){text=text+ch;type_code=-1;}elsetype_code=58;p--;}else{type_code=45;p--;}break;case'*':type_code=42;text=+ch;break;case'/':type_code=43;text=+ch;break;case'=':type_code=51;text=+ch;break;case';':type_code=52;text=+ch;break;case'(':type_code=53;text=+ch;break;case')':type_code=54;text=+ch;break;case'{':type_code=55;text=+ch;break;case'}':type_code=56;text=+ch;break;case'#':type_code=0;text=+ch;break;case'\n':type_code=-2;break;case'\r':type_code=-3;break;default:type_code=-1;break;}}privatevoidbutton1_Click(objectsender,EventArgse){Stringpath=;OpenFileDialogop=newOpenFileDialog();if(op.ShowDialog()==DialogResult.OK){path=op.FileName;richTextBox1.Text=System.IO.File.ReadAllText(path,Encoding.Default);}}privateStringgetTextIo(){returnrichTextBox1.Text+'#';}privatevoidaddData(Stringdata1,Stringdata2,Stringdata3,Stringdata4){try{DataGridViewRowdgr=newDataGridViewRow();DataGridViewTextBoxCelldt1=newDataGridViewTextBoxCell();DataGridViewTextBoxCelldt2=newDataGridViewTextBoxCell();DataGridViewTextBoxCelldt3=newDataGridViewTextBoxCell();DataGridViewTextBoxCelldt4=newDataGridViewTextBoxCell();dt1.Value=data1;dt2.Value=data2;dt3.Value=data3;dt4.Value=data4;dgr.Cells.Add(dt1);dgr.Cells.Add(dt2);dgr.Cells.Add(dt3);dgr.Cells.Add(dt4);dataGridView1.Rows.Add(dgr);}catch(Exception){;}}privatevoidbutton2_Click(objectsender,EventArgse){type_code=10;p=0;line=1;column=1;try{dataGridView1.Rows.Clear();}catch(Exception){;}text_is=getTextIo().ToCharArray();do{readIo();switch(type_code){case41:addData(number+,(+type_code+,+number+),常量,(+line+,+column+));column++;break;case-1:addData(text+,(+type_code+,+text+),有错误,(+line+,+column+));column++;break;case-2:line++;column=1;break;case-3:break;default:{if(type_code0&&type_code40){addData(text+,(+type_code+,+text+),保留字,(+line+,+column+));column++;}elseif(type_code==40){addData(text+,(+type_code+,+text+),标识符,(+line+,+column+));column++;}elseif(type_code52&&type_code57){addData(text+,(+type_code+,+text+),定界符,(+line+,+column+));column++;}elseif(type_code==52){addData(text+,(+type_code+,+text+),句尾符,(+line+,+column+));column++;}elseif(type_code==0){addData(text+,(+type_code+,+text+),结束符,(+line+,+column+));column++;}elseif((type_code41&&type_code52)||type_code==57||type_code==58){addData(text+,(+type_code+,+text+),运算符,(+line+,+column+));column++;}}break;}}while(type_code!=0);}privatevoidForm1_Load(objectsender,EventArgse){}privatevoidrichTextBox1_TextChanged(objectsender,EventArgse){}}}七、实验总结此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理
本文标题:词法分析器设计实验报告
链接地址:https://www.777doc.com/doc-2026539 .html