C词法分析器设计报告同济大学2010级计算机4班_第1页
C词法分析器设计报告同济大学2010级计算机4班_第2页
C词法分析器设计报告同济大学2010级计算机4班_第3页
C词法分析器设计报告同济大学2010级计算机4班_第4页
C词法分析器设计报告同济大学2010级计算机4班_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用C#词法解析器设计报告同济大学级计算机班范成程序界面南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用开发环境:MicrosoftVisualStudio2005南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用程序运行环境:任何安装了〔或以上版本〕的计算机。下载地址:开发语言:MicrosoftC#.NET设计思想:根据教材给出的扫描程序框架,自行编写扫描程序的各个方法〔Method〕,并设计程序界面,为各按钮编写Click事件响应方法,由“SCAN〞按钮的Click事件响应方法调用扫描程序,依次对源程序〔来自文件或用户键入〕的每个字符进行扫描并鉴别。扫描程序的返回值有以下几各种类:表记符<@ID,该表记符在表记符表中的地址>保存字<@RESERVED_WORD_保存字编号,->整型常数<@INT,该数在整型常数表中的地址>浮点型常数<@FLOAT,该数在浮点型常数表中的地址>字符串<@STRTING,该字符串在字符串表中的地址>(nullstring)<@STRING_NULL,该字符串在字符串表中的地址>字符<@CHAR,该字符在字符表中的地址>符号<@符号助记符,->源程序扫描流程图〔按钮按下后〕:开始将找寻指示器指向源程序第一个字符YES源程序扫描达成?NO扫描当前字符,并将搜索指示器向后移动结束南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用状态变换图:空白字母或数字或下划线字母或下划线1非字母与数字与下划线*02/非=*2324数字=25*/数字非数字2634非*~**/-2728295非-*3031`-632=@+337非+*3435#+836$=379=非=*3839%10^11(12)13[14]15{16}17,18.19?20:21;22

