if(m[i]<48||m[i]>57){
i++;
}else{
do{
d=m[i]-48;
w=w*10+d;
j++;
i++;
}while(m[i]>=48&&m[i]<=57);
//System.out.println("chesi"+m[i]);
if(m[i]!
='.'){
if(m[i]!
='E'){
System.out.println("整型数为:
"+w);
j=0;
w=0;
}else{
i++;
if(m[i]=='-'){
e=-1;
i++;
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1)
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;
}else
System.out.println("您输入有误!
");
}elseif(m[i]=='+'){
i++;
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1)
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;
}else
System.out.println("您输入有误!
");
}else{
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1)
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;
}else
System.out.println("您输入有误!
");
}
}
}
else{
i++;
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
w1=w1*10+d;
//j=j+1;
i++;
}while(m[i]>=48&&m[i]<=57);
}else
System.out.println("您输入有误!
");
if(m[i]!
='E'){
System.out.println("小数为:
"+w+'.'+w1);
w=0;
w1=0;
j=0;
}elseif(m[i]=='E'){
i++;
if(m[i]=='-'){
e=-1;
i++;
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1){
w2=w/(Math.pow(10.0,j-1));
System.out.println("实型数为:
"+w2+w1
+"*10"+""+(e*(p-j+1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}else{
System.out.println("实型数为:
"+w+'.'+w1
+"*10"+""+(e*(p-j+1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}
}else
System.out.println("您输入有误!
");
}elseif(m[i]=='+'){
i++;
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1){
w2=w/(Math.pow(10.0,j-1));
System.out.println("实型数为:
"+w2+w1
+"*10"+""+(e*(p+j-1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}else{
System.out.println("实型数为:
"+w+'.'+w1
+"*10"+""+(e*(p+j-1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}
}else
System.out.println("您输入有误!
");
}else{
if(m[i]>=48&&m[i]<=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>=48&&m[i]<=57);
if(j>1){
w2=w/(Math.pow(10.0,j-1));
System.out.println("实型数为:
"+w2+w1
+"*10"+""+(e*(p+j-1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}else{
System.out.println("实型数为:
"+w+'.'+w1
+"*10"+""+(e*(p+j-1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}
}else
System.out.println("您输入有误!
");
}
}else
System.out.println("您输入有误!
");
}
}
}
}
}2.实验结果:
一、实验目的和要求
1.培养学生初步掌握编译原理实验的技能。
2.验证所学理论、巩固所学知识并加深理解。
3.对学生进行实验研究的基本训练。
二、实验内容和原理
实验二、逆波兰式生成程序
内容:
掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序(4学时)
要求:
利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。
逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。
如表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。
“>、<、=”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。
左边的“=”与右边的“(”之间没有优先关系存在,所以表中为空白。
逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。
下面给出了逆波兰表达式生成算法的流程图。
(为了便于比较相邻运算符的优
先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈)。
常用运算符优先关系矩阵
+
-
*
/
↑
(
)
+
>
>
<
<
<
<
>
-
>
>
<
<
<
<
>
*
>
>
>
>
<
<
>
/
>
>
>
>
<
<
>
↑
>
>
>
>
>
<
>
(
<
<
<
<
<
<
=
)
>
>
>
>
>
>
三、主要仪器设备
PC机+Java语言编程环境
四、实验结果与分析
1.实验内容:
packagecom_text4;
importjava.io.*;
publicclassText4{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
inti=0,j=0;
Stringstr;
System.out.println("请输入一串中序表达式:
");
BufferedReaderbuf=newBufferedReader(
newInputStreamReader(System.in));
str=buf.readLine();
charm[]=newchar[20];
for(into=0;om[o]=str.charAt(o);
}
for(into=str.length();o<20;o++){
m[o]='';
}
charn[]=newchar[m.length];
for(into=0;on[o]='';
System.out.println("逆波兰式为:
");
while(i<=str.length()){
if(m[i]==''){
if(n[j]==''){
System.out.println("\n"+"结束!
");
System.exit(0);
}else{
do{
if(n[j]!
='('&&n[j]!
=')')
System.out.print(n[j]);
n[j]='';
if(j>=1)
j--;
}while(n[j]!
='');
j=j+1;
}
}elseif(isOperator(m[i])){
while(isOperator(m[i])){
if(n[j]==''){
n[j]=m[i];
i++;
}elseif(priority(n[j],m[i])=='<'){
j++;
n[j]=m[i];
i++;
}elseif(m[i]==')'){
while(j>0){
if(n[j]=='('){
n[j]='';
i++;
}else{
if(n[0]==''){
System.out.println("Error");
}else{
if(n[j]!
='('&&n[j]!
=')')
System.out.print(n[j]);
n[j]='';
if(j>=1)
j--;
i++;
}
}
}
}else{
if(n[j]!
='('&&n[j]!
=')')
System.out.print(n[j]);
n[j]='';
if(j>=1)
j--;
}
}
}else{
System.out.print(m[i]);
i++;
}
}
}
publicstaticcharpriority(charoperator1,charoperator2){
inta=0,b=0;
charoperatorPriorMatrix[][]={{'>','>','<','<','<','>'},
{'>','>','<','<','<','>'},
{'>','>','>','>','<','>'},
{'>','>','>','>','<','>'},
{'<','<','<','<','<','='},
{'>','>','>','>','','>'}};
switch(operator1){
case'+':
a=0;
break;
case'-':
a=1;
break;
case'*':
a=2;
break;
case'/':
a=3;
break;
case'(':
a=4;
break;
case')':
a=5;
break;
}
switch(operator2){
case'+':
b=0;
break;
case'-':
b=1;
break;
case'*':
b=2;
break;
case'/':
b=3;
break;
case'(':
b=4;
break;
case')':
b=5;
break;
}
returnoperatorPriorMatrix[a][b];
}
publicstaticbooleanisOperator(charoperator){
if(operator=='+'||operator=='-'||operator=='*'
||operator=='/'||operator=='('||operator==')')
returntrue;
else
returnfalse;
}
}
2.实验结果: