文档库 最新最全的文档下载
当前位置:文档库 › 《编译原理》语法分析器实验报告模板-课程设计-信安

《编译原理》语法分析器实验报告模板-课程设计-信安

《编译原理》语法分析器实验报告模板-课程设计-信安
《编译原理》语法分析器实验报告模板-课程设计-信安

课程设计报告

课程名称编译原理

实验项目设计与实现一个词法分析器

实验仪器PC机

北京信息科技大学

信息管理学院

(课程上机)实验报告

实验名称设计与实现一个语法分析器实验地点信管机房204 实验时间2011.12.20 1.实验目的:

结合讲授内容,进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的语法分析程序设计任务,同时强调好的程序设计风格。

2.实验内容:

对输入的文法判定是否为LL(1)文法,若是LL(1)文法,则构造LL(1)分析表,输入一个句子,依据LL(1)分析表输出与句子对应的语法树。

设计LL(1)文法的词法分析器。

3.实验要求:

(1)输入一个文法G(如:测试数据1);

(2)编写求FIRST集的算法;输出文法G的First集;

(3)编写求FOLLOW集的算法;输出文法G的FOLLOW集;

(4)编写求SELECT的算法,输出文法G的SELECT集;

(5)判定是否为LL(1)文法,若是,则编写构造LL(1)分析表的算法,并输出预测分析表

(6)编写表驱动的预测分析算法;

(7)给出输入一个句子(如:测试数据2)的预测分析步骤;

(8)输出依据句子构对应的语法树的过程;

(9)构造文法G的递归子程序;(选作)

测试数据1:(若用其它测试数据,请替换下面内容)

输入文法G:

S->aH

H->aMd|d

M->Ab|@

A->aM|e

测试数据2:

输入句子:aaabd#

4.实验准备:

5.实验过程:

#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 f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/

char empty[20]; /*记录可直接推出@的符号*/

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

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

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

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

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

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

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

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

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

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

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==strlen(p))

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

}

}

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

得到一个不是非终结符的符号

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

char c()

{

char c='A';

while(in(c,non_ter)==1)

c++;

return(c);

}

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

分解含有左递归的产生式

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

void recur(char *point)

{ /*完整的产生式在point[]中*/

int j,m=0,n=3,k;

char temp[20],ch;

ch=c(); /*得到一个非终结符*/

k=strlen(non_ter);

non_ter[k]=ch;

non_ter[k+1]='\0';

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

{

if(point[n]==point[0])

{ /*如果'|'后的首符号和左部相同*/ for(j=n+1;j<=strlen(point)-1;j++)

{

while(point[j]!='|'&&point[j]!='\0')

temp[m++]=point[j++];

left[count]=ch;

memcpy(right[count],temp,m);

right[count][m]=ch;

right[count][m+1]='\0';

m=0;

count++;

if(point[j]=='|')

{

n=j+1;

break;

}

}

}

else

{ /*如果'|'后的首符号和左部不同*/ left[count]=ch;

right[count][0]='@';

right[count][1]='\0';

count++;

for(j=n;j<=strlen(point)-1;j++)

{

if(point[j]!='|')

temp[m++]=point[j];

else

{

left[count]=point[0];

memcpy(right[count],temp,m);

right[count][m]=ch;

right[count][m+1]='\0';

printf(" count=%d ",count);

m=0;

count++;

}

}

left[count]=point[0];

memcpy(right[count],temp,m);

right[count][m]=ch;

right[count][m+1]='\0';

count++;

m=0;

}

}

}

void non_re(char *point)

{

int m=0,j;

char temp[20];

for(j=3;j<=strlen(point)-1;j++)

{

if(point[j]!='|')

temp[m++]=point[j];

else

{

left[count]=point[0];

memcpy(right[count],temp,m);

right[count][m]='\0';

m=0;

count++;

}

}

left[count]=point[0];

memcpy(right[count],temp,m);

right[count][m]='\0';

count++;

m=0;

}

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

读入一个文法

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

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,k;

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();