=40!非=*4142=43&非&*4445&46*非=*4748=49>非>*5051>52=53<非<*5455<56=57非〞“58〞59,非??606162南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用源程序:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;namespaceScanner{publicpartialclassScanner:Form{publicScanner(){InitializeComponent();rtbInput.SelectAll();}privatestring[]token;//表记符表privateinttokenIndex=0;//表记符表指针privatelong[]constant;//整型常数表privateintconstantIndex=0;//整型常数表指针privatedouble[]dblConstant;//浮点常数表privateintdblConstantIndex=0;//浮点常数表指针privatestring[]strConst;//字符串表privateintstrConstIndex;//字符串表指针privatechar[]charConst;//字符表privateintcharConstIndex=0;//字符表指针privatestringinput;//存放待识其他源程序字符串privateintinputIndex=0;//input字符串指针privatecharch;//存放最新读进的源程序字符privatestringstrToken;//存放组成单词符号的字符串privateboolscanned=false;//是否扫描过最少一次privatestaticstring[]tokenReserve={"abstract","do","in","protected","true","as","double","int","public","try","base","else","interface","readonly","typeof","bool","enum","internal","ref","uint","break","event","is","return","ulong","byte","explicit","lock","sbyte",南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用"unchecked","case","extern","long","sealed","unsafe","catch","false","namespace","short","ushort","char","finally","new","sizeof","using","checked","fixed","null","stackalloc","virtual","class","float","object","static","volatile","const","for","operator","string","void","continue","foreach","out","struct","while","decimal","goto","override","switch","default","if","params","this","delegate","implicit","private","throw"};//C#保存重点字表(77个)将下一输入字符读到ch中,找寻指示器前移一字符地址privatevoidgetChar(){ch=input[inputIndex];inputIndex++;}将ch中的字符连接到strToken之后privatevoidconcat(){strToken+=ch;}判断ch中的字符是否为字母privateboolisLetter(){if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))returntrue;elsereturnfalse;}判断ch中的字符是否为数字privateboolisDigit(){if(ch>='0'&&ch<='9')returntrue;elsereturnfalse;}南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用//对strToken中的字符串查找保存字表,假设它是一个保存字那么返回其编码,否那么返回0privateintreserve(){inti;boolnotFound=true;strings=strToken;for(i=0;notFound&&i<tokenReserve.Length;i++){if(tokenReserve[i]==s)notFound=false;}if(notFound)return0;elsereturni;}将找寻指示器回调一个字符地址,将ch置为空白字符privatevoidretract(){inputIndex--;}将strToken中的表记符插入符号表〔表中不存在该元素时才插入〕,返回符号表指针privateintinsertId(){先在符号表里找该元素inti;boolnotFound=true;strings=strToken;for(i=0;notFound&&i<token.Length;i++){if(token[i]==s)notFound=false;}没找到if(notFound){token[tokenIndex]=strToken;tokenIndex++;return(tokenIndex-1);}找到了elsereturni-1;}将strToken中的整型常数插入整型常数表〔表中不存在该元素时才插入〕,返回整型常数表指针南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用privateintinsertConst(){inti;boolnotFound=true;longs=int.Parse(strToken);for(i=0;notFound&&i<constant.Length;i++){if(constant[i]==s)notFound=false;}没找到if(notFound){constant[constantIndex]=int.Parse(strToken);constantIndex++;return(constantIndex-1);}找到了elsereturni-1;}将strToken中的浮点型常数插入浮点常数表〔表中不存在该元素时才插入〕,返回浮点常数表指针privateintinsertDblConst(){inti;boolnotFound=true;doubles=double.Parse(strToken);for(i=0;notFound&&i<dblConstant.Length;i++){if(dblConstant[i]==s)notFound=false;}没找到if(notFound){dblConstant[dblConstantIndex]=double.Parse(strToken);dblConstantIndex++;return(dblConstantIndex-1);}找到了elsereturni-1;}将strToken中的字符串插入字符串表〔表中不存在该元素时才插入〕,返回字符串表指针privateintinsertString()南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用{inti;boolnotFound=true;strings=strToken;for(i=0;notFound&&i<strConst.Length;i++){if(strConst[i]==s)notFound=false;}没找到if(notFound){strConst[strConstIndex]=strToken;strConstIndex++;return(strConstIndex-1);}找到了elsereturni-1;}将strToken中的字符插入字符表〔表中不存在该元素时才插入〕,返回字符表指针privateintinsertChar(){inti;boolnotFound=true;charc=ch;for(i=0;notFound&&i<charConst.Length;i++){if(charConst[i]==c)notFound=false;}没找到if(notFound){charConst[charConstIndex]=ch;charConstIndex++;return(charConstIndex-1);}找到了elsereturni-1;}//Scan方法privatestringscan(){strToken="";南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用intcode,value;getChar();表记符及保存字if(isLetter()||ch=='_'){if(input.Length>1){while((isLetter()||isDigit()||(ch=='_'))&&inputIndex<input.Length){concat();getChar();}if(inputIndex<input.Length)retract();elseif(inputIndex==input.Length){if(isLetter()||isDigit()||(ch=='_'))concat();elseretract();}code=reserve();if(code==0){value=insertId();return(strToken+"<@ID"+","+value.ToString()+">");}elsereturn(strToken+"<@RESERVED_WORD+"code.ToString()+",->");}else{return(ch+"<@ID"+",0>");}}整型常数和浮点常数elseif(isDigit()){if(input.Length>1){while(isDigit()&&inputIndex<input.Length){concat();getChar();}if(ch=='.'&&inputIndex<input.Length){concat();南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用getChar();while(isDigit()&&inputIndex<input.Length){concat();getChar();}if(inputIndex<input.Length)retract();elseif(inputIndex==input.Length){if(isDigit())concat();elseretract();}value=insertDblConst();return(strToken+"<@FLOAT"+","+value.ToString()+">");}if(inputIndex<input.Length)retract();elseif(inputIndex==input.Length){if(isDigit())concat();elseretract();}value=insertConst();return(strToken+"<@INT"+","+value.ToString()+">");}else{return(ch+"<@INT,0>");}}elseif(ch=='='){if(inputIndex<input.Length){getChar();if(ch=='=')return("==<@EQUAL,->");retract();return("=<@ASSIGN,->");}elsereturn("=<@ASSIGN,->");}elseif(ch=='!'){if(inputIndex<input.Length){南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用getChar();if(ch=='=')return("!=<@NOT_EQUAL,->");retract();return("!<@NOT,->");}elsereturn("!<@NOT,->");}elseif(ch=='+'){if(inputIndex<input.Length){getChar();if(ch=='+')return("++<@SELF_INCREASE,->");elseif(ch=='=')return("+=<@SELF_INCREASE_BY_SIZE,->");retract();return("+<@PLUS,->");}elsereturn("+<@PLUS,->");}elseif(ch=='-'){if(inputIndex<input.Length){getChar();if(ch=='-')return("--<@SELF_DECREASE,->");elseif(ch=='=')return("-=<@SELF_DECREASE_BY_SIZE,->");elseif(ch=='>')return("-><@MEMBER_VISIT,->");retract();return("-<@MINUS,->");}elsereturn("-<@MINUS,->");}elseif(ch=='|'){if(inputIndex<input.Length){getChar();if(ch=='|')return("||<@OR2,->");elseif(ch=='=')return("|=<@OR_EQUAL,->");retract();return("|<@OR1,->");}elsereturn("|<@OR1,->");}南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用elseif(ch=='&'){if(inputIndex<input.Length){getChar();if(ch=='&')return("&&<@AND2,->");elseif(ch=='=')return("&=<@AND_EQUAL,->");retract();return("&<@AND1,->");}elsereturn("&<@AND1,->");}elseif(ch=='>'){if(inputIndex<input.Length){getChar();if(ch=='=')return(">=<@GREATER_OR_EQUAL,->");elseif(ch=='>')return(">><@BIT_MOV_R,->");retract();return("><@GREATER,->");}elsereturn("><@GREATER,->");}elseif(ch=='<'){if(inputIndex<input.Length){getChar();if(ch=='=')return("<=<@LESS_OR_EQUAL,->");elseif(ch=='<')return("<<<@BIT_MOV_L,->");retract();return("<<@LESS,->");}elsereturn("<<@LESS,->");}elseif(ch=='\''){if(inputIndex<input.Length-2){getChar();if(ch=='\'')return"INVALIDUSEOF'";elseif(ch=='\\'){南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用getChar();if(ch=='n'||ch=='r'||ch=='\\'||ch=='t'||ch=='b'||ch=='\''||ch=='\"')//各种换行符{getChar();if(ch=='\'')return"\\"+input[inputIndex-2]+"<@ESC,->";}else{retract();return"INVALIDUSEOF'";}}getChar();if(ch=='\''){ch=input[inputIndex-2];value=insertChar();return(input[inputIndex-2]+"<@CHAR,"+value.ToString()+">");}elseif(inputIndex==input.Length-1){retract();return"INVALIDUSEOF'";}else{retract();retract();return"INVALIDUSEOF'";}}elseif(inputIndex<input.Length-1){getChar();if(ch=='\''||ch=='\\')return"INVALIDUSEOF'";getChar();if(ch=='\''){ch=input[inputIndex-2];value=insertChar();return(input[inputIndex-2]+"<@CHAR,"+value.ToString()+">");}elseif(inputIndex==input.Length-1)南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用{retract();return"INVALIDUSEOF'";}else{retract();retract();return"INVALIDUSEOF'";}}elsereturn"INVALIDUSEOF'";}elseif(ch=='\"'){boolnotMatch=true;if(inputIndex==input.Length)return("INVALIDUSEOF\"");elseif(input[inputIndex]=='\"'){strToken="";value=insertString();if(inputIndex<input.Length)getChar();return("(nullstring)<@STRING_NULL,"+value.ToString()+">");}else{getChar();while(notMatch&&inputIndex<=input.Length){concat();if(inputIndex<input.Length){getChar();if(ch=='\"')notMatch=false;}if(ch=='\"')notMatch=false;}if(notMatch)return("INVALIDUSEOF\"");else{value=insertString();return(strToken+"<@STRING,"+value.ToString()+">");}}南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用}elseif(ch=='*'){if(inputIndex<input.Length){getChar();if(ch=='=')return("*=<@SELF_MULTIPLY_BY_SIZE,->");retract();return("*<@MULTIPLY,->");}elsereturn("*<@MULTIPLY,->");}elseif(ch=='/'){if(inputIndex<input.Length){getChar();//说明行if(ch=='*'){boolstillSearch=true;if(inputIndex>input.Length-2)return("INVALIDUSEOF/*");getChar();while(ch!='*'&&input[inputIndex]!='/'&&stillSearch){concat();getChar();if(inputIndex==input.Length)stillSearch=false;}if(inputIndex==input.Length){concat();}getChar();return("");}elseif(ch=='/'){if(inputIndex<input.Length){getChar();while(ch!='\n'&&inputIndex<input.Length){concat();南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用getChar();}if(inputIndex==input.Length){concat();}return("");}elsereturn("");}elseif(ch=='='){return("/=<@SELF_DIVIDE_BY_SIZE,->");}else{retract();return("/<@DIVIDE,->");}}elsereturn("/<@DIVIDE,->");}elseif(ch=='#')return("#<@SHARP,->");elseif(ch==':'){if(inputIndex<input.Length){getChar();if(ch==':')return("::<@FIELD,->");retract();return(":<@COLON,->");}elsereturn(":<@COLON,->");}elseif(ch==';')return(";<@SEMICOLON,->");elseif(ch=='~')return("~<@COMPLEMENT,->");elseif(ch=='`')return("`<@UPDOT,->");elseif(ch=='@')return("@<@AT,->");elseif(ch=='$')return("$<@DOLLAR,->");elseif(ch=='%'){if(inputIndex<input.Length){getChar();南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用if(ch=='=')return("%=<@MOD_EQUAL,->");retract();return("%<@MOD,->");}elsereturn("%<@MOD,->");}elseif(ch=='^'){if(inputIndex<input.Length){getChar();if(ch=='=')return("^=<@XOR_EQUAL,->");retract();return("^<@XOR,->");}elsereturn("^<@XOR,->");}elseif(ch=='_')return("_<@UNDERLINE,->");elseif(ch=='?'){if(inputIndex<input.Length){getChar();if(ch=='?')return("??<@RETURN_NOT_NULL,->");retract();return("?<@INTERROGATION,->");}elsereturn("?<@INTERROGATION,->");}elseif(ch=='[')return("[<@LSQUARE,->");elseif(ch==']')return("]<@RSQUARE,->");elseif(ch=='{')return("{<@LBRACKET,->");elseif(ch=='}')return("}<@RBRACKET,->");elseif(ch=='(')return("(<@LPAR,->");elseif(ch==')')return(")<@RPAR,->");elseif(ch==',')return(",<@COMMA,->");elseif(ch=='.')return(".<@DOT,->");elseif(ch=='')return("");elseif(ch=='\n')return("");elseif(ch=='\t')return("");elseif(ch=='\b')return("");elseif(ch=='\r')return("");elseif(ch=='\\')return("");elsereturn(ch+",UNDEFINED,-");南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用}privatevoidcmdReset_Click(objectsender,EventArgse){if(rtbInput.Text!=""||rtbOutput.Text!=""){if(MessageBox.Show("CLEARTEXT?","TEXTCLEARCONFIRM",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK){rtbInput.Clear();rtbOutput.Clear();}}}privatevoidcmdStart_Click(objectsender,EventArgse){rtbOutput.Clear();token=newstring[10000];constant=newlong[10000];dblConstant=newdouble[10000];charConst=newchar[10000];strConst=newstring[10000];tokenIndex=0;constantIndex=0;dblConstantIndex=0;strConstIndex=0;charConstIndex=0;inputIndex=0;input=rtbInput.Text.ToString();strings;stringresult="";if(rtbInput.Text.Length>100000){rtbOutput.Text="Filetoolarge.";return;}try{while(inputIndex<input.Length){s=scan();if(s!="")result+=s+"\n";//扫描字符串}南通效劳器租用,效劳器托管,域名注册,合租空间,游戏效劳器,企业邮局南通效劳器租用|效劳器托管|空间合租|游戏效劳器租用if(result!=""){rtbOutput.Text=result;scanned=true;}}catch(IndexOutOfRangeExceptionindexOutOfRange){rtbOutput.Text+="Invalidinput.";}catch(Exceptionexception){rtbOutput.Text=exception.Message;}}privatevoidcmdSave_Click(objectsender,EventArgse){if(scanned&&rtbOutput.Text!=""){DialogResultbuttonClicked=saveFileDialog.ShowDialog();if(buttonClicked.Equals(DialogResult.OK)){rtbOutput.SaveFile(saveFileDialog.FileName);MessageBox.Show("SAVED.","SCANNER");}}}privatevoidcmdAbout_Click(objectsender,EventArgse){MessageBox.Show("范成(KENSHIN)\nTongjiUniversity\nDepartmentofComputerScience\n2007","ABOUT",MessageBoxButtons.OK,MessageBoxIcon.Information);}privatevoidcmdOpen_Click(objectsender,EventArgse){DialogResultbuttonClicked=openFileDialog.ShowDialog();if(buttonClicked.Equals(DialogResult.OK)){FileStreamfs=newFileStream(openFileDialog.FileName,FileMode.Open,FileAccess.Read);StreamReaderm_streamReader=newStream

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论