太原理工大学编译原理实验.docx

上传人:b****7 文档编号:16213324 上传时间:2023-07-11 格式:DOCX 页数:19 大小:157.67KB
下载 相关 举报
太原理工大学编译原理实验.docx_第1页
第1页 / 共19页
太原理工大学编译原理实验.docx_第2页
第2页 / 共19页
太原理工大学编译原理实验.docx_第3页
第3页 / 共19页
太原理工大学编译原理实验.docx_第4页
第4页 / 共19页
太原理工大学编译原理实验.docx_第5页
第5页 / 共19页
太原理工大学编译原理实验.docx_第6页
第6页 / 共19页
太原理工大学编译原理实验.docx_第7页
第7页 / 共19页
太原理工大学编译原理实验.docx_第8页
第8页 / 共19页
太原理工大学编译原理实验.docx_第9页
第9页 / 共19页
太原理工大学编译原理实验.docx_第10页
第10页 / 共19页
太原理工大学编译原理实验.docx_第11页
第11页 / 共19页
太原理工大学编译原理实验.docx_第12页
第12页 / 共19页
太原理工大学编译原理实验.docx_第13页
第13页 / 共19页
太原理工大学编译原理实验.docx_第14页
第14页 / 共19页
太原理工大学编译原理实验.docx_第15页
第15页 / 共19页
太原理工大学编译原理实验.docx_第16页
第16页 / 共19页
太原理工大学编译原理实验.docx_第17页
第17页 / 共19页
太原理工大学编译原理实验.docx_第18页
第18页 / 共19页
太原理工大学编译原理实验.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

太原理工大学编译原理实验.docx

《太原理工大学编译原理实验.docx》由会员分享,可在线阅读,更多相关《太原理工大学编译原理实验.docx(19页珍藏版)》请在冰点文库上搜索。

太原理工大学编译原理实验.docx

太原理工大学编译原理实验

 

本科实验报告

 

课程名称:

编译原理

实验项目:

无符号数的词法分析程序(实验一)

实验地点:

计算机学院软件实验室

专业班级:

学号:

学生姓名:

指导教师:

冯秀芳

2013年11月16日

一、实验目的和要求

1.培养学生初步掌握编译原理实验的技能。

2.验证所学理论、巩固所学知识并加深理解。

3.对学生进行实验研究的基本训练。

二、实验内容和原理

实验一、无符号数的词法分析程序(4学时)

内容:

掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。

要求:

从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。

无符号数文法规则可定义如下:

<无符号数>→<无符号实数>│<无符号整数>

<无符号实数>→<无符号整数>.<数字串>[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

m[i]=str.charAt(i);

}

i=0;

while(i

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.实验结果:

 

本科实验报告

 

课程名称:

编译原理

实验项目:

基本程序设计(实验二)

实验地点:

计算机学院606实验室

专业班级:

计Z1101学号:

2011001491

学生姓名:

李康达

指导教师:

段利国

2013年11月23日

一、实验目的和要求

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;o

m[o]=str.charAt(o);

}

for(into=str.length();o<20;o++){

m[o]='';

}

charn[]=newchar[m.length];

for(into=0;o

n[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.实验结果:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2