本科实验报告
课程名称:编译原理
实验项目:无符号数的词法分析程序(实验一)基本程序设计(实验二)
实验地点:致远楼303
专业班级:软件14XX 学号:
学生姓名:
指导教师:冯秀芳
2017年6 月27日
一、实验目的和要求
1.培养学生初步掌握编译原理实验的技能。
2.验证所学理论、巩固所学知识并加深理解。
3.对学生进行实验研究的基本训练。
二、实验内容和原理
实验一、无符号数的词法分析程序(4学时)
内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。
要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。
无符号数文法规则可定义如下:
<无符号数>→<无符号实数>│<无符号整数>
<无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│
<无符号整数>E<比例因子>
<比例因子>→<有符号整数>
<有符号整数>→[+│-]<无符号整数>
<无符号整数>→<数字串>
<数字串>→<数字>{<数字>}
<数字>→0 1 2 3 (9)
读无符号数的程序流程图见下图
三.主要仪器设备
PC机+Java语言编程环境
四、实验结果与分析
1.实验代码:
package text1;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Text1 {
/**
* @param args
*/
public static void main(String[] args) throws Exception { // TODO Auto-generated method stub
int p = 0, w = 0, w1 = 0, j = 0, i = 0, d = 0, e = 1;
double w2 = 0;
String str;
System.out.println("请输入一串字符以;结束:");
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
str = buf.readLine();
char m[] = new char[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] >= 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] == '+') {
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;
} else if (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;
}
} else
System.out.println("您输入有误!");
} else if (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;
} 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.实验内容:
package com_text4;
import java.io.*;
public class Text4 {
public static void main(String[] args) throws IOException { // TODO Auto-generated method stub
int i = 0, j = 0;
String str;
System.out.println("请输入一串中序表达式:");
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
str = buf.readLine();
char m[] = new char[20];
for (int o = 0; o < str.length(); o++) {
m[o] = str.charAt(o);
}
for (int o = str.length(); o < 20; o++) {
m[o] = ' ';
}
char n[] = new char[m.length];
for (int o = 0; o < n.length; 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;
}
} else if (isOperator(m[i])) {
while (isOperator(m[i])) {
if (n[j] == ' ') {
n[j] = m[i];
i++;
} else if (priority(n[j],m[i] ) == '<') {
j++;
n[j] = m[i];
i++;
} else if (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++;
}
}
}
public static char priority(char operator1, char operator2) { int a = 0, b = 0;
char operatorPriorMatrix[][] = { { '>', '>', '<', '<', '<', '>' }, { '>', '>', '<', '<', '<', '>' },
{ '>', '>', '>', '>', '<', '>' },
{ '>', '>', '>', '>', '<', '>' },
{ '<', '<', '<', '<', '<', '=' },
{ '>', '>', '>', '>', ' ', '>' } };
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;
}
return operatorPriorMatrix[a][b];
}
public static boolean isOperator(char operator) {
if (operator == '+' || operator == '-' || operator == '*'
|| operator == '/' || operator == '(' || operator == ')') return true;
else
return false;
}
}
2.实验结果:
6、JavaWeb 中()类的()方法用于创建对话。 A. HttpServletRequest、getSession B. HttpServletResponse、newSession C. HtttpSession、newInstance D. HttpSession、getSession 7、给定一个Servlet 的doGet方法中的代码片段,如下: request.setAttribute(“name”,”zhang”); response.sendRedirect(“http://localhost:8080/servlet/MyServlt”); 那么在Servlet 中可以使用()方法把属性name的值取出来。 A. String str=request.getAttribute(“name”); B. String str=(String)request.getAttribute(“name”); C. Object str=request.getAttribute(“name”); D. 无法取出来 8、下边哪个不是JSP的内置对象?() A. session B. request C. cookie D. out 9、关于get和post两种请求,下列说法正确的是?() A. Form表单默认请求是get请求。 B. get请求处理的数据量大小不受到限制。 C. post请求地址栏里是能看到数据的,所以传送用户信息尽量避免使用。 D. post请求可以由doGet方法处理。 10、下面哪一个是正确使用JavaBean的方式?() A.
东南大学一九九三年攻读硕士学位研究生入学考试试题 试题编号:553 试题名称:编译原理 一:(15分)判断下列命题的真假,并简述理由: 1.文法G的一个句子对应于多个推导,则G是二义的. 2.LL(1)分析必须对原有文法提取左因子和消除左递归. 3.算符优先分析法采用"移近-归约"技术,其归约过程是规范的. 4.文法S→aA;A→Ab;A→b是LR(0)文法(S为文法的开始符号). 5.一个BASIC解释程序和编译程序的不同在于,解释程序由语法制导翻译成目标代码并立即执行之,而编译程序需产生中间代码及优化. 二:(15分)设计一个最小状态有穷自动机,识别由下列子串组成的任意字符串. GO,GOTO,TOO,ON 例如:GOTOONGOTOOGOON是合法字符串. 三:(15分)构造一个LL(1)文法G,识别语言L: L={ω|ω为{0,1}上不包括两个相邻的1的非空串} 并证明你的结论. 四:(20分)设有一台单累加器计算机,并汇编语言含有通常的汇编指令LOAD,STORE,ADD和MUL. 1.写一个递归下降分析程序,将如下文法所定义的赋值语句翻译成汇编语言: A→i:=E E→E+E|E*E|(E)|i 2.利用加,乘法满足交换率这一性质,改进你的分析程序,以期产生比较高效的目标代码. 五:(15分)C为大家熟知的程序语言. 1.C的参数传递采用传值的方式,而且允许函数定义和调用时的参数个数不一致(如printf).请指出其函数调用语句: f(arg1,arg2,...,argn) 翻译成的中间代码序列,并简述其含义. 2.C语言中的变量具有不同的作用范围,试述C应采用的存储分配策略. 六:(20分)设有一个子程序的四元式序列为: (1) I:=1 (2) if I>20 GOTO (16) (3) T1:=2*J (4) T2:=20*I (5) T3:=T1+T2 (6) T4:=addr(A)-22 (7) T5:=2*I (8) T6:=T5*20 (9) T7:=2*J (10) T8:=T6+T7 (11) T9:=addr(A)-22 (12) T10:=T9[T8] (13) T4[T3]:=T10+J
本科实验报告 课程名称:计算机网络B 实验地点:行勉楼 专业班级:学号 学生姓名: 指导教师: 实验成绩: 2016年 6 月 14 日
实验3 VLAN基本配置 一、实验目的 掌握交换机上创建VLAN、分配静态VLAN成员的方法。 二、实验任务 1、配置两个VLAN:VLAN 2和VLAN 3并为其分配静态成员。 2、测试VLAN分配结果。 三、实验设备 Cisco交换机一台,工作站PC四台,直连网线四条,控制台电缆一条。 四、拓扑结构 五、实验结果 PC0到PC1 想通 PC0到PC2 不通,不在相同VLAN PC2到PC3 不通,网段不同。 Switch#sh run Building configuration... Current configuration : 1127 bytes ! version 12.1 no service timestamps log datetime msec no service timestamps debug datetime msec no service password-encryption ! hostname Switch ! ! spanning-tree mode pvst ! interface FastEthernet0/1
! interface FastEthernet0/2 switchport access vlan 2 ! interface FastEthernet0/3 switchport access vlan 2 ! interface FastEthernet0/4 switchport access vlan 2 ! interface FastEthernet0/5 switchport access vlan 3 ! interface FastEthernet0/6 switchport access vlan 3 ! interface FastEthernet0/7 switchport access vlan 3 ! 六、实验心得 输入容易出现错误。重复输入次数多。
本科实验报告 课程名称:计算机网络B 实验地点:行勉楼 专业班级:学号 学生姓名: 指导教师: 实验成绩: 2016年 6 月14 日
实验3 VLAN基本配置 一、实验目的 掌握交换机上创建VLAN、分配静态VLAN成员的方法。 二、实验任务 1、配置两个VLAN:VLAN 2和VLAN 3并为其分配静态成员。 2、测试VLAN分配结果。 三、实验设备 Cisco交换机一台,工作站PC四台,直连网线四条,控制台电缆一条。 四、拓扑结构 五、实验结果 PC0到PC1 想通 PC0到PC2 不通,不在相同VLAN PC2到PC3 不通,网段不同。 Switch#sh run Building configuration... Current configuration : 1127 bytes ! version 12.1 no service timestamps log datetime msec no service timestamps debug datetime msec no service password-encryption ! hostname Switch ! ! spanning-tree mode pvst ! interface FastEthernet0/1
! interface FastEthernet0/2 switchport access vlan 2 ! interface FastEthernet0/3 switchport access vlan 2 ! interface FastEthernet0/4 switchport access vlan 2 ! interface FastEthernet0/5 switchport access vlan 3 ! interface FastEthernet0/6 switchport access vlan 3 ! interface FastEthernet0/7 switchport access vlan 3 ! 六、实验心得 输入容易出现错误。重复输入次数多。
《遥感原理与应用》实验指导书 矿业工程学院 测绘科学与技术系
实验一、遥感图像几何校正(2学时)实验二、遥感图像辐射增强(2学时)实验三、遥感图像非监督分类(2学时)
实验一、遥感图像几何校正(2学时)
原理与方法简介遥感影像由于遥感平台位置和运动状态变化、地形起伏、地球表面曲率、大气折射、地球自转等诸多因素的影响而产生与地面目标位置和(或)形状方面的不相一致的几何畸变,通过一定的数学算法,使这种畸变消除或接近消除,这就是几何校正。常用的几何校正计算方法主要有以下三种: 1)邻域法(Nearest neighbor )——将最接近的像元值赋予输出像元(图1.1); Figure1.1Nearest Neighbor 邻域法优点:极值和一些细节不会丢失,对植被分类、查找具线性特征的边界或侦测湖水的混浊度和温度是重要的。该方法适用于分类之前,计算速度快,适合于具有定性和定量特点的专题图像研究。 其缺点是:从较大的栅格重采样到较小栅格时会出现阶梯状斜线;可能会丢失或重复一些数值;用于线形专题图(如道路、水系)可能引起线状网络数据断开或出现裂隙。 2)双线性内插法(bilinear interpolation )——利用二次样条函数计算2×2窗口中的4个像元值并赋予输出像元(图1.2)。 Figure1.2Bilinear Interpolation 113V dy D V V V m +?-= 224V dy V V Vn +?-=
m m n V dx D V V Vr +?-=或:i i i i i i i r V D y D x D V W V ??-?-==∑∑==41241))((W i ——权重因子 Δx i ,Δy i ——r 点与i 点的坐标变化 V i ——i 像元值 双线性内插法的优点是:图像较平滑,不会出现阶梯现象,空间精度较高,常用于需要改变像元大小的场合,如SPOT/TM 的融合。 其缺点是:由于像元作过平均计算,相当于低通滤波(Low-frequency convolution )的效果,边界平滑,某些极值会丢失。 3)立方卷积内插法(Cubic convolution )——利用三次函数计算4×4窗口中的像素值并赋予输出像素(图1.3) 。 Figure 1.3Cubic Convolution 类似于双线性内插,只是所用窗口为4*4,而非2*2,即对16个像元作平均运算而得出输出像元的数据文件值。 ]} 2)2,2([*)2,2(]1)2,1([*)2,1()]2,([*)2,(]1)2,1([*)2,1({4 1--++-+++ --++-+++ -+-++ +-+--+-=∑=n j i d f n j i V n j i d f n j i V n j i d f n j i V n j i d f n j i V V i r 其中:i=int(x r ),j=int(y r ) d(i ,j)——(i ,j)和(x r ,y r )坐标距离 V(i ,j)——(i ,j)像元值 V r ——输出像元数据文件值
词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","
const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。
西安科技大学《JAVAEE框架开发技术》 实验报告 学院:计算机科学与技术学院 专业及班级:软件工程1202班 学号: 12 姓名:_ 黄子斌
2015年12 目录 实验一 struts基础实验........................................错误!未定义书签。 1. 实验类型..............................................错误!未定义书签。 2. 实验目的..............................................错误!未定义书签。 3. 实验要求..............................................错误!未定义书签。 4. 实验内容..............................................错误!未定义书签。 1. 文件的配..........................................错误!未定义书签。 2. 文件配置..........................................错误!未定义书签。 3. Action的实现.....................................错误!未定义书签。 4. 运行结果..........................................错误!未定义书签。实验二持久化层hibernate .....................................错误!未定义书签。 1. 实验类型..............................................错误!未定义书签。 2. 实验目的..............................................错误!未定义书签。 3. 实验要求..............................................错误!未定义书签。 4. 实验内容..............................................错误!未定义书签。 1. 文件配置..........................................错误!未定义书签。 2. 实体类和映射文件..................................错误!未定义书签。 3. 运行结果..........................................错误!未定义书签。实验三 SSM整合实验...........................................错误!未定义书签。 1. 实验类型..............................................错误!未定义书签。 2. 实验目的..............................................错误!未定义书签。 3. 实验要求..............................................错误!未定义书签。 4. 实验内容..............................................错误!未定义书签。 1. 文件配置..........................................错误!未定义书签。 2. 文件配置.........................................错误!未定义书签。
本科实验报告 课程名称:Web开发实用技术基础 实验项目:HTML语言 网页程序设计Javascript Request与Response对象的应用 Application与Session对象的应用 实验地点:实验室211 专业班级:学号: 学生姓名: 指导教师: 2015年11月5日
学院名称学号实验成绩 学生姓名专业班级实验日期 课程名称Web开发实用技术基础实验题目HTML语言 一.实验目的和要求 1.掌握常用的HTML语言标记; 2.利用文本编辑器建立HTML文档,制作简单网页。 3.独立完成实验。 4.书写实验报告书。 二.实验内容 1.在文本编辑器“记事本”中输入如下的HTML代码程序,以文件名sy1.html保存,并在浏览器中运行。(请仔细阅读下列程序语句,理解每条语句的作用) 源程序清单如下:
item | content |
---|