文档库 最新最全的文档下载
当前位置:文档库 › 语法分析器实验报告

语法分析器实验报告

语法分析器实验报告
语法分析器实验报告

语法分析器的设计实验报告

一、实验内容

语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法:

G[E]:

E->E+T|T

T->T*F|F

F->i|(E)

分析句子i+i*i是否符合文法。

二、基本思想

1、语法分析器实现

语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。

语法分析程序的流程图如图5-4所示。

语法分析程序流程图

该程序可分为如下几步:

(1)读入文法

(2)判断正误

(3)若无误,判断是否为LL(1)文法

(4)若是,构造分析表;

(5)由句型判别算法判断输入符号串是为该文法的句型。

三、核心思想

该分析程序有15部分组成:

(1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中;

(3)读入一个文法;

(4)将单个符号或符号串并入另一符号串;

(5)求所有能直接推出&的符号;

(6)求某一符号能否推出‘& ’;

(7)判断读入的文法是否正确;

(8)求单个符号的FIRST;

(9)求各产生式右部的FIRST;

(10)求各产生式左部的FOLLOW;

(11)判断读入文法是否为一个LL(1)文法;

(12)构造分析表M;

(13)句型判别算法;

(14)一个用户调用函数;

(15)主函数;

下面是其中几部分程序段的算法思想:

1、求能推出空的非终结符集

Ⅰ、实例中求直接推出空的empty集的算法描述如下:

void emp(char c){ 参数c为空符号

char temp[10];定义临时数组

int i;

for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找

{

if 产生式右部第一个符号是空符号并且右部长度为1,

then将该条产生式左部符号保存在临时数组temp中

将临时数组中的元素合并到记录可推出&符号的数组empty中。

}

Ⅱ、求某一符号能否推出'&'

int _emp(char c)

{ //若能推出&,返回1;否则,返回0

int i,j,k,result=1,mark=0;

char temp[20];

temp[0]=c;

temp[1]='\0';

存放到一个临时数组empt里,标识此字符已查找其是否可推出空字

如果c在可直接推出空字的empty[]中,返回1

for(i=0;;i++)

{

if(i==count)

return(0);

找一个左部为c的产生式

j=strlen(right[i]); //j为c所在产生式右部的长度

if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空)

if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符)

else

{

for(k=0;k<=j-1;k++)

{

查找临时数组empt[].并标记mark-=1(A->AB)

if 找到的字符与当前字符相同(A->AB)

结束本次循环

else(mark等于0)

查找右部符号是否可推出空字,把返回值赋给result

把当前符号加入到临时数组empt[]里.

}

if 当前字符不能推出空字且还没搜索完全部的产生式

then 跳出本次循环继续搜索下一条产生式

else if //当前字符可推出空字,返回1

}

}

}

2、计算每个符号的first集:

实例中求单个符号的FIRST集的算法描述如下:

void first2 (int i) {

参数i为符号在所有输入符号中的序号

c等于指示器i所指向的符号

在保存终结符元素的termin[]数组查找c

if c为终结符(c∈V T ),then

FIRST(c)={c}

在保存终结符元素的non_ter[]数组查找c

if c是非终结符(c∈V N )

在所有产生式中查找c所在的产生式

if 产生式右部第一个字符为终结符或空(即c→a (a∈V T)或c→&) then

把a或&加进FIRST(c)

if 产生式右部第一个字符为非终结符then

if 产生式右部的第一个符号等于当前字符then

跳到下一条产生式进行查找

求当前非终结符在所有字符集中的位置

if 当前非终结符还没求其FIRST集then

查找它的FIRST集并标识此符号已求其FIRST集

求得结果并入到c的FIRST集.

if 当前产生式右部符号可推出空字且当前字符不是右部的最后一个字符then

获取右部符号下一个字符在所有字符集中的位置

if 此字符的FIRST集还未查找then

找其FIRST集,并标其查找状态为1

把求得的FIRST集并入到c的FIRST集.

if当前右部符号串可推出空且是右部符号串的最后一个字符(即产生式为c→Y1Y2…Y k,若对一切1<=i<=k,均有&∈FIRST(Y i),则将&∈符号加进FIRST(c) )

then

把空字加入到当前字符c的FIRST集.

else

不能推出空字则结束循环

标识当前字符c已查找其FIRST集. }

3. 计算FOLLOW集

FOLLOW集的构造可用如下方法来求:

对于文法中的符号X ∈V N ,其FOLLOW(A)集合可反复应用下列规则计算,直到FOLLOW(A)集合不再增大为止。

(1)对于文法开始符号S,因为S S,故#∈FOLLOW(S);

(2)若A→α Bβ,其中B∈V N,α∈(V T V N)*、β∈(V T V N)+,则

FIRST(β)-{ε}∈FOLLOW(B);

(3)若A→α B或A→α Bβ (β ε),则

FOLLOW(A) ∈FOLLOW(B)。

FOLLOW集的算法描述如下:

void FOLLOW(int i)

X为待求的非终结符

把当前字符放到一临时数组foll[]中,标识求已求其FOLLOW集.避免循环递归

if X为开始符号then #∈FOLLOW(X)

对全部的产生式找一个右部含有当前字符X的产生式

注:比如求FOLLOW(B)则找A→αX或A→αXβ(βε)的产生式

if X在产生式右部的最后(形如产生式A→αX) then

查找非终结符A是否已经求过其FOLLOW集.避免循环递归

if 非终结符A已求过其FOLLOW集then

FOLLOW(A)∈FOLLOW(X)

继续查下一条产生式是否含有X

else

求A之FOLLOW集,并标识为A已求其FOLLOW集

else if X不在产生式右部的最后(形如A→αBβ) then

if右部X后面的符号串β能推出空字ε then

查找β是否已经求过其FOLLOW集.避免循环递归

if 已求过β的FOLLOW集then

FOLLOW(A)∈FOLLOW(B)

结束本次循环

else if β不能推出空字then

求FIRST(β)

把FIRST(β)中所有非空元素加入到FOLLOW(B)中

标识当前要求的非终结符X的FOLLOW集已求过

4.计算SELECT集

SELECT集的构造算法如下:

对所有的规则产生式A→x:

(1)若x不能推出空字ε,则SELECT(A→x) = FIRST(x);

(2)若x可推出空字ε,则SELECT(A→x)=FIRST(x)–{ε} FOLLOW(A)。

算法描述如下:

for(i=0;i<=产生式总数-1;i++)

先把当前产生式右部的FIRST集(一切非空元素,不包括ε)放入到当前产生式的

SELECT(i);

if 产生式右部符号串可推出空字εthen