for(j=0;j

{

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

scanf("%s",p[j]);//二维数组首地址传递平p,p[i]第i行第0列首地址,p+i表示第i 行首地址

if( strcmp(p[j], "xxx" )==0) //

{

j=j-2;

}

getchar();

}

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

if(p[j][1]!='-'||p[j][2]!='>')

{ printf("\ninput error!");

validity=0;

return('\0');

} /*检测输入错误*/

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

{ /*分解输入的各产生式*/

if(p[k][3]==p[k][0])

recur(p[k]);

else

non_re(p[k]);

}

return(s);

}

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

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

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

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

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

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

int i,j;

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

{

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

;

else

{

for(j=0;;j++)

{

if(j

break;

if(j==strlen(d))

{

d[j]=s[i];

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

break;

}

}

}

}

}

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

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

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

void emp(char c)

{ /*即求所有由' @ '推出的符号*/

char temp[10];

int i;

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

emp(left[i]);//????????????????????????????????????????

}

}

}

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

求某一符号能否推出' @ ' c为非终结符

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

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

if(in(c,empty)==1)

return(1);

for(i=0;;i++)

{

if(i==count)

return(0);

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

{

j=strlen(right[i]); /*j为右部的长度*/

if(j==1&&in(right[i][0],empty)==1) // A->B B->@

return(1);

else

if(j==1&&in(right[i][0],termin)==1&&left[i+1]!=c)//A->a ,A->sB ,S->@ ,B->@ return(0);

else if(j==1&&in(right[i][0],termin)==1&&left[i+1]==c)

continue;

else

{

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

if(in(right[i][k],empt)==1) // A->A

mark=1;

if(mark==1)

continue;

else

{

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

{

result*=_emp(right[i][k]);// 太漂亮了

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

temp[1]='\0';

merge(empt,temp,1);

}

}

}

if(result==0&&iBa ,A->S ,S->@ ,B!->@ 找下一个做不为@的---C continue;

else if(result==1&&i

return(1);

}

}

}

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

判断读入的文法是否正确

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

int judge()

{

int i,j;

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

{

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

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

printf("\nerror1!");

validity=0;

return(0);

}

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

{

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

{ /*若右部某一符号不在非终结符、终结符中且不为' @ ',报错*/

printf("\nerror2!");

validity=0;

return(0);

}

}

}

return(1);

}

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

求单个符号的FIRST 求出每个符号的first 并且将其存入first1[][]

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

void first2(int i)

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

char c,temp[20];

int j,k,m;

c=v[i];

char ch='@';

emp(ch);

if(in(c,termin)==1) /*若为终结符*/

{

first1[i][0]=c;

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

}

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

{

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

{

if(left[j]==c)

{

if(in(right[j][0],termin)==1||right[j][0]=='@')// A->@或者A->a

{

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

temp[1]='\0';

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

}

else if(in(right[j][0],non_ter)==1) //左部非终结符并且右部为非终结符

{

if(right[j][0]==c)//A->A...寻找下一个A

continue;

for(k=0;;k++) //A->B。无限循环,找到B的位置

if(v[k]==right[j][0])

break;

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

{

first2(k);//M->A.. 此时找出A的位置在M 之后,而A 的first 没有求过,所以要返回求

f[k]='1';

}

merge(first1[i],first1[k],2);//A->B 则将B对应符号表位置找出,然后将B first1[][] 复制给A

for(k=0;k<=strlen(right[j])-1;k++)//二位数组strlen(right[j])表示第j行的长度

{

empt[0]='\0';

if(_emp(right[j][k])==1&&k

{

for(m=0;;m++)

if(v[m]==right[j][k+1]) //M->AB A->@ 则找到B的位置,求B的first

break;

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

{

first2(m);

f[m]='1';

}

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

}

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

{

temp[0]='@';

temp[1]='\0';

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

}

else

break;

}

}

}

}

}

f[i]='1';

}

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

求各产生式右部的FIRST

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

void FIRST(int i,char *p)

{

int length;

int j,k,m;

char temp[20];

length=strlen(p);

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

if(p[0]=='@')

{

if(i>=0)

{

first[i][0]='@';

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

}

else

{

TEMP[0]='@';

TEMP[1]='\0';

}

}

else

{

for(j=0;;j++)

if(v[j]==p[0])

break;

if(i>=0)

{

memcpy(first[i],first1[j],strlen(first1[j]));

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])

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)

