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