把i指向的当前产生式左部的非终结符号的FOLLOW集并入到SELECT(i)中

5.判断是否LL(1)文法

要判断是否为LL(1)文法,需要输入的文法G有如下要求:

具有相同左部的规则的SELECT集两两不相交,即:

SELECT(A→α)∩ SELECT(A→β)= ?

如果输入的文法都符合以上的要求,则该文法可以用LL(1)方法分析。

算法描述如下:

把第一条产生式的SELECT(0)集放到一个临时数组temp[]中

for(i=1;i<=产生式总数-1;i++)

求temp的长度length

if i指向的当前产生式的左部等于上一条产生式的左部then

把SELECT(i)并入到temp数组中

If temp的长度小于length加上SELECT (i)的长度

返回0

else

把temp清空

把SELECT (i)存放到temp中

结果返回1;

四、算法

#include

#include

#include

/*******************************************/

int count=0; //产生式的个数

int number; //所有终结符和非终结符的总数

char start; //开始符号

char termin[50]; //终结符号

char non_ter[50]; //非终结符号

char v[50]; //所有符号

char left[50]; //左部

char right[50][50]; //右部

char first[50][50],follow[50][50]; //各产生式右部的FIRST和左部的FOLLOW集合char first1[50][50]; //所有单个符号的FIRST集合

char select[50][50]; //各个产生式的SELECT集合

char firstflag[50],followflag[50]; //记录各符号的FIRST和FOLLOW是否已求过char empty[20]; //记录可推出&的符号

char nonempty[20]; //记录不可推出&的符号

char empt[20]; //求_emp()时使用

char TEMP[50]; //求FOLLOW时存放某一符号串的FIRST集合

int validity=1; //表示输入文法是否有效

int ll=1; //表示输入文法是否为LL(1)文法

int M[20][20]; //分析表

char choose; //用户输入时使用

char foll[20]; //求FOLLOW集合时使用

/*******************************************

判断一个字符c是否在指定字符串p中

********************************************/

int in(char c,char *p)

{

int i;

if(strlen(p)==0)

return(0);

for(i=0;;i++)

{

if(p[i]==c)

return(1); //若在,返回1

if(i==(int)strlen(p))

return(0); //若不在,返回0

}

}

/*******************************************

将单个符号或符号串并入另一符号串

********************************************/

void merge(char *d,char *s,int type)

{ //是目标符号串,s是源串,type=1,源串中的'&'一并并入目串;

//type=2,源串中的'&'不并入目串

int i,j;

for(i=0;i<=(int)strlen(s)-1;i++)

{

if(type==2&&s[i]=='&');

else

{

for(j=0;;j++)

{

if(j<(int)strlen(d)&&s[i]==d[j])

break; //若已存在,则退出,继续看下一个源串字符

if(j==(int)strlen(d)) //若不存在,则并入

{

d[j]=s[i];

d[j+1]='\0';

break;

}

}

}

}

}

/*******************************************

读入一个文法

********************************************/

char grammer(char *t,char *n,char *left,char right[50][50])

{

char vn[50],vt[50];

char s;

char p[50][50];

int i,j;

printf("请输入文法的非终结符号串:");

scanf("%s",vn);

getchar();

i=strlen(vn);

memcpy(n,vn,i);

n[i]='\0';

printf("请输入文法的终结符号串:");

scanf("%s",vt);

getchar();

i=strlen(vt);

memcpy(t,vt,i);

t[i]='\0';

printf("请输入文法的开始符号:");

scanf("%c",&s);

getchar();

printf("请输入文法产生式的条数:");

scanf("%d",&i);

getchar();

count=i;

for(j=1;j<=i;j++)

{

printf("请输入文法的第%d条(共%d条)产生式:",j,i);

scanf("%s",p[j-1]);

getchar();

}

for(j=0;j<=i-1;j++)

if(p[j][1]!='-'||p[j][2]!='>') //检测输入错误

{

printf("\n输入错误!");

validity=0;

return('\0');

}

}

return(s);

}

/*******************************************

判断读入的文法是否正确

********************************************/

int judge()

{

int i,j;

for(i=0;i<=count-1;i++)

{

if(in(left[i],non_ter)==0)

{ //若左部不在非终结符中,报错

printf("\n文法左部出错!");

validity=0;

return(0);

}

for(j=0;j<=(int)strlen(right[i])-1;j++)

{

if(in(right[i][j],non_ter)==0&&in(right[i][j],termin)==0&&right[i][j]!='&')

{ //若右部某一符号不在非终结符、终结符中且不为'&',报错printf("\n文法右部出错!");

validity=0;

return(0);

}

}

}

return(1);

}

/*******************************************

求所有能直接推出&的符号

********************************************/

void emp(char c)

{

char temp[10];

for(i=0;i<=count-1;i++)

{

if(right[i][0]==c&&strlen(right[i])==1)

{

temp[0]=left[i];

temp[1]='\0';

merge(empty,temp,1);//求所有能直接推出'&"的符号,结果保存到empty[]中

emp(left[i]);

}

}

}

/*******************************************

求某一符号能否推出'&'

********************************************/

int _emp(char c)

