太原理工大学编译原理实验Word文档格式.docx
《太原理工大学编译原理实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《太原理工大学编译原理实验Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
→<
无符号实数>
│<
无符号整数>
.<
数字串>
[E<
比例因子>
]│
<
E<
有符号整数>
→[+│-]<
数字>
{<
}
→0123......9
读无符号数的程序流程图见下图
三、主要仪器设备
PC机+Java语言编程环境
四、实验结果与分析
1.实验代码:
packagetext1;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
publicclassText1{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
intp=0,w=0,w1=0,j=0,i=0,d=0,e=1;
doublew2=0;
Stringstr;
System.out.println("
请输入一串字符以;
结束:
"
);
BufferedReaderbuf=newBufferedReader(
newInputStreamReader(System.in));
str=buf.readLine();
charm[]=newchar[100];
for(i=0;
i<
str.length();
i++){
m[i]=str.charAt(i);
}
i=0;
while(i<
str.length()){
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]>
=57){
do{
d=m[i]-48;
p=p*10+d;
i++;
}while(m[i]>
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
您输入有误!
}elseif(m[i]=='
+'
+(e*(p+j-1)));
}else{
}
}
}
else{
if(m[i]>
do{
d=m[i]-48;
w1=w1*10+d;
//j=j+1;
}while(m[i]>
}else
小数为:
+w+'
+w1);
w1=0;
}elseif(m[i]=='
1){
System.out.println("
+w2+w1
+"
+(e*(p-j+1)));
w=0;
w1=0;
j=0;
w2=0;
p=0;
}else{
+w1
}
+(e*(p+j-1)));
}
}
}2.实验结果:
编译原理
基本程序设计(实验二)
计算机学院606实验室
计Z1101学号:
2011001491
李康达
段利国
2013年11月23日
实验二、逆波兰式生成程序
内容:
掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序(4学时)
要求:
利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。
逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。
常用运算符优先关系矩阵
+
-
*
/
↑
(
)
>
<
=
如上表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。
“>、<、=”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。
左边的“=”与右边的“(”之间没有优先关系存在,所以表中为空白。
逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。
下面给出了逆波兰表达式生成算法的流程图。
(为了便于比较相邻运算符的优
先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈)。
1.实验内容:
packagecom_text4;
importjava.io.*;
publicclassText4{
publicstaticvoidmain(String[]args)throwsIOException{
inti=0,j=0;
请输入一串中序表达式:
charm[]=newchar[20];
for(into=0;
o<
o++){
m[o]=str.charAt(o);
for(into=str.length();
20;
m[o]='
'
;
charn[]=newchar[m.length];
n.length;
o++)
n[o]='
逆波兰式为:
=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];
}elseif(priority(n[j],m[i])=='
'
j++;
while(j>
0){
if(n[j]=='
n[j]='
i++;
}else{
if(n[0]=='
Error"
if(n[j]!
System.out.print(n[j]);
n[j]='
if(j>
j--;
}
System.out.print(m[i]);
publicstaticcharpriority(charoperator1,charoperator2){
inta=0,b=0;
charoperatorPriorMatrix[][]={{'
>
'
},
{'
='
}};
switch(operator1){
case'
:
a=0;
break;
a=1;
*'
a=2;
/'
a=3;
a=4;
a=5;
switch(operator2){
b=0;
b=1;
b=2;
b=3;
b=4;
b=5;
returnoperatorPriorMatrix[a][b];
publicstaticbooleanisOperator(charoperator){
if(operator=='
||operator=='
||operator=='
returntrue;
else
returnfalse;
2.实验结果: