1、SABCDEFGHIJKLM;#2183Ac-345-467-5-2109-12511131512-614-8-7161720-121918-15-92122-132324-14-111.2.2 程序核心代码和注释: public void analyzer() /* /循环读取grammar.txt /* /*此处代码略*/ /循环读取 lengh.txt /*此处代码略*/ /* / 读入文件,进行语法分析 string strReadFile; strReadFile=input.txt myTextRead.myStreamReader=new StreamReader(strRead
2、File); string strBufferText; int wid =0; Console.WriteLine(分析读入程序(记号ID):n); do strBufferText =myTextRead.myStreamReader.ReadLine(); if(strBufferText=null) break; foreach (String subString in strBufferText.Split() if(subString!=) int ll; if(subString!=null) ll= subString.Length; /每一个长度 else break; in
3、t a=ll+1; char b = new chara; StringReader sr = new StringReader(subString); sr.Read(b, 0, ll); /把substring 读到char数组里 int sort=(int)b0; / wordi 和 wordNumi对应 /先识别出一整个串,再根据开头识别是数字还是字母 Wordwid=subString; if(subString.Equals(void) wordNumwid=0; else if(subString.Equals(main wordNumwid=1; else if(subStri
4、ng.Equals() wordNumwid=2; else if(subString.Equals( wordNumwid=3; else if(subString.Equals(int wordNumwid=4; else if(subString.Equals( wordNumwid=6; else if(subString.Equals( wordNumwid=22; else if(subString.Equals( wordNumwid=23; else /识别变量和数字 if(sort47&sort58) wordNumwid=7; else wordNumwid=5; Cons
5、ole.Write(subString+(+wordNumwid+)+ wid+; Console.WriteLine( while (strBufferText!=null); wordNumwid=24; myTextRead.myStreamReader.Close(); /* /读入LR分析表 / /* int state = new int100; string symbol =new string100; state0=0; symbol0=# int p1=0; int p2=0;n按文法规则归约顺序如下: /* / 归约算法如下所显示 while(true) int j,k;
6、j=statep2; k=wordNump1; t=LRj,k; /当出现t为0的时候 if(t=0) /错误类型 string error; if(k=0) error= else if(k=1) if(k=2) if(k=3) if(k=4) if(k=6) if(k=22) if(k=23)其他错误符号 Console.WriteLine(n检测结果:代码中存在语法错误错误状况:错误状态编号为 +j+ 读头下符号为 +error); else if(t=-100) /-100为达到接受状态 Console.WriteLine(代码通过语法检测 break; if(t0) p2=p2+1;
7、 statep2=t; symbolp2=Convert.ToString(wordNump1); p1=p1+1; Console.Read(); 示例:void main ()int i = 8 ;int aa = 10 ;int j = 9 ;intq i = 8 ;对于intq i=8 中 intq这个错误类型,词法分析通过,而语法分析正确识别出了错误,达到预期目标产生出错信息:运行显示如下:13 中间代码生成器设计进入编译程序的第三阶段:中间代码产生阶段。为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某
8、种复杂性介于源程序语言和机器语言之间的中间语言。常用的几种中间语言有: 逆波兰式、四元式、三元式、树表示。本课程设计主要实现逆波兰式的生成。1.3.1 逆波兰式的定义和设计思想及算法1、逆波兰式定义: 将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表达式也称做后缀式。逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。2、生成逆波兰式的设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端
9、多加上了优先级最低的特殊符号“#”。(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。(4)如果不是数字,该字符则是运算符,此时需比较优先关系。做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。1.3.2 核心代码及其结果显示#includ
10、emath.h#define max 100char exmax;void trans() char strmax; char stackmax; char ch; int sum,j,t,top=0; int i=0;/*计数器*/ printf(*n*说明:以 # 号为结束标志.n*n表达示: do i+; scanf(%c,&stri); /*注: str0没有数据*/ if(i=max) printf(表达式长度过长! while(stri!=# & i!=max); sum=i; /*数组长度,即表达式长度*/ t=1; i=1; ch=stri; i+; while(ch! swi
11、tch(ch) case (: top+; stacktop=ch;break;) while(stacktop! ext=stacktop; top-; t+; top-;+- while(top!=0&stacktop! top+;*/ while(stacktop=|stacktop= break; default: while(ch0ch9 ext=ch; ch=stri; i+; i-; ext= t+; ch=stri; =0) if(stacktop! ext=stacktop; t+; top-; else printf(error exit(0); ext=n原表达式是: for(j=1;j d=10*d+ch- ch=ext; stacktop=d; ch=ext; t+;n计
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1