{

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

char c,temp[20];

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

temp[0]=c;

temp[1]='\0';

merge(fo,temp,1);

if(c==start)

{ /*若为开始符号*/

temp[0]='#';

temp[1]='\0';

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

}

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

{

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

{

for(k=0;;k++)

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

break; /*k为c在该产生式右部的序号*/

for(m=0;;m++)

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

break; /*m为产生式左部非终结符在所有符号中的序号*/ if(k==strlen(right[j])-1)

{ /*如果c在产生式右部的最后*/

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

{

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

continue;

}

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

{

FOLLOW(m);

F[m]='1';

}

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

}

else

{ /*如果c不在产生式右部的最后*/

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

{

empt[0]='\0';

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

}

if(result==1)

{ /*如果右部c后面的符号串能推出^*/

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

{ /*避免循环递归*/

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

continue;

}

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

{

FOLLOW(m);

F[m]='1';

}

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

}

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

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

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

FIRST(-1,temp);

merge(follow[i],TEMP,2);

}

}

}

F[i]='1';

}

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

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

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

int ll1()

{

int i,j,p,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';

f[j]='0';

F[j]='0';

}

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

first2(j); /*求单个符号的FIRST集合*/ printf("\n各非终结符导出的first集:");

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

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

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

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

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

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

{ /*求FOLLOW*/

if(fo[j]==0)

{

fo[0]='\0';

FOLLOW(j);

}

}

printf("\nfollow集合:");

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

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

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

{

for(j=0;j<=strlen(first[i])-1;j++)/*求每一产生式的SELECT集合*/

if(first[i][j]=='@')

{

merge(select[i],first[i],2);

for(p=0;;p++)

if(v[p]==left[i])

break;

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

}

else if(j==strlen(first[i])-1)

{

merge(select[i],first[i],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)

return(0);

}

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++)

M[i][j]=-1;

i=strlen(termin);

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

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

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

{

for(m=0;;m++)

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

break; /*m为产生式左部非终结符的序号*/ //存储序号而不存储内容,节省内存!!!!

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

{

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==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

{

p=strlen(S)-1;

q=p;

for(n=strlen(right[m])-1;n>=0;n--)

S[p++]=right[m][n];

S[q+strlen(right[m])]='\0';

}

}

}

printf("S:%s str:",S);

for(p=j;p<=strlen(str)-1;p++)

printf("%c",str[p]);

printf(" \n");

}

}

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

一个用户调用函数

********************************************/ void menu()

{

syntax();

printf("\n是否继续?(y or n):");

scanf("%c",&choose);

getchar();

while(choose=='y')

{

menu();

}

}

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

主函数

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

void main()

{

int i,j;

start=grammer(termin,non_ter,left,right); /*读入一个文法*/ printf("count=%d",count);

printf("\n开始符号为:%c",start);

strcpy(v,non_ter);

strcat(v,termin);

printf("\n所有符号集为:%s",v);

printf("\n非终结符集合:{%s",non_ter);

printf("}");

printf("\n终结符集合:{%s",termin);

printf("}");

printf("\n文法所有右边表达式依次是:");

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

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

printf("\n文法所有左边开始符依次是:");

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

printf("%c ",left[i]);

if(validity==1)

validity=judge();

//printf("\nvalidity=%d",validity);

if(validity==1)

{

ll=ll1();

// printf("\nll=%d",ll);

if(ll==0)

printf("\n该文法不是一个LL1文法!");

else

{

printf("\n该文法是一个LL(1)文法!");

MM();

// printf("\n");

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

编译原理实验报告《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

北京理工大学汇编实验报告3

北京理工大学汇编实验报告3

本科实验报告实验名称:实验三字符串操作实验 课程名称: 课程设计Ⅰ(CPU与汇编)(实 验)实验时间: 第5-10周周五 下午 任课教师:聂青实验地点:10-102 实验教师:苏京霞 实验类型:?原理验证□综合设计□自主创新 学生姓名:罗逸雨 学号/班级:1120141208 05211401 组号:3 学院:信息与电子学院同组搭档: 专业:通信工程成绩:

CX 中值减 1,当 CX 中值减至 0 时,停止重复执行,继续执行下一条指令。当REP无条件重复前缀,重复串操作直到计数寄存器的内容 CX 为0为止。经常与REP 配合工作的字符串处理指令有MOVS、STOS和LODS。 当REPE/REPZ判断计数寄存器的内容 CX 是否为0或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。可以与 REPE/REPZ 配合工作的串指令有CMPS和SCAS。 当REPNE/REPNZ判断计数寄存器的内容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。可以与 REPE/REPZ 配合工作的串指令有CMPS和SCAS。 3)字符串操作指令 lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据 DF 标志增减 SI; stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据 DF 标志增减 DI; movsb、movsw:把 DS:SI 指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据 DF标志分别增减SI和DI; scasb、scasw:把AL或AX 中的数据与ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI; cmpsb、cmpsw:把DS:SI 指向的存储单元中的数据与 ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI; rep:重复其后的串操作指令。重复前先判断 CX 是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在 LODS 前。 上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器 AX、计数器CX。 涉及的标志位:DF、AF、CF、OF、PF、SF、ZF。 三、实验步骤 1) 编写程序,比较两个字符串BUF1和BUF2所含的字符是否相同,相同则AL 返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。提示:输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。 2) 编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。提示:从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,

单片机电子时钟课程设计实验报告

单片机电子时钟课程设 计实验报告 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】

《单片机原理与应用》课程设计 总结报告 题目:单片机电子时钟(带秒表)的设计 设计人员:张保江江润洲 学号: 班级:自动化1211 指导老师:阮海容 目录 1.题目与主要功能要求 (2) 2.整体设计框图及整机概述 (3) 3.各硬件单元电路的设计、参数分析及原理说明 (3) 4.软件流程图和流程说明 (4) 5.总结设计及调试的体会 (10) 附录 1.图一:系统电路原理图 (11) 2.图二:系统电路 PCB (12) 3.表一:元器件清单 (13) 4.时钟程序源码 (14)

题目:单片机电子时钟的设计与实现 课程设计的目的和意义 课程设计的目的与意义在于让我们将理论与实践相结合。培养我们综合运用电子课程中的理论知识解决实际性问题的能力。让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。 课程设计的基本任务 利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。 主要功能要求 最基本要求 1)使用MCS-51单片机设计一个时钟。要求具有6位LED显示、3个按键输入。 2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。 3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。开始计时时为000000,到235959后又变成000000。 4)使用3个键分别作为小时、分、秒的调校键。每按一次键,对应的显示值便加1。分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。在调校时均不向上一单位进位 (例如分加到59后变为00,但小时不发生改变)。 5) 软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。 6)设计八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序。7)掌握硬件和软件联合调试的方法。 8)完成系统硬件电路的设计和制作。 9)完成系统程序的设计。 10)完成整个系统的设计、调试和制作。

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

编译技术 班级网络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 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

汇编课程设计报告

四川大学计算机学院 学生实验报告 实验名称:汇编课程设计报告 指导教师:唐宁九 姓名:廖偲 学号:0943111209 班级:软件09级一班 日期:20101114

实验报告 班级______________姓名_______________学号_________ 一、实验一:DEBUG基本命令与数据传输指令 二、实验的目的和要求: ? 1.熟练掌握DEBUG的基本调试命令,能够使用DEBUG编写、调试汇编语言程序片段。 ? 2.在理解数据传输指令的基础上按照实验内容中指定的程序片段对程序进行调试和记录; 三、实验的环境: 1.硬件环境:cpu 2.26gHZ、内存2G、显存1G、64位总线笔记本电脑 2.软件环境:win7 32位操作系统、8086/8088指令集系统(在windows系统中)、masm的汇编工具。 四、源程序清单: ?MOV AL, 01H ?MOV SI, 0002H ?LEA SI, [SI] ?MOV BYTE PTR [SI], 80H ?LAHF ?XCHG AL, AH ?SAHF ?XCHG AH, [SI] ?SAHF 五、操作内容: 1.从cmd在debug下进入用A命令进行汇编 格式: A [地址] 功能:从键盘输入汇编程序, 并逐条地把汇编指令翻译成机器代码指令存入对应内存单元。如果不指定汇编地址, 则以CS:IP为地址 2. 反汇编命令U使用 格式: U [地址]/[地址范围] 功能: 将指定地址范围内的机器代码翻译成汇编源程序指令显示出来, 并同时显示地址及代码。 注意: 反汇编时一定确认指令的起始地址, 否则得不到正确的结果。 3.寄存器查看/编辑命令r或r寄存器名称 功能: 显示当前所有寄存器内容, 状态标志及将要执行的下一条指令的地址、代码和汇编指令形式。

