词法分析器用C#实现.doc_第1页
词法分析器用C#实现.doc_第2页
词法分析器用C#实现.doc_第3页
词法分析器用C#实现.doc_第4页
词法分析器用C#实现.doc_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

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

文档简介

设计界面如上图所示:代码如下:namespace WindowsApplication1 public partial class Form1 : Form public Form1() InitializeComponent(); string Str = , text2 = ; private void 打开ToolStripMenuItem_Click(object sender, EventArgs e) string Fname = ; openFileDialog1.Filter = 文本文件(*.txt)|*.txt; openFileDialog1.Title = 打开文件; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() = DialogResult.OK) Fname = openFileDialog1.FileName; richTextBox1.LoadFile(Fname, RichTextBoxStreamType.PlainText); Str = richTextBox1.Text; private void 保存ToolStripMenuItem_Click(object sender, EventArgs e) string Fname = openFileDialog1.FileName; richTextBox1.SaveFile(Fname, RichTextBoxStreamType.PlainText); private void 另存为ToolStripMenuItem_Click(object sender, EventArgs e) string Fname; saveFileDialog1.Filter = 文本文件(*.txt)|*.txt; saveFileDialog1.Title = 保存文件 ; saveFileDialog1.RestoreDirectory = true; saveFileDialog1.ShowDialog(); Fname = saveFileDialog1.FileName; if (Fname != ) richTextBox1.SaveFile(Fname, RichTextBoxStreamType.PlainText); private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e) Application.Exit(); private void 字体ToolStripMenuItem_Click(object sender, EventArgs e) fontDialog1.ShowEffects = true; fontDialog1.Font = richTextBox1.SelectionFont; if (fontDialog1.ShowDialog() = DialogResult.OK) richTextBox1.SelectionFont = fontDialog1.Font; private void 词法分析ToolStripMenuItem_Click(object sender, EventArgs e) Gets.LineNo = 1; /初始化行号 Gets.errors = 0; /初始化错误个数 Gets.text5 = ; string text1 = richTextBox1.Text + 0; Gets getstring = new Gets(); text2 = getstring.GetString(text1); richTextBox2.Text = *Token串生成表如下* + rn + text2; textBox2.Text = getstring.ErrorN0(); private void Form1_Load(object sender, EventArgs e) private void 符号表ToolStripMenuItem_Click(object sender, EventArgs e) textBox2.Text = *符号表信息*+rn; textBox2.Text += Gets.text4; private void 错误详细信息ToolStripMenuItem_Click(object sender, EventArgs e) textBox2.Text = Gets.text5; 主要实现功能的代码如下:创建一个Gets类用来对输入的字符串进行扫描 class Gets int i = 0, j = 0; /记录字符位置,token数组的位置 public static int LineNo = 1; /行号 string token = ; /记录识别出的单词 string text2 = ; string text3 = ; /用来记录错误信息 string wrong = ; /记录异常信息 public static int errors = 0; /错误字段的个数 public static string text5 = ; / 记录错误的详细信息 int flag1=0, flag2=0,flag3,flag4,flag5,flag6 = 0; /标记成对出现的界符 public static string text4 = 入口:单词名称 长度 类型 种属 值 内存地址+rn; /用来记录符号表 string m_KeyWords =new string 32auto, double, int,struct, break, else,long,switch,case,enum, register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default, goto,sizeof,volatile,do,if,while,static ; string m_operator =new string 28+,-,*,/,%,=,=,=, -=,+=,*=,/=, /运算符 !=,=,%=,&,&,|,|,!,+,-,?:; string m_bound = new string15 , , , , ;, , ., (, ), :, , #, , ,; /界符 public string GetString(string str) /读入字符串 string space = ; /空格数 if (str.Length = 0) /判断字符串是否为空 return ; try while (stri!= 0) /读入字符判断,空格、字母、数字、界符 if (stri = | stri = t | stri = r) i+; /跳过无意义的字符 else if (stri = n)/如果是换行符,则行号加1 LineNo+; i+; else if (isalpha(stri)/如果是字母 i = recog_id(str, i); for (j = 0; j = m_KeyWords.Length)/不是保留字 for (int m = 0; m 12 - token.Length; m+) space = space + ; text2 = text2 + LineNo.ToString() + : + token + space+标识符 Token码 75 + rn; ; text4 = text4 + LineNo.ToString() + : + token + + token.Length + space + 标识符 + + 简单变量 + + 未知 + + 未知 + rn; token = ; space=; if (j m_KeyWords.Length)/是保留字 for (int m = 0; m 12- token.Length; m+) space = space + ; text2 = text2 + LineNo.ToString() + : + m_KeyWordsj +space+ 保留字 Token码 + Convert.ToString(gettoken(token, 1) + rn; ; token = ; space = ; else if (isdigit(stri)/如果是数字 i = recog_dig(str, i); for (int m = 0; m 12 - token.Length; m+) space = space + ; text2 = text2 + LineNo.ToString() + : + token + space+常量 Token码 76 + rn; text4 = text4 + LineNo.ToString() + : + token + + token.Length + space + 整数 + + 简单变量 + + 未知 + + 未知 + rn; token = ; space=; else if (isbound(stri) /识别界符 i = recog_bound(str, i); for (int m = 0; m 12 - token.Length; m+) space = space + ; text2 = text2 + LineNo.ToString() + : + token + space+界符 Token码 + Convert.ToString(gettoken(token, 3) + rn; ; token = ; space=; else if (isoperator(stri) i = recog_Operator(str, i); for (int m = 0; m= a & ch = A & ch = 0 & ch = 9) return true; else return false; public bool issign(char ch) /识别下划线 if (ch = _) return true; else return false; public bool isbound(char ch) /判断是否为界符 for(int j=0;jm_bound.Length;j+) if (ch.CompareTo(m_boundj0)=0) return true; return false; public bool isoperator(char ch) for (int i = 0; i m_operator.Length; i+) if (ch = m_operatori0) return true; return false; private int recog_Operator(string str, int i) char state = 0; string sstr = ; while (state != 2) switch (state) case 0: sstr += stri; i+; state = 1; break; case 1: /判断为双个运算符 if (str.Substring(i - 1, 2) = + | str.Substring(i - 1, 2) = - | str.Substring(i - 1, 2) = | str.Substring(i - 1, 2) = += | str.Substring(i - 1, 2) = -= | str.Substring(i - 1, 2) = *= | str.Substring(i - 1, 2) = /= | str.Substring(i - 1, 2) = != | str.Substring(i - 1, 2) = %=) sstr += stri; i+; state = 2; if (stri - 1 = ? & stri = :) /三目运算符 sstr += stri; i+; state = 2; else state = 2; /运算符 break; token=sstr; return i; public int recog_id(string str, int i) /识别单词 char state = 0; string sstr=; /记录单词 while (state != 2) switch (state) case 0: if (isalpha(stri) state = 1; sstr = sstr + stri; i+; / else error(1); break; case 1: if (isalpha(stri) | isdigit(stri) | issign(stri) state = 1; sstr = sstr + stri; i+; else state = 2; break; token = sstr; /记录识别的字符串 return i; public int recog_dig(string str, int i) /识别常数 char state = 0; string sstr = ; while (state != 2) switch (state) case 0: if (isdigit(stri) sstr += stri; state = 1; i+; break; case 1: if (isdigit(stri) sstr += stri; state = 1; i+; else if (stri = . & isdigit(stri + 1) /实数 sstr += stri; state = 1; i+; else state = 2; break; token = sstr; return i; public int recog_bound(string str, int i) string sstr = ; for (int k = 0; k m_bound.Length; k+) /判断为界符 if (stri.CompareTo(m_boundk0) = 0) sstr += stri; i+; break; else continue; token = sstr; if (token = |token=) flag1+; else if (token = | token = ) flag2+; else if (token = ( | token = ) flag3+; else if (token = ) flag4+; else if (token = ) flag5+; else if (token = ) flag6+; return i; public int gettoken(string str,int k) /获得单词的token值 switch(k) case 1: for (int i = 0; i m_KeyWords.Length; i+) /关键字 if (str = m_KeyWordsi) return i; break; case 2: for (int i = 0; i m_operator.Length; i+) /运算符 if (str =

温馨提示

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

评论

0/150

提交评论