版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#实验报告词法分析器
目录TOC\o"1-3"\h\u147891.引言 3163801.1实验目的 3268011.2实验要求 3247542.程序设计说明 3301482.1功能概述 312762.2Java语言词法规则 3232883.程序实现 4167143.1流程及算法描述 4153443.2主要函数及其调用关系 5204453.2.1类图 588123.2.2主要函数及代码实现 8291623.3测试样例运行结果 1959823.3.1程序主界面 19283953.3.2运行结果 20192943.4实验中遇到的问题 21310964.总结 211.引言1.1实验目的明确词法分析的任务,熟练掌握词法的正规文法表示、正规表达式表示、状态转移图表示及它们之间的转换,掌握词法分析器的设计与实现,重点掌握根据状态转移图实现词法分析器。A.强化对系统软件综合工程实现能力、规划能力的训练;B.加强对词法分析原理、方法和基本实现技术的理解。1.2实验要求实验的总体要求是:利用C#作为宿主语言,实现Java语言词法分析器,将Java语言转换为C#语言。2.程序设计说明2.1功能概述该Java词法分析器,实现的功能有:对Java源程序中注释的过滤;B.利用两对半缓冲区从文件中逐一读取单词;C.词法分析的结果——属性字流,存放在独立文件中;2.2Java语言词法规则非零数字{1,2,3,4,5,6,7,8,9}数字{非零数字,0}八进制数字{0,1,2,3,4,5,6,7}十六进制数字{数字,a,b,c,d,e,f,A,B,C,D,E,F}字母{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,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}标识符首字符{字母,_,$}标识符字符{标识符首字符,数字}特殊字符{!,%,&,*,?,+,-,:,<,=,>,^,|,~}关键字{abstract,boolean,break,byte,case,catch,char,class,const,continue,default,do,double,else,extends,false,final,finally,float,for,goto,if,implements,import,instanceof,int,interface,long,native,new,null,package,private,protected,public,return,short,static,super,switch,synchronized,this,throw,throws,transient,true,try,void,volatile,while}运算符{-,--,-=,!,!=,%,%=,&,&&,&=,*,*=,/,/=,?,:,^,^=,|,||,|=,~,+,++,+=,<,<<,<<=,<=,=,==,>,>=,>>,>>=,>>>,>>>=}程序实现3.1流程及算法描述3.1.1对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。3.1.2本程序自行规定:(1)关键字"abstract","boolean","break","case","catch","char","class","const","continue","default","do","double","else","extends","false","finally","float","for","goto","if","import","int","interface","long","new","null","private","protected","public","return","short","static","switch","this","throw","true","try","void","volatile","while"(2)运算符:"+","-","*","/","="(3)其他标记如字符串,表示以字母开头的标识符。(4)空格、回车、换行符跳过。(5)注释符:注释部分以//本程序对其不进行识别。3.1.3显示:输入:所给文法的源程序字符串。输出:二元组构成的序列3.2主要函数及其调用关系3.2.1类图接口interfaceITokeninterfaceIVisitable调用Accept方法interfaceITokenVisitorinterfaceIVisitableToken:IVisitable,IToken总类图①①①①①1①①①①①①①①①1①①①①③②①①局部类图①①①①①①①①①①1①①①①②②①①③③3.2.2主要函数及代码实现(1)SourceFile.cs/***********************************************//**********SourceFile.cs***********//***********************************************/usingSystem;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Documents;usingSystem.Windows.Media;namespaceTokenizer{ classSourceFile:IVisitable {privatestaticstring[]javakeywords=newstring[40]{"abstract","boolean","break","case","catch","char","class","const","continue","default","do","double","else","extends","false","finally","float","for","goto","if","import","int","interface","long","new","null","private","protected","public","return","short","static","switch","this","throw","true","try","void","volatile","while"};privatestaticstring[]csharpkeywords=newstring[40]{"abstract","bool","break","case","catch","char","class","const","continue","default","do","double","else","extern","false","finally","float","for","goto","if","using","int","interface","long","new","null","private","protected","public","return","short","static","switch","this","throw","true","try","void","volatile","while"};privatestaticstring[]javawords=newstring[4]{"java","println","print","out"};privatestaticstring[]csharpwords=newstring[4]{"System","Writeline","Writeline","Console"};publicvoidAccept(ITokenVisitorvisitor){foreach(IVisitableTokentokenintokens){token.Accept(visitor);}}publicintkeyword(stringc,refstringc1)//判断是否是关键字{inti;for(i=0;i<40;i++){if(c.Equals(javakeywords[i])==true){c1=csharpkeywords[i];return1;}}return0;}publicintcharacters(charc)//判断是否为字母{if((c<='z'&&c>='a')||(c<='Z'&&c>'A'))return1;return0;}publicintnumbers(charc)//判断是否为数字{if(c<='9'&&c>='0')return1;return0;}publicintspaces(charc)//判断是否为可消除空格的字符或操作符{if((c>'z'||(c<'a'&&c>'Z')||(c<'A'&&c>'9')||(c<'0'))&&c!='_'&&c!='$')return1;return0;}publicintsignwords(stringc,refstringc1)//判断是否为标识符{inti;inta=c.Length;char[]str=c.ToCharArray(0,a);if(str[0]=='$'||str[0]=='_'||characters(str[0])==1){for(i=0;i<a;i++)if(spaces(str[i])==1)return0;for(i=0;i<4;i++){if(c.Equals(javawords[i])==true){c1=csharpwords[i];}}return1;}return0;}publicintpunctuatorwords(charc)//判断是否为标点符号{if(c==','||c==';'||c=='{'||c=='}'||c=='('||c==')')return1;return0;}publicintoperatorwords(charc){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='.')return1;return0;}publicintcommentwords(stringc,stringc1)//判D断是否为评论{inta=c.Length;char[]str=c.ToCharArray(0,a);if(str[0]=='/'&&c1.Equals("/"))return1;if(str[0]=='/'&&c1.Equals("*"))return1;return0;}publicintstringliteralwords(stringc)//判断是否为字符串{inta=c.Length;char[]str=c.ToCharArray(0,a);if(str[0]=='"'&&str[a-1]=='"')return1;return0;}publicstring[]s;publicvoidtranslate(refIVisitableToken[]tokens)//java转换为C#{inta=s.Length;inti,j;intb;char[]c;for(i=0,j=0;i<a;i++,j++){b=s[i].Length;c=s[i].ToCharArray(0,b);if(keyword(s[i],refs[i])==1){tokens[j]=newKeywordToken(s[i]);tokens[++j]=newWhitespaceToken("");}elseif(signwords(s[i],refs[i])==1){tokens[j]=newIdentifierToken(s[i]);tokens[++j]=newWhitespaceToken("");}elseif(punctuatorwords(c[0])==1){if(c[0]==';'||c[0]=='{'||c[0]=='}'){tokens[j]=newPunctuatorToken(s[i]);tokens[++j]=newWhitespaceToken("\n");}else{tokens[j]=newPunctuatorToken(s[i]);tokens[++j]=newWhitespaceToken("");}}elseif(commentwords(s[i],s[i+1])==1){if(s[i+1].Equals("/")){tokens[j]=newCommentToken(s[i]);i++;tokens[++j]=newCommentToken(s[i]);if(s[i+1].Equals("\n"))tokens[++j]=newCommentToken(s[++i]);tokens[++j]=newWhitespaceToken("\n");}if(s[i+1].Equals("*")){tokens[j]=newCommentToken(s[i]);i++;tokens[++j]=newCommentToken(s[i]);for(i++;s[i+1].Equals("*")==false;i++)tokens[++j]=newCommentToken(s[i]);tokens[++j]=newCommentToken(s[++i]);tokens[++j]=newCommentToken(s[++i]);tokens[++j]=newWhitespaceToken("\n");}}elseif(operatorwords(c[0])==1){tokens[j]=newOperatorToken(s[i]);}elseif(stringliteralwords(s[i])==1){if(s[i].Equals("\"")==true){tokens[j]=newStringLiteralToken(s[i]);i++;for(;s[i].Equals("\"")==false;i++)tokens[++j]=newStringLiteralToken(s[i]);tokens[++j]=newStringLiteralToken(s[i]);}elsetokens[j]=newStringLiteralToken(s[i]);}else{tokens[j]=newWhitespaceToken(s[i]);tokens[++j]=newWhitespaceToken("");}}}publicvoidunit2(string[]c,refstring[]s){inti;s=newstring[c.Length];for(i=0;i<c.Length;i++)s[i]=newstring('',2);for(i=0;i<c.Length;i++)s[i]=c[i];}publicvoidinit1(refIVisitableToken[]tokens,intl){inti;inta=s.Length;tokens=newIVisitableToken[2*a+l];for(i=0;i<(2*a+l);i++){tokens[i]=newKeywordToken("");}}publicIVisitableToken[]tokens; } classIdentifierToken:DefaultTokenImpl,IVisitableToken { publicIdentifierToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitIdentifier(this.ToString()); } }classCommentToken:DefaultTokenImpl,IVisitableToken{publicCommentToken(stringname):base(name){}voidIVisitable.Accept(ITokenVisitorvisitor){visitor.VisitComment(this.ToString());}} classKeywordToken:DefaultTokenImpl,IVisitableToken { publicKeywordToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitKeyword(this.ToString()); } } classWhitespaceToken:DefaultTokenImpl,IVisitableToken { publicWhitespaceToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitWhitespace(this.ToString()); } } classPunctuatorToken:DefaultTokenImpl,IVisitableToken { publicPunctuatorToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitPunctuator(this.ToString()); } } classOperatorToken:DefaultTokenImpl,IVisitableToken { publicOperatorToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitOperator(this.ToString()); } } classStringLiteralToken:DefaultTokenImpl,IVisitableToken { publicStringLiteralToken(stringname) :base(name) { } voidIVisitable.Accept(ITokenVisitorvisitor) { visitor.VisitStringLiteral(this.ToString()); } }}(2)Window1.xaml.cs/***********************************************//**********Window1.xaml.cs***********//***********************************************/usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Shapes;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;namespaceTokenizer{///<summary>///InteractionlogicforWindow1.xaml///</summary>publicpartialclassWindow1:Window{publicWindow1(){InitializeComponent();}privatevoidopenClick(objectsender,RoutedEventArgse){stringpt=textBox1.Text;if(pt.Equals(""))MessageBox.Show(this,"不能为空,请输入!!");else{char[]getChar=pt.ToCharArray();intt=0;String[]kt=charArrayToStringArray(getChar,reft);SourceFilesource=newSourceFile();source.unit2(kt,refsource.s);source.init1(refsource.tokens,t);source.translate(refsource.tokens);ColorSyntaxVisitorvisitor=newColorSyntaxVisitor(richTextBox1);source.Accept(visitor);}}privatestring[]charArrayToStringArray(char[]getch,refintk)///将字符数组转换为字符串数组{string[]stringArrange={""};//用这个字符串数组存放词法分析后得到的单词。charcharTemp;stringstringSave="";//存放一个分析得到的单词//一次循环得到一个单词。for(inti=0;i<getch.Length;i++){//if(charTemp!='.')charTemp=getch[i];//由字母开头,数字和字母组成的单词。if((charTemp>='a'&&charTemp<='z')||(charTemp>='A'&&charTemp<='Z')){stringSave=charTemp.ToString();i=i+1;inttest=0;///判断循环是否结束,1为结束。while(test==0){charTemp=getch[i];if(charTemp>='a'&&charTemp<='z'||charTemp>='A'&&charTemp<='Z'||charTemp>='0'&&charTemp<='9'){stringSave=stringSave+charTemp.ToString();i=i+1;}elsetest=1;}stringToArrayString(refstringArrange,stringSave);}stringSave="";///由数字组成的单词。if(charTemp>='0'&&charTemp<='9'){stringSave=stringSave+charTemp.ToString();i=i+1;inttest1=0;while(test1==0){charTemp=getch[i];if(charTemp>='0'&&charTemp<='9'){stringSave=stringSave+charTemp.ToString();i=i+1;}elsetest1=1;}stringToArrayString(refstringArrange,stringSave);}stringSave="";//由运算符组成的单词。if(charTemp=='+'||charTemp=='-'||charTemp=='*'||charTemp=='/'||charTemp=='='||charTemp=='<'||charTemp=='>'||charTemp=='.'){stringSave=stringSave+charTemp.ToString();stringT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖南省冷水江市高二化学下册期末考试模拟卷带答案(基础题)
- 2026年山东省章丘市高二化学下册期末考试模拟考试卷附参考答案【夺分金卷】
- 急性中毒的护理要点
- 信息安全防护预案执行指导
- 电商平台仓库物流分拣自动化操作指南
- 2026年福建省长乐市高一化学上册期末考试模拟试卷及参考答案【新】
- 团队协作共赢未来:小学主题班会课件
- 设备维护工程师年度保养计划制定手册
- 小学主题班会课件-拥抱梦想追逐理想
- 师生基础综合教程12
- 2026新疆能源(集团)有限责任公司财务系统人员招聘6人笔试历年参考题库附带答案详解
- 2025年衡阳事业单位综合应用真题及答案
- 2026年电力交易员考核电力市场仿真推演题
- 项目管理任务分解WBS工作坊模板
- 吊装作业审批制度及流程
- 2025长沙中考历史模拟试卷
- 2026年高考西班牙语试题及答案(全国卷)
- 2026年中考道德与法治32个核心考点答题模板
- 中铁联合国际集装箱有限公司2026届校园招聘71人考试备考题库及答案解析
- 学生公寓家具采购项目方案投标文件(技术方案)
- 康美药业审计失败案例分析
评论
0/150
提交评论