vf课程设计实验报告模板

vf 课程设计实验报告模板 经济管理学院 学生信息管理系统的设计与实现 09年12 月28 日 、课程设计的目的和意义 当今,人类正在步入一个以智力资源的占有和配置,知识生产、分配和使用为最重要因素的知识经济时代,为了适应知识经济时代发展的需要,大力推动信息产业的发展,我们通过对学生信息管理系统的设计,来提高学生的操作能力,及对理论知识的实践能力,从而提高学生的基本素质,使其能更好的满足社会需求。 学生信息管理系统是一个简单实用的系统,它是学校进行学生管理的好帮手。 此软件功能齐全,设计合理,使用方便,适合各种学校对繁杂的学生信息进行统筹管理,具有严格的系统使用权限管理,具有完善的管理功能,强大的查询功能。它可以融入学校的信息管理系统中,不仅方便了学生信息各方面的管理,同时也为教师的管理带来了极大地便利。 我们进行本次课程设计的主要目的是通过上机实践操作,熟练掌握数据库的设 计、表单的设计、表单与数据库的连接、SQL语言的使用和了解它的功能:数据定 义、数据操纵、数据控制,以及简单VF程序的编写。基本实现学生信息的管理, 包括系统的登录、学生信息的录入、学生信息的浏览、学生信息的查询、学生信息的修改和学生信息的删除,并对Visual FoxPro6.0 的各种功能有进一步的了解,为我们更进一步深入的学习奠定基础,并在实践中提高我们的实际应用能力,为我们以后的学习和工作提供方便,使我们更容易融入当今社会,顺应知识经济发展的趋势。 - 1 -

、系统功能设计 通过该系统可以基本实现学生信息的管理,包括系统的登录、学生信息的录 入、学生信息的浏览、学生信息的查询、学生信息的修改和学生信息的删除。系统 功能模块如下图所示。 学生信息管理系统主界面 登录 管理 学学学学学 生生生生生 信信信信信 息息息息息 录查浏修删 入询览改除 三、系统设计内容及步骤 3.1创建项目管理文件 1.启动foxpro 系统,建一个项目管理器,命名为“学生管理”。 哑 目f ■ 也 电 岂同左 矣 氏H. 0 存 JI 蛋誤曾

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

. 编译原理实验专业: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); }

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;

汇编语言-课程设计1

) 汇编语言课程实验报告 实验名称 课程设计1 实验环境 硬件平台:Intel Core i5-3210M 操作系统:DOSBox in Windows 软件工具:Turbo C , Debug, MASM 实验内容 《 将实验7中的Power idea公司的数据按照下图所示的格式在屏幕上显示出来。 实验步骤 1.要完成这个实验,首先我们需要编写三个子程序。第一个子程序是可以显示字符串到屏 幕的程序,其汇编代码如下: ;名称:show_str

;功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串 ;参数:(dh)=行号,(dl)=列号(取值范围0~80),(cl)=颜色,ds:si:该字符串的首地址 ;返回:显示在屏幕上 ¥ show_str: push ax push cx push dx push es push si push di mov ax,0b800h - mov es,ax mov al,160 mul dh add dl,dl mov dh,0 add ax,dx mov di,ax mov ah,cl . show_str_x: mov cl,ds:[si] mov ch,0 jcxz show_str_f mov al,cl mov es:[di],ax inc si inc di 【 inc di jmp show_str_x show_str_f: pop di pop si pop es pop dx pop cx } pop ax ret 2.第二个程序是将word型数据转换为字符串,这样我们才能调用第一个程序将其打印出

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对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);

编译原理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)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推

计算机组成原理与大全实验报告

计算机组成原理与汇编课程设计 实验报告 字符统计.asm 2.斐波那契数(小于50).asm (29) 一、课程设计目标 通过课程设计使学生综合运用所学过的计算机原理与汇编知识,增强解决实际问题的能力,加深对所学知识的理解与掌握,提高软硬件开发水平,为今后打下基础。