{ //若能推出&,返回1;否则,返回0

int i,j,k,result=1,mark=0;

char temp[20];

temp[0]=c;

temp[1]='\0';

merge(empt,temp,1);//存放到一个临时数组empt里,标识此字符已查找其是否可推出空字if(in(c,empty)==1)//如果c在可直接推出空字的empty[]中,返回1

return(1);

for(i=0;;i++)

{

if(i==count)

return(0);

if(left[i]==c) //找一个左部为c的产生式

{

j=strlen(right[i]); //j为c所在产生式右部的长度

if(j==1&&in(right[i][0],empty)==1)//右部长度为1且右部第一个字符在empty[]中.返回1(A->B,B可推出空)

return(1);

else if(j==1&&in(right[i][0],termin)==1)//右部长度为1但第一个字符为终结符,返回0(A->a,a为终结符)

continue;

else

{

for(k=0;k<=j-1;k++)

{

if(in(right[i][k],empt)==1)//查找临时数组empt[].(A->AB)

mark=1;

}

if(mark==1) //找到的字符与当前字符相同(A->AB)

continue; //结束本次循环

else //(mark等于0)

{

for(k=0;k<=j-1;k++)

{

result*=_emp(right[i][k]);//递归调用,查找右部符号是否可推出空字,把返回值赋给result

temp[0]=right[i][k];

temp[1]='\0';

merge(empt,temp,1);//把当前符号加入到临时数组empt[]里,标记已查找

}

}

}

if(result==0&&i

continue;

else if(result==1&&i

return(1);

}

}

}

/*******************************************

求单个符号的FIRST

********************************************/

void first2(int i)

{ //i为符号在所有输入符号中的序号

char c,temp[20];

int j,k,m;

char ch='&';

c=v[i];

emp(ch);//求所有能直接推出空字的符号,结果保存到empty[]中

if(in(c,termin)==1) //若为终结符--c∈VT,则FIRST(c)={c}

{

first1[i][0]=c;

first1[i][1]='\0';

}

else if(in(c,non_ter)==1) //若为非终结符

{

for(j=0;j<=count-1;j++) //j为所有产生式中的序列

{

if(left[j]==c) //找一个左部为c的产生式

{

if(in(right[j][0],termin)==1||right[j][0]=='&')

{//若产生式右部第一个字符为终结符或空.---产生式X→a (a∈VT)或X→&,则把a或&加进FIRST(X)

temp[0]=right[j][0];

temp[1]='\0';

merge(first1[i],temp,1);

}

//------X→Y1Y2…Yk的产生式,若Y1∈VN,则把FIRST(Y1)中的一切非空符号加进FIRST(X)

else if(in(right[j][0],non_ter)==1)//产生式右部第一个字符为非终结符

{

if(right[j][0]==c)//产生式右部的第一个符号等于当前字符,则跳到下一条产生式进行查找

continue;

for(k=0;;k++)

{

if(v[k]==right[j][0])//求右部第一个字符在所有字符集中的位置k

break;

}

if(firstflag[k]=='0')

{

first2(k);//求其FIRST集

firstflag[k]='1';//标识其为查找状态

}

merge(first1[i],first1[k],2);//求得结果并入到X的FIRST集.

for(k=0;k<(int)strlen(right[j]);k++)

{

empt[0]='\0';//存放到一个临时数组里,标识此字符已查找其是否可推出空字

if(_emp(right[j][k])==1&&k<(int)strlen(right[j])-1)

{//当前产生式右部符号可推出空字,且当前字符不是右部的最后一个字符

for(m=0;;m++)

{

if(v[m]==right[j][k+1])//获取右部符号下一个字符在所有字符集中的位置

break;

}

if(firstflag[m]=='0')//如果此字符的FIRST集还未查找,则找其FIRST集,并标其查找状态为1

{

first2(m);

firstflag[m]='1';

}

merge(first1[i],first1[m],2);//把求得结果并入到X的FIRST 集.

}

//----产生式为X→Y1Y2…Yk,若对一切1<=i<=k,均有&∈FIRST(Yi),则将&∈符号加进FIRST(X)

else if(_emp(right[j][k])==1&&k==(int)strlen(right[j])-1)

{//当前右部符号串可推出空且是右部符号串的最后一个字符

temp[0]='&';

temp[1]='\0';

merge(first1[i],temp,1);//把空字加入到当前字符X的FIRST 集.

}

else

break;//不能推出空字则结束循环

}

}

}

}

}

firstflag[i]='1';//标识当前字符c已查找其FIRST集

}

/*******************************************

求各产生式右部的FIRST

********************************************/

void FIRST(int i,char *p)

{ //指针p指向右部符号串

int length;//标识右部符号串的长度

int j,k,m;

char temp[20];

length=strlen(p);

if(length==1) //如果右部为单个符号

{

if(p[0]=='&')//右部符号串字符为"&"空字

{

if(i>=0)//i不为-1时是产生式的序号

{

first[i][0]='&'; //把"&"加入到当前符号串的FIRST集

first[i][1]='\0';

}

else//i为-1时,表示求FOLLOW时用到的产生式右部的FIRST集,保存在TEMP[]中

{

TEMP[0]='&';

TEMP[1]='\0';

}

}

else//右部符号串字符不为"&"空字

{

for(j=0;;j++)

{

if(v[j]==p[0])//求右部符号的第一个字符p[0]在所有字符集中的位置j

break;

}

if(i>=0)

{

memcpy(first[i],first1[j],strlen(first1[j]));//把j所指向的单个符号的FIRST 集拷贝到该右部符号串的FIRST集

first[i][strlen(first1[j])]='\0';

}

else

{

memcpy(TEMP,first1[j],strlen(first1[j]));

TEMP[strlen(first1[j])]='\0';

}

}

}

else //如果右部为符号串

{

for(j=0;;j++)

{

if(v[j]==p[0])//求右部符号的第一个字符p[0]在所有字符集中的位置j

break;

}

if(i>=0)

merge(first[i],first1[j],2);

else

merge(TEMP,first1[j],2);

for(k=0;k<=length-1;k++)

{

empt[0]='\0';

if(_emp(p[k])==1&&k

{ //当前产生式右部符号可推出空字,且当前字符不是右部的最后一个字符for(m=0;;m++)

{

if(v[m]==right[i][k+1])

break;

}

if(i>=0)

merge(first[i],first1[m],2);

else

merge(TEMP,first1[m],2);

}

else if(_emp(p[k])==1&&k==length-1)

{//当前右部符号串可推出空且是右部符号串的最后一个字符

temp[0]='&';

temp[1]='\0';

if(i>=0)

merge(first[i],temp,1);

else

merge(TEMP,temp,1);

}

else if(_emp(p[k])==0)

break;

}

}

}

/*******************************************

求各产生式左部的FOLLOW

********************************************/

void FOLLOW(int i)

{ //参数i为该符号在非终结符中的位置

int j,k,m,n,result=1;

char c,temp[20];

c=non_ter[i]; //c为待求的非终结符

temp[0]=c;

temp[1]='\0';

merge(foll,temp,1);//把当前字符放到一临时数组foll[]中,标识求已求其FOLLOW集.避免循环递归

if(c==start)

{ //若为开始符号-----开始符号S,则#∈FOLLOW(S) temp[0]='#';

temp[1]='\0';

merge(follow[i],temp,1);

}

for(j=0;j<=count-1;j++)

{

if(in(c,right[j])==1) //找一个右部含有当前字符c的产生式

{//比如求FOLLOW(B)则找A→αB或A→αBβ(β=>*&)的产生式

for(k=0;;k++)

{

if(right[j][k]==c)

break; //k为c在该产生式右部的序号,如B在产生式A→αB 中的位置

}

for(m=0;;m++)

{

if(v[m]==left[j])

break; //m为产生式左部非终结符在所有符号中的序号}

//如果c在产生式右部的最后,形如产生式A→αB,则FOLLOW(A)∈FOLLOW(B)

if(k==(int)strlen(right[j])-1)

{

if(in(v[m],foll)==1)//查找该非终结符是否已经求过其FOLLOW集.避免循环递归

{//是则FOLLOW(A)∈FOLLOW(B)

merge(follow[i],follow[m],1);//把c所在产生式的左部非终结符的FOLLOW集加入到FOLLOW(c)中

continue;//结束本次循环,进入j++循环

}

if(followflag[m]=='0')

{//如果该非终结符的FOLLOW未求过

FOLLOW(m);//求之FOLLOW集

followflag[m]='1';//标识为1

}

merge(follow[i],follow[m],1);//FOLLOW(A)∈FOLLOW(B)

}

else

{ //如果c不在产生式右部的最后,形如A→αBβ

for(n=k+1;n<=(int)strlen(right[j])-1;n++)

{

empt[0]='\0';//把empt[]置空,因为求此字符是否可推出空字_emp(c)时用到

result*=_emp(right[j][n]);

}

if(result==1)

{ //如果右部c后面的符号串能推出空,A→αBβ(β=>*&)则FOLLOW(A)∈FOLLOW(B)

if(in(v[m],foll)==1)

{ //查找该非终结符是否已经求过其FOLLOW集.避免循环递归

merge(follow[i],follow[m],1);//FOLLOW(A)∈FOLLOW(B)

continue;

}

if(followflag[m]=='0')

{

FOLLOW(m);

followflag[m]='1';

}

merge(follow[i],follow[m],1);

}

//若A→αBβ,其中B∈VN,α∈(VT U VN)*、β∈(VT U VN)+,则FIRST(β)-{ε}∈FOLLOW(B);

for(n=k+1;n<=(int)strlen(right[j])-1;n++)

{

temp[n-k-1]=right[j][n];

}

temp[strlen(right[j])-k-1]='\0';

FIRST(-1,temp);//求FIRST(β)

merge(follow[i],TEMP,2);//把FIRST(β)中所有非空元素加入到FOLLOW(B)中

}

}

}

followflag[i]='1';//标识当前要求的非终结符的FOLLOW集已求过

}

/*******************************************

判断读入文法是否为一个LL(1)文法

********************************************/

int LL1()

{

int i,j,length,result=1;

char temp[50];

for(j=0;j<=49;j++)

{ //初始化

first[j][0]='\0';

follow[j][0]='\0';

first1[j][0]='\0';

select[j][0]='\0';

TEMP[j]='\0';

temp[j]='\0';

firstflag[j]='0';//用来记录该字符的FIRST集是否已求过.1表示已求,0表示未求

followflag[j]='0';//用来记录该字符的FOLLOW集是否已求过.1表示已求,0表示未求}

for(j=0;j<=(int)strlen(v)-1;j++)

{

first2(j); //求单个符号的FIRST集合,结果保存在first1[]里

}

printf("\n各非终结符推出的first集:\n");

for(j=0;j<=(int)strlen(v)-1;j++)

{

printf("%c:%s ",v[j],first1[j]);

}

printf("\n能导空的非终结符集合:%s",empty);

printf("\n_emp:");

for(j=0;j<=(int)strlen(v)-1;j++)

printf("%d ",_emp(v[j]));

for(i=0;i<=count-1;i++)

FIRST(i,right[i]); //求FIRST

for(j=0;j<=(int)strlen(non_ter)-1;j++)

{ //求FOLLOW

if(foll[j]==0)

{

foll[0]='\0';

FOLLOW(j);

}

}

printf("\nfirst集:");

for(i=0;i<=count-1;i++)

printf("%s ",first[i]);

printf("\nfollow集合:");

for(i=0;i<=(int)strlen(non_ter)-1;i++)

printf("%s ",follow[i]);

for(i=0;i<=count-1;i++)

{ //求每一产生式的SELECT集合

memcpy(select[i],first[i],strlen(first[i]));//first[]存放的是各产生式右部的FIRST集select[i][strlen(first[i])]='\0';

for(j=0;j<=(int)strlen(right[i])-1;j++)

result*=_emp(right[i][j]);

if(strlen(right[i])==1&&right[i][0]=='&')//形如产生式A->&

result=1;

if(result==1)

{

for(j=0;;j++)

if(v[j]==left[i])//j为左部符号在所有字符集中的位置

break;

merge(select[i],follow[j],1);

}

}

printf("\nselect集合顺序是:");

for(i=0;i<=count-1;i++)

printf("%s ",select[i]);

memcpy(temp,select[0],strlen(select[0]));

temp[strlen(select[0])]='\0';

for(i=1;i<=count-1;i++)

{ /*判断输入文法是否为LL(1)文法*/

length=strlen(temp);

if(left[i]==left[i-1])

{

merge(temp,select[i],1);

if(strlen(temp)

}

else

{

temp[0]='\0';

memcpy(temp,select[i],strlen(select[i]));

temp[strlen(select[i])]='\0';

}

}

return(1);

}

/*******************************************

构造分析表M

********************************************/

void MM()

{

int i,j,k,m;

for(i=0;i<=19;i++)

{

for(j=0;j<=19;j++)//初始化分析表,全部置为空(-1)

{

M[i][j]=-1;

}

}

i=strlen(termin);

termin[i]='#'; //将#加入终结符数组

termin[i+1]='\0';

for(i=0;i<=count-1;i++)//查看每个产生式的SELECT集

{

for(m=0;;m++)

{

if(non_ter[m]==left[i])

break; //m为产生式左部非终结符的序号

}

for(j=0;j<=(int)strlen(select[i])-1;j++)//对每个SELECT集中的所有元素进行操作{

if(in(select[i][j],termin)==1)

{

for(k=0;;k++)

{

if(termin[k]==select[i][j])

break; //k为产生式右部终结符的序号

}

M[m][k]=i;

}

}

}

}

/*******************************************

判断符号串是否是该文法的句型

********************************************/

void syntax()

{

int i,j,k,m,n,p,q;

char ch;

char S[50],str[50];

printf("请输入该文法的句型:");

scanf("%s",str);

getchar();

i=strlen(str);

str[i]='#';

str[i+1]='\0';

S[0]='#';

S[1]=start;

S[2]='\0';

j=0;

ch=str[j];

while(1)

{

if(in(S[strlen(S)-1],termin)==1)

{

if(S[strlen(S)-1]!=ch)

{

printf("该符号串不是文法的句型!");

return;

}

else if(S[strlen(S)-1]=='#')

{

printf("该符号串是文法的句型.");

return;

}

else

{

S[strlen(S)-1]='\0';

j++;

ch=str[j];

}

}

else

{

for(i=0;;i++)

if(non_ter[i]==S[strlen(S)-1])

break;

for(k=0;;k++)

{

if(termin[k]==ch)

break;

if(k==(int)strlen(termin))

{

printf("词法错误!");

return;

}

}

if(M[i][k]==-1)

{

printf("语法错误!");

return;

}

else

{

m=M[i][k];

if(right[m][0]=='@')

S[strlen(S)-1]='\0';

else

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

数据分析实验报告

数据分析实验报告 文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-

第一次试验报告 习题1.3 1建立数据集,定义变量并输入数据并保存。 2数据的描述,包括求均值、方差、中位数等统计量。 分析—描述统计—频率,选择如下: 输出: 统计量 全国居民 农村居民 城镇居民 N 有效 22 22 22 缺失 均值 1116.82 747.86 2336.41 中值 727.50 530.50 1499.50 方差 1031026.918 399673.838 4536136.444 百分位数 25 304.25 239.75 596.25 50 727.50 530.50 1499.50 75 1893.50 1197.00 4136.75 3画直方图,茎叶图,QQ 图。(全国居民) 分析—描述统计—探索,选择如下: 输出: 全国居民 Stem-and-Leaf Plot Frequency Stem & Leaf 5.00 0 . 56788 数据分析实验报告 【最新资料,WORD 文档,可编辑修改】

2.00 1 . 03 1.00 1 . 7 1.00 2 . 3 3.00 2 . 689 1.00 3 . 1 Stem width: 1000 Each leaf: 1 case(s) 分析—描述统计—QQ图,选择如下: 输出: 习题1.1 4数据正态性的检验:K—S检验,W检验数据: 取显着性水平为0.05 分析—描述统计—探索,选择如下:(1)K—S检验

结果:p=0.735 大于0.05 接受原假设,即数据来自正太总体。 (2 )W 检验 结果:在Shapiro-Wilk 检验结果972.00 w ,p=0.174大于0.05 接受原假设,即数据来自正太总体。 习题1.5 5 多维正态数据的统计量 数据:

编译原理词法分析器语法分析器实验报告

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

【实验报告】SPSS相关分析实验报告

SPSS相关分析实验报告 篇一:spss对数据进行相关性分析实验报告 实验一 一.实验目的 掌握用spss软件对数据进行相关性分析,熟悉其操作过程,并能分析其结果。 二.实验原理 相关性分析是考察两个变量之间线性关系的一种统计分析方法。更精确地说,当一个变量发生变化时,另一个变量如何变化,此时就需要通过计算相关系数来做深入的定量考察。P值是针对原假设H0:假设两变量无线性相关而言的。一般假设检验的显著性水平为0.05,你只需要拿p值和0.05进行比较:如果p值小于0.05,就拒绝原假设H0,说明两变量有线性相关的关系,他们无线性相关的可能性小于0.05;如果大于0.05,则一般认为无线性相关关系,至于相关的程度则要看相关系数R值,r越大,说明越相关。越小,则相关程度越低。而偏相关分析是指当两个变量同时与第三个变量相关时,将第三个变量的影响剔除,只分析另外两个变量之间相关程度的过程,其检验过程与相关分析相似。三、实验内容 掌握使用spss软件对数据进行相关性分析,从变量之间的相关关系,寻求与人均食品支出密切相关的因素。 (1)检验人均食品支出与粮价和人均收入之间的相关关系。 a.打开spss软件,输入“回归人均食品支出”数据。

b.在spssd的菜单栏中选择点击,弹出一个对话窗口。 C.在对话窗口中点击ok,系统输出结果,如下表。 从表中可以看出,人均食品支出与人均收入之间的相关系数为0.921,t检验的显著性概率为0.0000.01,拒绝零假设,表明两个变量之间显著相关。人均食品支出与粮食平均单价之间的相关系数为0.730,t检验的显著性概率为 0.0000.01,拒绝零假设,表明两个变量之间也显著相关。 (2)研究人均食品支出与人均收入之间的偏相关关系。 读入数据后: A.点击系统弹出一个对话窗口。 B.点击OK,系统输出结果,如下表。 从表中可以看出,人均食品支出与人均收入的偏相关系数为0.8665,显著性概率p=0.0000.01,说明在剔除了粮食单价的影响后,人均食品支出与人均收入依然有显著性关系,并且0.86650.921,说明它们之间的显著性关系稍有减弱。通过相关关系与偏相关关系的比较可以得知:在粮价的影响下,人均收入对人均食品支出的影响更大。 三、实验总结 1、熟悉了用spss软件对数据进行相关性分析,熟悉其操作过程。 2、通过spss软件输出的数据结果并能够分析其相互之间的关系,并且解决实际问题。 3、充分理解了相关性分析的应用原理。

编译原理实验报告(语法分析器)

. 编译原理实验专业:13级网络工程

语法分析器1 一、实现方法描述 所给文法为G【E】; E->TE’ E’->+TE’|空 T->FT’ T’->*FT’|空 F->i|(E) 递归子程序法: 首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。 二、实现代码 头文件shiyan3.h #include #include

#include using namespace std; #define num 100 char vocabulary[num]; char *ch; void judge_E(); void judge_EE(); void judge_T(); void judge_TT(); void judge_F(); 源文件 #include"shiyan3.h" void judge_E() { if(*ch==';') { cout<<"该句子符合此文法!"<

int a=0; cout<<"按1结束程序"<>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"<>a; if(a==1) exit(0); }

电力系统分析实验报告

本科生实验报告 实验课程电力系统分析 学院名称核技术与自动化工程学院 专业名称电气工程及其自动化 学生姓名 学生学号 指导教师顾民 实验地点6C901 实验成绩

二〇一五年十月——二〇一五年十二月 实验一MATPOWER软件在电力系统潮流计算中的应用实例 一、简介 Matlab在电力系统建模和仿真的应用主要由电力系统仿真模块(Power System Blockset 简称PSB)来完成。Power System Block是由TEQSIM公司和魁北克水电站开发的。PSB是在Simulink环境下使用的模块,采用变步长积分法,可以对非线性、刚性和非连续系统进行精确的仿真,并精确地检测出断点和开关发生时刻。PSB程序库涵盖了电路、电力电子、电气传动和电力系统等电工学科中常用的基本元件和系统仿真模型。通过PSB可以迅速建立模型,并立即仿真。PSB程序块程序库中的测量程序和控制源起到电信号与Simulink程序之间连接作用。PSB程序库含有代表电力网络中一般部件和设备的Simulink程序块,通过PSB 可以迅速建立模型,并立即仿真。 1)字段baseMVA是一个标量,用来设置基准容量,如100MVA。 2)字段bus是一个矩阵,用来设置电网中各母线参数。 ①bus_i用来设置母线编号(正整数)。 ②type用来设置母线类型, 1为PQ节点母线, 2为PV节点母线, 3为平衡(参考)节点母线,4为孤立节点母线。 ③Pd和Qd用来设置母线注入负荷的有功功率和无功功率。 ④Gs、Bs用来设置与母线并联电导和电纳。 ⑤baseKV用来设置该母线基准电压。 ⑥Vm和Va用来设置母线电压的幅值、相位初值。 ⑦Vmax和Vmin用来设置工作时母线最高、最低电压幅值。 ⑧area和zone用来设置电网断面号和分区号,一般都设置为1,前者可设置范围为1~100,后者可设置范围为1~999。 3)字段gen为一个矩阵,用来设置接入电网中的发电机(电源)参数。 ①bus用来设置接入发电机(电源)的母线编号。 ②Pg和Qg用来设置接入发电机(电源)的有功功率和无功功率。 ③Pmax和Pmin用来设置接入发电机(电源)的有功功率最大、最小允许值。 ④Qmax和Qmin用来设置接入发电机(电源)的无功功率最大、最小允许值。 ⑤Vg用来设置接入发电机(电源)的工作电压。 1.发电机模型 2.变压器模型 3.线路模型 4.负荷模型 5.母线模型 二、电力系统模型 电力系统中输送和分配电能的部分称为电力网,它包括升降压变压器和各种电压等级的输电线路、动力系统、电力系统和电力网简单示意如图

TEST语言 -语法分析,词法分析实验报告

编译原理实验报告 实验名称:分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用!!!!! 一、实验目的 通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。 二、实验设计 程序流程图

extern int TESTScan(FILE *fin,FILE *fout); FILE *fin,*fout; //用于指定输入输出文件的指针 int main() { char szFinName[300]; char szFoutName[300]; printf("请输入源程序文件名(包括路径):"); scanf("%s",szFinName); printf("请输入词法分析输出文件名(包括路径):"); scanf("%s",szFoutName); if( (fin = fopen(szFinName,"r")) == NULL) { printf("\n打开词法分析输入文件出错!\n"); return 0; } if( (fout = fopen(szFoutName,"w")) == NULL) { printf("\n创建词法分析输出文件出错!\n"); return 0; } int es = TESTScan(fin,fout); fclose(fin); fclose(fout); if(es > 0) printf("词法分析有错,编译停止!共有%d个错误!\n",es); else if(es == 0) { printf("词法分析成功!\n"); int es = 0;

(实习报告)企业实习相关分析报告范文

企业实习相关分析报告范文 本次外出实习,部里安排我到xx会计师事务所实习,主要任务是协助各注册会计师到各街道进行查账,主要工作有编制工作底稿,查阅凭证,帐簿,报表发现问题,提出审计意见,进行现金盘点,资产清查,编制审计报告等。 本次外出实习,我感觉收获特别大。第一:收集了很多教学素材案例,在审计过程中,一旦我发现有对我以后教学有用的东西,我都会用笔记本记录下来。故此,这次外出企业实习,我做的笔记就有3本。我相信这些素材将会对我以,后教学提供很多帮助。本学期我讲授企业单项实训课程,在授课时就经常顺手拈来我外出审计中碰到的很多案例感觉教学效果很好。第二:了解目前企业会计现状以及他们在做帐过程中存在的各种问题及种种舞弊现象。第三:向注册会计师学习了很多知识,对于我在审计过程中碰到的各种问题,我都会虚心地向xx会计师事务所的老师询问,对于我提出的各种轰炸式提问,他们都很耐心地给予回答。第四:近距离接触,真正了解到对会计人员各方面素质及要求,为我以后在讲授课程时对于授课内容如何有所侧重更有帮助。本次发言,张部长主要让我谈一谈目前企业对会计人员要求,我们在教学中应注重培养学生哪些方面知识.我以为主要有以下几方面:一,会计电算化知识 本次外出企业查帐,我发现大部分企业已实现用电脑做帐,而且大部分企业公司都是采用金蝶财务软件做帐,少部分采用用友软件做帐。故此,我们应重点加强这方面知识讲授,让每位同学都能达到熟练运用这2个财务软件.既然是用电脑做帐,对打字速度有一定要求,一般要求学生每分钟要达到40-50个字左右。 二,税务知识 本次外出企业查帐,我发现很多公司因为规模较小,只设有一名会计人员,会计人员可以说是一名多面手、做帐、报税等均是他的工作。所以,我们以后应加强税务知识讲授,尤其是税务实务操作练习,教会每会学生如何申请报税、计税、缴税、尤其是几个主要税种,如个人所得税、企业所得税、营业税、房产税等更要重点讲授。 三,出纳方面知识 由于我们的学生学历较低,很多同学毕业后只能担任出纳,故此,对于出纳工作主要职责(如登记现金日记帐、银行存款日记帐、保管库存现金、有价证券、空白发票、支票印章)以及应具备技能(如点钞、计算器、辩别真假钞票)等应让学生熟练掌握。 四,财会法规知识

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

3-系统分析实验报告

管理信息系统实验报告 实验3 系统分析 课程名称:管理信息系统 指导教师:王玮 班级:信管1401 学号: 姓名:唐赛赛 时间: 2016.04.06 地点: 3 号机房

一、实验目的 1.了解开发Visio解决方案的基本概念和关于Visio工具的一些基本的操作和应用; 2.掌握系统分析阶段数据流程图的画法; 二、实验步骤和实验结果: 使用Visio中提供的“组织结构图”模具,绘制下面例题的组织结构图,附在图后。 2、使用Visio绘制“业务流程图模具”和“数据流程图模具”(1)创建“业务流程图模具” 先在“框图”-〉“基本形状”中找到圆角矩形,右击选择“添加到我的形状”-〉“添加到新模具”。之后出现“另存为”对话框,把新模具命名为“业务流程图”,把圆角矩形形添加到了新模具“业务程图”中。用同样的思路,先在“框图”-〉“基本形状”中找到圆形,右击选择“添加到我的形状”-〉“添加到模具“业务程图”中;在“框图”-〉“基本形状”找到矩形,在“流程图”中的“IDEFO图表形状”找到动态连接线,在“流程图”中的“SDL图表形状”中找到文档,多文档,添加到模具“业务程图”中。可以通过设置“动态连接线”属性来改变其形状。如下图:

添加完成后,我们就可以在画业务流程图时打开该模具,业务流程图所有的元素都会在一个模具中显示出来。(2)创建“数据流程图模具”先在“框图”-〉“基本形状”中找到圆形(或是“流程图”中的“混合流程图形状”中找到外部实体2 ),右击选择“添加到我的形状”-〉“添加到新模具”(注,使用外部实体2来表示外部实体的时候,请将之旋转180度使用)。之后出现“另存为”对话框,把新模具命名为“数据流程图”,这样我们就把圆形形添加

编译原理LL(1)语法分析实验报告

学号20102798 专业软件工程姓名薛建东 实验日期2013.04.08 教师签字成绩实验报告 【实验名称】LL(1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发应用程序的基本方法。 【实验内容】 ◆根据某一文法编制调试LL ( 1)分析程序,以便对任意输入的符号串进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1) 分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1)、LL(1)文法的定义 LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。 LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。 需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A→α,A→β,都要满足下面条件:SELECT(A→α)∩SELECT(A→β)=? (2)、预测分析表构造 LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推

数据分析实验报告

数据分析实验报告 【最新资料,WORD文档,可编辑修改】 第一次试验报告 习题1.3 1建立数据集,定义变量并输入数据并保存。 2数据的描述,包括求均值、方差、中位数等统计量。 分析—描述统计—频率,选择如下: 输出:

方差1031026.918399673.8384536136.444百分位数25304.25239.75596.25 50727.50530.501499.50 751893.501197.004136.75 3画直方图,茎叶图,QQ图。(全国居民) 分析—描述统计—探索,选择如下: 输出: 全国居民Stem-and-Leaf Plot Frequency Stem & Leaf 9.00 0 . 122223344 5.00 0 . 56788 2.00 1 . 03 1.00 1 . 7 1.00 2 . 3 3.00 2 . 689

1.00 3 . 1 Stem width: 1000 Each leaf: 1 case(s) 分析—描述统计—QQ图,选择如下: 输出: 习题1.1 4数据正态性的检验:K—S检验,W检验数据: 取显着性水平为0.05 分析—描述统计—探索,选择如下:(1)K—S检验 单样本Kolmogorov-Smirnov 检验 身高N60正态参数a,,b均值139.00

标准差7.064 最极端差别绝对值.089 正.045 负-.089 Kolmogorov-Smirnov Z.686 渐近显着性(双侧).735 a. 检验分布为正态分布。 b. 根据数据计算得到。 结果:p=0.735 大于0.05 接受原假设,即数据来自正太总体。(2)W检验

系统分析实验报告

天津职业技术师范大学课程设计大学学籍管理系统的设计与开发 专业:软件工程 班级学号:软件1002-17 学生姓名:靳利强 指导教师:龚良波老师 二〇一三年七月

一.需求分析 1.课程名称:大学教务信息系统的设计与开发 2.设计目的: 为方便学校做好学生学籍管理工作,设计一个学生学籍管理系统,在设计过程中作了系统分析和总体设计,软件设计采取模块化的设计思路。 3.需求概述 该学生学籍管理系统主要对学生学籍信息、成绩信息进行管理,提供一个平台,供学籍管理人员增删改查学生信息、学生成绩信息。系统分为学生信息管理、学生成绩管理、信息查询等几个模块。学籍管理人员登录成功后可以对学生信息管理、学生成绩管理、信息查询等模块进行操作,如学生信息添加、修改、删除和查询;学生成绩登记、修改、删除和查询;查询信息等。 4功能需求: 1)功能齐全:界面操作灵活方便,设计包括以下基本功能: 2)学生信息管理、教师信息管理、财务信息管理、班级信息管理、课 程信息管理、成绩信息管理、打印信息管理、教室信息管理、综合信息查询、系统管理等,至少实现其中的三个功能,且每个功能至少包括两个子功能。 3)按照软件工程的要求进行分析、设计和开发。 4)界面友好:界面友好、输入有提示、尽量展示人性化。 5)可读性强:源程序代码清晰、有层次、主要程序段有注释。

