编译原理课程实验语义分析.doc
《编译原理课程实验语义分析.doc》由会员分享,可在线阅读,更多相关《编译原理课程实验语义分析.doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理课程实验报告班 级:软件51学 号:05161005姓 名:曹建兵提交日期:2009年3月17日联系方式:13488101375一、实验内容:实现一个程序设计语言子集的编译系统。包括:词法分析,语法分析,语义分析,符号表,出错处理等语言成分:(1) 数据类型:整型,布尔型;(2) 简单变量;(3) 算术表达式(+,);(4) 布尔表达式(,);(5) 语句:(6) 赋值语句;(7) 分支语句(if-then, if-then-else);(8) 循环语句(while);(9) 定义语句等。输入方式:文本文件(如: .txt);二、实验过程:1. 程序设计语言的形式化描述语法分析:S-V
2、; | If B then V; | If B then V else V; | while B do V; | int i;| bool i;(不考虑直接表达式形式)B-(B)F | i F(由于要求只有布尔型常量或变量)F- B | B;V-i := E(赋值语句,这里i 只能是变量)E-iT | (E)(表达式语句)T-*E | +E | (表达式中间状态)2. 单词种别定义单词符号种别编号Program1True2false3bool4int5If6Then7Else8Do9While10标识符11常量12+13-14(15)16=171819;20:21:=22,23*2425262
3、728293. 语法分析程序:package compiler;import java.util.ArrayList;import java.util.HashMap;public class GrammarAnalysis private String SYM ;private ArrayList result ;private HashMap reverse ;private int current = 0 ;private int row = 1 ;private int number = 1 ;private boolean flag = true ;private int count
4、=0;private int NXQ=1;private ArrayList output;private int totalVar=0;private HashMap var; private boolean t=true;public GrammarAnalysis(ArrayList al)result = new ArrayList();reverse = new HashMap();int i;for(i=0;ial.size();i+)if(al.get(i).getType()=0) break;if(i=al.size()result=al;else result=null;v
5、ar=new HashMap();output=new ArrayList();output.add(new SiYuanShi(0,-,-,-,0);/reverse.put(1,program);/reverse.put(2,begin);/reverse.put(3,end);/reverse.put(4,var);reverse.put(2,true);reverse.put(3,false);reverse.put(4,bool);reverse.put(5,int);reverse.put(6,if);reverse.put(7,then);reverse.put(8,else);
6、reverse.put(9,do);reverse.put(10,while);reverse.put(11, identifier); /标识符reverse.put(12, constants); /常量reverse.put(13,+);/reverse.put(14,-);reverse.put(15,();reverse.put(16,);reverse.put(17,=);reverse.put(18,);reverse.put(19,);reverse.put(20,;);reverse.put(21,:);reverse.put(22,:=);reverse.put(23,);
7、/reverse.put(24, /);reverse.put(24, *);reverse.put(25, );reverse.put(26, );reverse.put(27,);reverse.put(28,);reverse.put(29,);if(result!=null)ADVANCE();public void run()if(result!=null)while(currentresult.size()if(flag)P();else break;if(t)System.out.println(生成四元式如下:);for(int i=1;ioutput.size();i+)Sy
8、stem.out.println(output.get(i).toString();System.out.println(符号表如下:);System.out.println(var.toString();/*结果输出*/else System.out.println(请先除去未定义符号);private int newTemp()count+;return count;private int entry(String i)return 0;private void gen(String op,String arg1 ,String arg2 ,String result)SiYuanShi
9、a=new SiYuanShi(NXQ,op,arg1,arg2,result);/System.out.println(a.toString();output.add(a);NXQ+;private void ADVANCE()if(currentresult.size()SYM = reverse.get(result.get(current).getType();current + ;number + ;private int merge(int p1,int p2)tryint i=p2;if(p1!=0&p2!=0)while(Integer.parseInt(output.get(
10、i).getResult()!=0)i=Integer.parseInt(output.get(i).getResult();output.get(i).setResult(Integer.toString(p1);return p2;catch(Exception e)System.out.println(Error1);return p2;private void backpatch(int p,int m)tryint i=p;int t=0;if(p!=0)while(Integer.parseInt(output.get(i).getResult()!=0)t=Integer.par
11、seInt(output.get(i).getResult();output.get(i).setResult(Integer.toString(m);i=t;output.get(i).setResult(Integer.toString(m);catch(Exception e)System.out.println(Error2);private void ERROR(int i)t&=false;flag = flag & false ;System.out.println(判断句子以分号为标准。);System.out.print(错误位于第+row+句,第+number+个单词上。)
12、;switch(i)case 0 : System.out.println(语法错:缺少分号);break;case 1 : System.out.println(语法错:else关键字错误。);break;case 2 : System.out.println(语法错:then关键字缺失。);break;case 3 : System.out.println(语法错:限定非符号之后只能跟随左括号。);break;/case 3 : System.out.println(语法错:While-do 循环语句未结束。);break;case 4 : System.out.println(语法错:d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程 实验 语义 分析
限制150内