课程设计的目的和要求: 1、使学生巩固和加强《计算机原理与汇编语言》课程的基本理论知识。 2、使学生掌握汇编语言程序设计的方法及编程技巧,正确编写程序。 3、使学生养成良好的编程习惯并掌握调试程序的基本方法。 4、使学生养成规范书写报告文档的能力,撰写课程设计总结报告。 5、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。 1 2 3 4 1 2 3 00001001 00100000 00001011 00110000 00001011

01000000 00000000 00000001 本实验设计机器指令程序如下: 4)这里做的是个加法运算,第一个加数已经存入到内存的0000 1010单元中, 第二个加数是需要手工输入的。在实验运行面板中点击“运行”按钮,选择 “输入”芯片,设置输入的数据后,双击连接“输入”芯片的单脉冲,这样 第二个加数就设置好了。 5)在实验运行面板中双击连续脉冲,模型机便开始工作,观察各个芯片的状态。 或者在模型机调试窗口中(如图2所示)点击“指令执行”选项卡,在模型 机调试窗口中点击“下一时钟”,模型机机执行到下一个时钟,点击“下一

微指令”,模型机机执行到下一个微指令,点击“下一指令”,模型机机执行到下一条指令。观察各个芯片的状态,思考模型机的运行原理。 四、课程设计的要求 1、根据题目内容,查阅资料。 2、编写课程设计预习报告。 3、编制程序及调试程序。 4、分析总结,写出课程设计报告,报告中应该包含程序功能与使用说明、程序功能 实现方法说明、如流程图与算法参数说明等内容,设计经验体会总结,源程序清 5 6 1 通 三、实验设计内容 读取文件代码段: MOV AX,DATAS MOV DS,AX ;置数据段寄存器 ; MOV DX,OFFSET FNAME MOV AX,3D00H ;读打开指定文件

【实验报告】大学物理实验课程设计实验报告

大学物理实验课程设计实验报告北方民族大学 大学物理实验(设计性实验) 实验报告 指导老师:王建明 姓名:张国生 学号:XX0233 学院:信息与计算科学学院 班级:05信计2班 重力加速度的测定 一、实验任务 精确测定银川地区的重力加速度 二、实验要求 测量结果的相对不确定度不超过5% 三、物理模型的建立及比较 初步确定有以下六种模型方案: 方法一、用打点计时器测量

所用仪器为:打点计时器、直尺、带钱夹的铁架台、纸带、夹子、重物、学生电源等. 利用自由落体原理使重物做自由落体运动.选择理想纸带,找出起始点0,数出时间为t的p点,用米尺测出op的距离为h,其中t=0.02秒×两点间隔数.由公式h=gt2/2得g=2h/t2,将所测代入即可求得g. 方法二、用滴水法测重力加速度 调节水龙头阀门,使水滴按相等时间滴下,用秒表测出n个(n取 50―100)水滴所用时间t,则每两水滴相隔时间为t′=t/n,用米尺测出水滴下落距离h,由公式h=gt′2/2可得g=2hn2/t2. 方法三、取半径为r的玻璃杯,内装适当的液体,固定在旋转台上.旋转台绕其对称轴以角速度ω匀速旋转,这时液体相对于玻璃杯的形状为旋转抛物面重力加速度的计算公式推导如下: 取液面上任一液元a,它距转轴为x,质量为m,受重力mg、弹力n.由动力学知: ncosα-mg=0(1) nsinα=mω2x(2) 两式相比得tgα=ω2x/g,又tgα=dy/dx,∴dy=ω2xdx/g, ∴y/x=ω2x/2g.∴g=ω2x2/2y. .将某点对于对称轴和垂直于对称轴最低点的直角坐标系的坐标x、y测出,将转台转速ω代入即可求得g.

汇编器实验报告doc

汇编器实验报告 篇一:汇编实验报告 实验一(1)熟悉汇编语言程序调试环境及顺序程序设计 一、实验目的及要求: 1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。 2.学会使用EDIT、MASM、LINK、DEBUG等软件工具。 3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。 二、熟悉汇编语言程序调试环境 1.汇编语言源程序的建立 本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。设定源程序的文件名为ABC。 DATA SEGMENT BUFDB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FH CN EQU $-BUF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: PUSH DS

