编 译 原 理
实验报告
实验名称:预测分析法
姓名:
专业班级:
学号:
指导老师:
一、目的要求
2. 加深对预测分析LL(1)分析法的理解和掌握。
二、实验内容
对文法G进行语法分析,文法G如下所示:
*0. S→a */
*1. S→^
*2. S→(T)
*3. T→SW *
*4. W→,SW
*5. W→ε;
并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。
程序输入/输出示例:
输入:一个以 # 结束的符号串:例如:(a,a)#
输出:
步数 分析栈 输入串 所用规则
(1) #S (a,a))# 2
三、源程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[100]; //存储待分析的句子
const char T[ ] = "a^(),#"; //终结符,分析表的列符
const char NT[ ] = "STW"; //非终结符,分析表的行符
/*指向产生式右部符号串*/
const char *p[] = {
/*0. S→a */ "a",
/*1. S→^ */ "^",
/*2. S→(T) */ "(T)",
/*3. T→SW */ "SW",
/*4. W→,SW */ ",SW",
/*5. W→ε; */ ""
};
//设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。
const int M[][6] = {
/* a ^ ( ) , # */
/*S*/ { 0, 1, 2, -1, -1, -1 },
/*T*/ { 3, 3, 3, -1, -1, -1 },
/*W*/ { -1, -1,-1, 5, 4, -1 }
};
void init()//输入待分析的句子
{
printf("请输入待分析的句子(以$结束):\n");
scanf("%s",str);
}
int lin(char c);//非终结符转换为行号
int col(char c);//终结转换为列号
bool isNT(char c);//isNT判断是否是非终结符
bool isT(char c);//isT判断是否是终结符。
void main(void)
{
int i,j=0;
int flag=1,flag2=0;
char A; //设置指示句子的当前字符
char stack[20]= {'#','S'}; //栈赋初值
int top = 1 ; //设置栈顶指针
char X = ' ' ; //存储栈顶字符
init();
A=str[0];
printf("\t步数\t分析栈\t输入串\t所用规则\n"); //在屏幕上输出列表标题
while ( 1 )
{
printf("\n\t(%d)\t",++j); //输出当前执行步数
for ( i = 0 ; i <= top ; i++ ) //输出当前栈的内容(出栈前)
{
printf("%c",stack[i]);
}
printf("\t");
for ( i = flag-1 ; str[i]!='$' ; i++ )
{
printf("%c",str[i]);
}
if(flag2==1)
{
printf("\t%d",M[ lin(X) ][col(A)]);
flag2=0;
}
//出栈
X = stack[top--] ;
if (X=='#')//是结束符
{
if (X==A)//是结束符
{
printf("\tAcc\n");
}
else printf("\tERROR\n");
break;
}
else if (isT(X))//是终结符
{
A=str[flag++];
}
else if (isNT(X))//是否是非终结符
{
flag2=1;
//逆序入栈
for( i = strlen( p[ M[ lin(X) ][col(A)] ] ) - 1; i >= 0; i--)
{
stack[++top] = *(p[M[lin(X)][col(A)]] + i ) ;
}
}
else
{
printf("Error in main()>%c\n",X);
exit(0);
}
}
}
int lin(char c)
{
for(int i = 0; i < (int)strlen(NT); i ++ )
{
if (c == NT[i])
{
return i ;
}
}
printf("Error in lin()>%c\n",c);
exit(0) ;
}
int col(char c)
{
for (int i=0; i<(int)strlen(T); i ++ )
{
if (c == T[i]) return i;
}
printf("Error in col()>%c\n",c);
exit(0);
}
bool isNT(char c) //是否是非终结符
{
for (int i = 0; i < (int)strlen(NT); i ++ )
{
if (c==NT[i])
return true;
}
return false;
}
bool isT(char c) //是否是终结符(不包括'#')
{
for (int i = 0; i < (int)strlen(T) - 1; i ++ )
{
if (c == T[i])
{
return true;
}
}
return false;
}
四、程序运行截图
当输入为 (a,a,a,a)#$ 时
当输入为 (a)#$ 时
经过分析,实验运行的结果与期望的结果相同,故知程序正确。
实验总结
这次的实验让我进一步巩固了以往所学的知识,进一步意思到自己的长处与不足,主要是不足,以后我需要更加女里的学习,争取期末不挂科!!!!
实验名称: 网孔电路分析实验
姓名:赵吉浩???
实验日期:20##-6-4
班级:定2
???
学号:?201201100349
?? ??
合作者:魏言兵
??? ???
提交报告时间:
?
一. 实验目的
1.网孔电路分析法可以使用与复杂的电路分析。
2.比较理论计算结果与实际测量结果证明网孔分析法。在此试验中,我们将通过建立含三个网孔的电路,用网孔法分析电路。
3基尔霍夫电流定律(KCL):
4基尔霍夫电压定律(KVL):
二.实验设备及元件
1. 模拟实验软件:CircuitMaker 5.5
2.实验设备:实验教学板,数字是万用表,可调式15伏直流电源
3.实验原件:470,680,330,1,220电阻,仪表连接线,WG25电路连接线若干(根据实验教学板而定)。
三.实验程序
第一部分
1.模拟以下电路:应用模拟实验软件CircuitMaker 5.5模拟以下网络电路图1——1,测量个支路的电流及个电阻的电压值并且记录数据。
模拟电路
模拟电路
第二部分
实验步骤:
1. 根据电阻条码的读解, 测量电阻R1, R2, R3, R4, R5并且记录将用于电路的电阻
值, 填入表格1-1
2. 在教学实验板上, 建立如图的网孔网络电路电路
3. 接通电压电源之前,使用万用表测量电源电压,调节电源电压使之输出电压达
到电路所需的电压值。
4. 接通电压电源, 注意电源电压的正负极
5. 实际测量每个电阻上的电压降,将测量结果填入表格1-1。
6. 根据测量的电阻值及相应的电压降, 利用欧姆定理计算通过各电阻的电流, 填入
表格1-1, 并且记录电流方向。
7. 关闭或断开电源电压。?
?四. 实验数据分析与处理
表格1-1
五.实验问题解答
1. 使用电路图1-1, 使用所测量的电阻值, 利用网孔电路分析法决定网孔1,2,3的网孔电流 I1, I2, I3。
网孔1:(330+1018)I1-330I2-1018I3-12=0 I1=28.3mA
网孔2:(469+330+674)I2-330I1-674I3=0 解得 I2=15.8mA
:网孔3:(674+222+1018)I3-1018I1-674I2=0 I3=20.6mA
2. 利用网孔电路电流I1, I2, I3,通过代数运算,决定通过每个电阻的电流,同时,记录电流方向,填入表格1-1。
i1=I2=15.8mA i2=I3-I2=4.8mA i3=I1-I2=12.5mA
i4=I1-I3=7.7mA i5=I3=20.6mA
3..验证 基尔霍夫电压定律(KVL):
网孔1:U3+U4-U=0 4.19+7.86-12=0.05V
网孔2:U1-U2-U3=0 7.51-3.29-4.19= 0.03V
网孔3: U2-U4+U5=0 3.29 -7.86+4.60=0.03V
因此可验证KVL成立。
4.验证 基尔霍夫电流定律(KCL):
节点1:I1+I3-I4-I5=0 16.0+12.7-7.7-20.7=0.3mA
节点2:-I1-I2+I5=0 -16.0-4.9+20.7=0.1 mA
节点3:-I3+I2+I4=0 -12.7+4,9+7.7=-0.1mA
节点4:I1+I3-I4-I5=0 16.0+12.7-7.7-20.7=0.3mA
由实验数据在误差范围内可得:KCL成立。
六.实验总结
1.动手能力不足,对面包板不是很了解。自己的动手能力有待提高。
2.英语水平不高,很长时间找不到电阻.电源.电压表等原件。
3.通过对电路的学习,相信会提高我的动手能力。
水泥中MgOCaOAl2O3Fe2O3含量的测定一实验目的1学习复杂物质分析的方法2掌握尿素均匀沉淀法二实验原理本实验采用硅酸盐水…
1亚硝酸钠测定结果标准液质量与吸光度表亚硝酸钠标准液质量000123457510125吸光度0002600430068005701…
研究生实验报告范本实验课程实验名称实验地点学生姓名学号指导教师范本实验时间年月日一实验目的熟悉电阻型气体传感器结构及工作原理进行基…
程序分析第二次实验报告13091372代树理开发环境语言java编译器myeclipse操作系统windowsXP另外使用的ANT…
经济分析方法与手段实验分析报告附件一1陶瓷产量与城镇住宅建筑面积的相关分析散点图2与新增医疗卫生机构面积的关系3与新增办公楼面积的…
实验四用excel进行方差分析的实验报告实验目的学会在计算机上利用excel进行单因素方差分析和有交互的双因素分析以及无交互的双因…
认识实习常用电子仪器使用专业班级姓名学号完成时间20xx年6月实验示波器和信号发生器的使用一实验目的1学习示波器的基本使用方法2学…
管理统计实验报告实验一一实验目的掌握用spss软件对数据进行相关性分析熟悉其操作过程并能分析其结果二实验原理相关性分析是考察两个变…
编译原理实验报告实验名称语法分析实验类型指导教师专业班级姓名学号实验地点实验成绩蒋勇软件1001班李岳东日期20xx年月日一实验目…
实验室间比对和能力验证结果的分析报告质管办为了通过适时开展比对试验和能力验证等质量控制活动对检测质量及其过程的有效性进行监控保证检…