.Word资料编译原理实验报告本科实验报告课程名称:编译原理D实验地点:实验室专业班级:学号:_学生姓名:java编译指导教师:成绩:.Word资料2015年月日实验一、无符号数的词法分析程序(4学时)内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。无符号数文法规则可定义如下:无符号数→无符号实数│无符号整数无符号实数→无符号整数.数字串[E比例因子│无符号整数E比例因子比例因子→有符号整数有符号整数→[+│-]无符号整数无符号整数→数字串数字串→数字{数字}数字→0123......9读无符号数的程序流程图见下图.Word资料开始0=w,p,j1=e数字否出错数值=〉dw*10+d=w取下一字符数字否是‘.’否是‘E’否退一字符‘整型’=〉CJ1取下一字符数字否出错数值=〉dw*10+d=wj+1=j取下一字符数字否是‘E’否取下一字符是‘-’否是‘+’否数字否数值=〉dp*10+d=p取下一字符数字否退一字符‘实型’=CJ1W*10C*P-J=CJ2出口-1=e取下一字符出错YNNNNYNYYNNYYNNYNYYNYYY实验代码:packagetext_1;importjava.util.*;publicclassText1{publicstaticvoidmain(String[]args){intp=0,w=0,w1=0,j=0,i=0,d=0,e=1;//定义初值doublew2=0;Stringstr;.Word资料System.out.println(请输入一串字符串(以;结束):);Scannerm=newScanner(System.in);str=m.nextLine();charch1[]=str.toCharArray();//字符串转化为字符数组/***检测字符数组for(i=0;ich1.length;i++){System.out.print(ch1[i]+);}*/while(ich1.length){if(ch1[i]'9'||ch1[i]'0'){//查到第一个数字i++;}else{do{d=ch1[i]-'0';w=w*10+d;j++;i++;}while(ch1[i]='0'&&ch1[i]='9');if(ch1[i]!='.'){if(ch1[i]!='E'){System.out.println(整数为:+w);//输出整数w=0;j=0;}else{i++;if(ch1[i]=='-'){e=-1;i++;if(ch1[i]='0'&&ch1[i]='9'){do{d=ch1[i]-'0';p=p*10+d;i++;}while(ch1[i]='0'&&ch1[i]='9');}if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p-j+1)));//科学计数法输出实型j=0;w2=0;w=0;p=0;.Word资料}elseSystem.out.println(输入错误!);}if(ch1[i]='0'&&ch1[i]='9'){do{d=ch1[i]-'0';p=p*10+d;i++;}while(ch1[i]='0'&&ch1[i]='9');}if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p-j+1)));j=0;w2=0;w=0;p=0;}elseSystem.out.println(输入错误!);}}else{i++;if(ch1[i]='0'&&ch1[i]='9'){do{d=ch1[i]-'0';w1=w1*10+d;j++;i++;}while(ch1[i]='0'&&ch1[i]='9');}elseSystem.out.println(输入错误!);if(ch1[i]=='E'){i++;if(ch1[i]=='-'){e=-1;i++;if(ch1[i]='0'&&ch1[i]='9'){do{d=ch1[i]-'0';p=p*10+d;.Word资料i++;}while(ch1[i]='0'&&ch1[i]='9');}if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p-j+1)));j=0;w2=0;w=0;p=0;}elseSystem.out.println(输入错误!);}if(ch1[i]='0'&&ch1[i]='9'){do{d=ch1[i]-'0';p=p*10+d;i++;}while(ch1[i]='0'&&ch1[i]='9');}if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p-j+1)));j=0;w2=0;w=0;p=0;}elseSystem.out.println(输入错误!);}elseif(ch1[i]!='E'){//输出小数System.out.println(小数为:+w+'.'+w1);w=0;w1=0;j=0;}}}}}}.Word资料运行结果:实验二、逆波兰式生成程序内容:掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序(4学时)要求:利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。常用运算符优先关系矩阵如上表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。“>、<、=”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。左边的“=”与右边的“(”之间没有优先关系存在,所以表中为空白。+-*/↑()+>><<<<>->><<<<>*>>>><<>/>>>><<>↑>>>>><>(<<<<<<=)>>>>>>右关系左.Word资料逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。下面给出了逆波兰表达式生成算法的流程图。(为了便于比较相邻运算符的优先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈。.Word资料开始输入运算符优先关系从左往右扫描中缀表达式输入串为空运算符栈是否为空比较当前运算符于栈顶运算符的优先级当前运算符的优先级高当前运算符是‘)’退栈输出栈为空结束退栈输出输出入栈入栈栈顶为‘(’栈为空退栈输出退栈ERRORNYNNNYYNNYYYNNYY实验代码:packagetext_2importjava.util.*;publicclassText2{privatecharOperator_Precedence_Relation_Matrix[][]={{'','','','','','',''},{'','','','','','',''},{'','','','','','',''},{'','','','','','',''},.Word资料{'','','','','','',''},{'','','','','','','='},{'','','','','','',''}};privatecharInfix_Expression[];//字符串infix用于表示要处理的中缀表达式privateStringReverse_Polish_Expression=newString();//字符串reversePlishExpression用于表示处理结果逆波兰式privateStringAnalysis_Stack=newString();//字符串analysisStack用于表示分析栈privateintLength_Infix_Expression=0;//中缀表达式的长度,初始值为0privateintmatch_Parentheses=1;//用来查看左右括号是否配对正确privateintcount=0;privatevoidinit(Stringstr){Infix_Expression=str.toCharArray();Length_Infix_Expression=Infix_Expression.length;}privateintOperator_Judgement(charcurrentOperator){intflag=-1;switch(currentOperator){case'+':flag=0;break;case'-':flag=1;break;case'*':flag=2;break;case'/':flag=3;case'^':flag=4;break;case'(':flag=5;break;case')':flag=6;break;}returnflag;}voidconvert_Process(Stringstr){init(str);while(true){match_Parentheses=0;.Word资料if(count=Length_Infix_Expression){//检测输入串为空while(Analysis_Stack.length()!=0){//检测分析栈if(Analysis_Stack.charAt(Analysis_Stack.length()-1)=='('){System.out.println(\n您输入的中缀表达式中有无法配对的'('括号,请仔细核实!);System.exit(0);}else{Reverse_Polish_Expression+=Analysis_Stack.charAt(Analysis_Stack.length()-1);Analysis_Stack=Analysis_Stack.substring(0,Analysis_Stack.length()-1);}}//退栈输出System.out.println(逆波兰式为:+Reverse_Polish_Expression);System.exit(0);}else{if(Operator_Judgement(Infix_Expression[count])==-1){Reverse_Polish_Expression+=Infix_Expression[count];}else{while(Analysis_Stack.length()!=0){//检测分析栈if(Operator_Precedence_Relation_Matrix[Operator_Judgement(Analysis_Stack.charAt(Analysis_Stack.length()-1))][Operator_Judgement(Infix_Expression[count])]==''){Analysis_Stack+=Infix_Expression[count];break;}else{if(Infix_Expression[count]!=')'){Reverse_Polish_Expression+=Analysis_Stack.charAt(Analysis_Stack.length()-1);Analysis_Stack=Analysis_Stack.substring(0,Analys