XOR AX,AX PUSH AX MOVAX,DATA MOV DS,AX MOV BX,OFFSET BUF MOV CX,CN DEC CX MOV AL,[BX] INC BX LP:CMP AL,[BX] JBE NEXT MOV AL,[BX] NEXT: INC BX DEC CX JNZ LP MOV AH,4CH INT 21H CODE ENDS END START 键入以下命令: C:\>EDIT ABC.ASM 此时屏幕的显示状态如图1所示。

1 图1 用EDIT编辑ABC.ASM程序窗口 程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。 2.将源程序文件汇编成目标程序文件 一般情况下,MASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。 (2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。 (3)若程序中使用了宏指令,则汇编程序将展开宏指令。 源程序建立以后,在DOS状态下,采用宏汇编程序MASM 对源程序文件进行汇编,其操作过程如图2所示。 图2 MASM宏汇编程序工作窗口 汇编过程的错误分警告错误(Warning Errors)和严重错误(Severe Errors)两种。其中警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数、错误的性质。这时,就要对错误进行分析,找出原因和问题,然后再调用屏幕编辑程序加以修改,修改以后再重新汇编,一直到汇编无错误为止。 3.用连接程序生成可执行程序文件

南邮课程设计实验报告

课程设计I报告 题目:课程设计 班级:44 姓名:范海霞 指导教师:黄双颖 职称: 成绩: 通达学院 2015 年 1 月 4 日

一:SPSS的安装和使用 在PC机上安装SPSS软件,打开软件: 基本统计分析功能包括描述统计和行列计算,还包括在基本分析中最受欢迎的常见统计功能,如汇总、计数、交叉分析、分类比较、描述性统计、因子分析、回归分析及聚类分析等等。具体如下: 1.数据访问、数据准备、数据管理与输出管理; 2.描述统计和探索分析:频数、描述、集中趋势和离散趋势分析、分布分析与查看、正态性检验与正态转换、均值的置信区间估计; 3.交叉表:计数;行、列和总计百分比;独立性检验;定类变量和定序变量的相关性测度; 4.二元统计:均值比较、T检验、单因素方差分析; 5.相关分析:双变量相关分析、偏相关分析、距离分析; 6.线性回归分析:自动线性建模、线性回归、Ordinal回归—PLUM、曲线估计; 7.非参数检验:单一样本检验、双重相关样本检验、K重相关样本检验、双重独立样本检验、K重独立样本检验; 8.多重响应分析:交叉表、频数表; 9.预测数值结果和区分群体:K-means聚类分析、分级聚类分析、两步聚类分析、快速聚类分析、因子分析、主成分分析、最近邻元素分析; 10. 判别分析; 11.尺度分析; 12. 报告:各种报告、记录摘要、图表功能(分类图表、条型图、线型图、面积图、高低图、箱线图、散点图、质量控制图、诊断和探测图等); 13.数据管理、数据转换与文件管理; 二.数据文件的处理 SPSS数据文件是一种结构性数据文件,由数据的结构和数据的内容两部分构成,也可以说由变量和观测两部分构成。定义一个变量至少要定义它的两个属性,即变量名和变量类型其他属性可以暂时采用系统默认值,待以后分析过程中如果有需要再对其进行设置。在spss数据编辑窗口中单击“变量视窗”标签,进入变量视窗界面,即可对变量的各个属性进行设置。 1.创建一个数据文件数据 (1)选择菜单【文件】→【新建】→【数据】新建一个数据文件,进入数据编辑窗口。窗口顶部标题为“PASW Statistics数据编辑器”。 (2)单击左下角【变量视窗】标签进入变量视图界面,根据试验的设计定义每个变量类型。

词法分析器实验报告

词法分析器实验报告 一、实验目的及要求 本次实验通过用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);

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

实习二语法分析-自上而下分析 一、实验目的 使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。 二、实验内容 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为输入串长度*/

《汇编语言+微型计算机》课程设计实验报告