6)健壮性好:用户输入非法数据时,系统应及时给出警告信息。 二.概要设计 1.功能模块: 2数据流图: (1)学生端

(2)管理员端

学生端功能: A 登录,学生登录后,验证成功,进入其信息展示页。 管理员端功能: B 登录,管理员登录后,验证成功,进入学生信息列表,可以对学生信息进行修改,删除,按班级查询,按学号查询,按名字查询。上传图片,更新图片等操作。 三.详细设计及实现 数据库设计: 学生表: 教师表:

词法分析器实验报告

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图、程序流程图:

程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={'\0'}; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp);

系统分析实验报告2016

本科实验报告 课程名称:系统分析与设计 实验项目:《》实验实验地点: 专业班级:学号: 学生姓名: 指导教师: 2016年11月日

一、实验目的 通过《系统分析与设计》实验,使学生在实际的案例中完成系统分析与系统设计中的主要步骤,并熟悉信息系统开发的有关应用软件,加深对信息系统分析与设计课程基础理论、基本知识的理解,提高分析和解决实际问题的能力,使学生在实践中熟悉信息系统分析与设计的规范,为后继的学习打下良好的基础。 二、实验要求 学生以个人为单位完成,自选题目,班内题目不重复,使用UML进行系统分析与设计,并完成实验报告。实验报告(A4纸+电子版)在最后一次上课时提交(10周)。 三、实验主要设备:台式或笔记本计算机 四、实验内容 1 选题及项目背景 学生填写自选题目 2 定义 学生填写(对自选项目系统进行描述200-400字) 3 参考资料 学生填写 4 系统分析与设计 4.1需求分析 4.1.1识别参与者 学生填写 4.1.2 对需求进行捕获与描述 学生填写时删除以下括号内容 (内容要求1:对每个用例进行概要说明,参考以下格式: 用例名称:删除借阅者信息执行者:管理员 目的:完成一次删除借阅者信息的完整过程。) (内容要求2:选择其中一个用例(如下订单)给出其用例描述。格式参考下表

) 4.1.3 用例图 通过已掌握的需求,初步了解系统所要完成的功能。下面给出用例图。 4.1.4 分析与讨论 1)建模用例图的步骤、方法? 2)如何识别系统的参与者?应该如何划分用例,应注意哪些问题? 3)心得 4.2 建立对象模型 4.2.1 候选类的数据字典 学生填写 4.2.2定义类 (内容以“书籍信息”类为例列出该类的属性和操作如下: “书籍信息”类 ?属性 国际标准书号(ISBN):文本(String) 书名(name):文本

语法分析(自上而下分析)实验报告

实习二语法分析-自上而下分析 一、实验目的 使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。 二、实验内容 1.设计表达式的语法分析器算法(使用预测分析) 2.编写一段代码并上机调试查看其运行结果 三、实验要求 使用LL(1)分析算法设计表达式的语法分析器 LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。 实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。 预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。 1.若X=a=“#”,则宣布分析成功,停止分析过程 2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一 个输入符号。 3.若X是一个非终结符,则查看分析表。 四、运行结果

(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析) 五、源程序实现 /*LL(1)分析法源程序,只能在VC++中运行*/ #include #include #include #include char A[20]; char B[20]; char v1[20]={'i','+','*','(',')','#'};/*终结符*/ char v2[20]={'E','G','T','S','F'};/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度*/

spss实验报告最终版本

实验课程专业统计软件应用 上课时间2012 学年 1 学期15 周(2012 年12 月18日—28 日) 学生姓名李艳学号2010211587 班级0331002 所在学院经济管 上课地点经管3 楼指导教师胡大权理学院

实验内容写作 第六章 一实验目的 1、理解方差分析的基本概念 2、学会常用的方差分析方法 二实验内容 实验原理:方差分析的基本原理是认为不同处理组的均值间的差别基本来源有两个:随机误差,如测 量误差造成的差异或个体间的差异,称为组内差异 根据老师的讲解和课本的习题完成思考与练习的5、6、7、8题。 第5题:为了寻求适应某地区的高产油菜品种,今选5个品种进行试验,每一种在4块条件完全相同的试验田上试种,其他施肥等田间管理措施完全一样。表 6.20所示为每一品种下每一块田的亩产量,根 据这些数据分析不同品种油菜的平均产量在显著水平0.05下有无显著性差异。 第一步分析 由于考虑的是控制变量对另一个观测变量的影响,而且是5个品种,所以不宜采用独立样本T检验,应该采用单因素方差分析。 第二步数据的组织 从实验材料中直接导入数据 第三步方差相等的齐性检验 由于方差分析的前提是各水平下的总体服从方差相等的正态分布,而且各组的方差具有齐性,其中正 态分布的要求并不是非常严格,但是对于方差相等的要求还是比较严格的,因此必须对方差相等的前提进 行检验。

第四步多重比较分析 通过上面的步骤,只能判断不同的施肥等田间操作效果是否有显著性差异,如果要想进一步了解究竟那 个品种与其他的有显著性均值差别等细节问题,就需要单击上图中的两两比较按钮。 第五步运行结果及分析 多重比较结果表:从该表可以看出分别对几个不同的品种进行的两两比较。最后我们可以得出结论第4品种是最好的。其他的次之。 第6题:某公司希望检测四种类型类型轮胎A,B,C,D的寿命,如表 6.21所示。其中每种轮胎应用在随选择的6种汽车上,在显著性水平0.05下判断不同类型轮胎的寿命间是否存在显著性差异。 第一步分析 由于考虑的是一个控制变量对另一个控制变量的影响,而且是4种轮胎,所以不宜采用独立样本T 检验,应该采用单因素方差分析。 第二步数据的组织 从实验材料中直接导入数据。 第三步方差相等的齐性检验 由于方差分析的前提是各水平下的总体服从方差相等的正态分布,而且各组的方差具有齐性,其中正态分 布的要求并不是非常严格,但是对于方差相等的要求还是比较严格的,因此必须对方差相等的前提进行检 验。选择菜单“分析”—均值比较—单因素ANOVA。

编译原理语法分析器实验报告

编译原理语法分析器实验报告 班级: 学号: 姓名:

实验名称语法分析器 一、实验目的 1、根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 2、本次实验的目的主要是加深对自上而下分析法的理解。 二、实验内容 [问题描述] 递归下降分析法: 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 LL(1)分析法: 模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式 符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简 单的错误提示。 [基本要求] 1. 对数据输入读取 2. 格式化输出分析结果 2.简单的程序实现词法分析 public static void main(String args[]) { LL l = new LL(); l.setP(); String input = ""; boolean flag = true;

while (flag) { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(); System.out.print("请输入字符串(输入exit退出):"); input = br.readLine(); } catch (Exception e) { e.printStackTrace(); } if(input.equals("exit")){ flag = false; }else{ l.setInputString(input); l.setCount(1, 1, 0, 0); l.setFenxi(); System.out.println(); System.out.println("分析过程"); System.out.println("----------------------------------------------------------------------"); System.out.println(" 步骤| 分析栈 | 剩余输入串| 所用产生式"); System.out.println("----------------------------------------------------------------------"); boolean b = l.judge(); System.out.println("----------------------------------------------------------------------"); if(b){ System.out.println("您输入的字符串"+input+"是该文法的一个句子"); }else{ System.out.println("您输入的字符串"+input+"有词法错误!");

相关与回归分析实验报告

课程论文 题目统计学实验 学院数学与统计学院 专业金融数学 班级14金融数学 学生姓名罗星蔓 指导教师胡桂华 职称教授 2016 年 6 月21 日

相关与回归分析实验报告 一、实验目的:用EXCEL进行相关分析和回归分析. 二、实验内容: 1.用EXCEL进行相关分析. 2.用EXCEL进行回归分析. 三、实验步骤 采用下面的例子进行相关分析和回归分析. 相关分析: 数学分数(x)统计学分数(y) 数学分数(x) 1 统计学分数(y) 0.986011 1 回归分析: SUMMARY OUTPUT 回归统计 Multiple R 0.986011 R Square 0.972217 Adjusted R 0.968744 Square 标准误差 2.403141 观测值 x 方差分 析

df SS MS F Significance F 回归分析1 1616.69 9 1616.69 9 279.943 8 1.65E-07 残差8 46.2006 9 5.77508 6 总计9 1662.9 Coefficie nts 标准误 差 t Stat P-valu e Lower 95% Upper 95% 下限 95.0% 上限 95.0% Intercept 12.32018 4.2862 79 2.8743 3 0.0206 91 2.4360 05 22.204 36 2.4360 05 22.204 36 数学分数(x)0.896821 0.0536 01 16.731 52 1.65E- 07 0.7732 18 1.0204 24 0.7732 18 1.0204 24 RESIDUAL OUTPUT 观测值预测统计学分数 (y) 残差标准残差 1 84.06587 0.934133 0.412293 2 93.03408 -1.03408 -0.4564 3 66.12945 3.87055 4 1.708324 4 93.03408 -3.03408 -1.33913 5 82.27223 0.727775 0.321214 6 90.34361 -0.34361 -0.15166 7 93.03408 0.965922 0.426323 8 52.67713 -2.67713 -1.18159 9 90.34361 2.656385 1.172433 10 84.06587 -2.06587 -0.9118 PROBABILITY OUTPUT 百分比排 位统计学分数 (y) 5 50 15 70 25 82 35 83 45 85 55 90 65 90 75 92

相关文档
相关文档 最新文档