长江大学工程技术学院《汇编+微机》课程设计报告 ?? 数据采集系统的设计与调试 学生姓名:袁春云学号:200960720?序号:25 专业班级:计本60901 指导老师:李华贵许建国 报告日期: 2011 年9月10日 ???

一.课程设计题目:数据采集系统的设计与测试 利用《汇编语言+微型计算机》课程中所学的可编程接口芯片8253、8255A、ADC0809和微机内部的中断控制器8259A设计一个数据采集系统,并且编程与调试。 二.设计目的 1.通过本设计,使学生综合运用《微型计算机技术》、《汇编语言程序设计》以及电子技术等课程的内容,为以后从事计算机检测与控制奠定一定的基础。 2.主要掌握并行I/O接口芯片8253、8255A、ADC0809及中断控制芯片8259A等可编程器件的使用,掌握译码器74LS138的使用。 3.学会用汇编语言编写一个较完整的实用程序。 4.掌握微型计算机技术应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等步骤。 三.课程设计要求 1.功能要求 ①利用《汇编语言+微型计算机系统》课程中所学的可编程接口芯片8253、8255A、ADC0809和微机内部的中断控制器8259A(从保留的IRQ2或TRQ10端引入)设计一个数据采集系统、并且编程与调试。 ②用8253定时器定时10MS,每次定时10MS后启动一次模/数转换,要求对所接通道变化的模拟电压值进行采集。 ③每次模/数转换结束后,产生一次中断,在中断服务程序中,采集来的数字量被读入微处理器的累加器AL中,然后通过8255A输出到8个LED发光二极管显示。 2.设计所需器材与工具 ④微机原理与接口综合仿真实验平台。 ⑤可编程接口芯片8253、8255A、ADC0809和译码器芯片74LS138、74LS 245等。 ⑥可调电位器4.7KΩ一个。 ⑦其他逻辑器件、导线若干。 ⑧万用表、常用工具等。 四.设计思路 1. 4.7Ω电位器一端接+5V,一端接地,调节电位器得到变化的模拟电压,

c课程设计实验报告

c课程设计实验报 告

中南大学 本科生课程设计(实践)任务书、设计报告 (C++程序设计) 题目时钟控件 学生姓名 指导教师 学院交通运输工程学院 专业班级 学生学号 计算机基础教学实验中心 9月7日 《C++程序设计基础》课程设计任务书

对象:粉冶、信息、能源、交通工程实验2101学生时间: .6 2周(18~19周) 指导教师:王小玲 1.课程设计的任务、性质与目的 本课程设计是在学完《C++程序设计基础》课程后,进行的一项综合程序设计。在设计当中学生综合“面向对象程序设计与结构化程序设计”的思想方法和知识点,编制一个小型的应用程序系统。经过此设计进一步提高学生的动手能力。并能使学生清楚的知道开发一个管理应用程序的思想、方法和流程。 2.课程设计的配套教材及参考书 ●《C++程序设计》,铁道出版社,主编杨长兴刘卫国。 ●《C++程序设计实践教程》,铁道出版社,主编刘卫国杨长兴。 ●《Visual C++ 课程设计案例精编》,中国水力电力出版社,严华峰等编著。 3.课程设计的内容及要求 (1)自己任选一个题目进行开发(如画笔、游戏程序、练习打字软件等),要求利用MFC 工具操作实现。 (2)也可选一个应用程序管理系统课题(如:通讯录管理系统;产品入库查询系统;学生成绩管理;图书管理 等);

设计所需数据库及数据库中的数据表,建立表之间的关系。 设计所选课题的系统主封面(系统开发题目、作者、指导教师、日期)。 设计进入系统的各级口令(如系统管理员口令,用户级口令)。 设计系统的主菜单。要求具备下列基本功能: ●数据的浏览和查询 ●数据的统计 ●数据的各种报表 ●打印输出 ●帮助系统 多种形式的窗体设计(至少有查询窗体、输入窗体) 注意:开发的应用程序工作量应保证在2周时间完成,工作量不能太少或太多。能够2人合作,但必须将各自的分工明确。 4.写出设计论文 论文基本内容及撰写顺序要求: ●内容摘要 ●系统开发设计思想 ●系统功能及系统设计介绍 ●系统开发的体会

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

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

实验名称语法分析器 一、实验目的 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+"有词法错误!");

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