语法分析实验 语法分析(LR)

语法分析实验 语法分析(LR)
语法分析实验 语法分析(LR)

实验报告

课程名称编译原理

实验名称语法分析(LR)

班级计科1203

学号201207010321

姓名马万里

指导教师黄全舟

实验日期2015.5.21 二、实验原理

三、主要仪器设备

Pc机一台(装有vs2012)

四、主要代码及其说明

#include

#include

#include

using namespace std;

#define N 10

char*Action[][4]=

{//此处三维也可以

{"S3","S4","ERROR","ERROR"},

{"ERROR","ERROR","ERROR","acc"},

{"ERROR","ERROR","S5","R2"},

{"ERROR","ERROR","R3","R3"},

{"ERROR","ERROR","R4","R4"},

{"S3","S4","ERROR","ERROR"},

{"ERROR","ERROR","ERROR","R1"}};

Int GoTo[][2]={{1,2},{0,0},{0,0},{0,0},{0,0},{6,2},{0,0}};

char*GL[]={"L->E,L","L->E","E->a","E->b"};

int_Push(vector&State,vector&InChar,int a,char b) {

State.push_back(a);

InChar.push_back(b);

return a;

}

void_Pop(vector&State,vector&InChar,int cout)

{

while(cout)

{

State.pop_back();

InChar.pop_back();

cout--;

}

}

void PrinStack(vectorState,vectorInChar)//状态栈和栈中符号输出

{

vector::iterator iter_s=State.begin();

vector::iterator iter_i=InChar.begin();

for(;iter_s!=State.end();iter_s++)

{

cout<<*iter_s;

}

printf("\t");

for(;iter_i!=InChar.end();iter_i++)

{

cout<<*iter_i;

}

printf("\t\t");

}

void printInCh(char*InCh)//余留符号输出

{

while(*InCh!='\0')

{

printf("%c",*InCh);

InCh++;

}

printf("\t\t");

}

void printAanly(char a,int b)//输出分析动作

{

if(a=='S')

printf("S%d",b);

if(a=='R')

printf("R%d",b);

printf("\t\t");

}

void printNextState(char a,const char b)//输出下一状态

{

if(a=='S')

printf("%d",atoi(&b));

}

int Lcount(char*p)//判断文法右边符号的个数

{

int m=0;

while(*p!='\0')

{

if(*p=='>') m=1;

if(m>0) m++;

p++;

}

return(m-2);

}

void menu()

{

printf("步骤\t状态\t栈中符号\t余留符号\t分析动作\t下一状态"); }

void main()

{

cout<<"请输入符号串(\"以#标记结束\"):";

vectorState;//状态栈

vectorInChar;//栈中的符号

State.push_back(0);

InChar.push_back('#');

char*InCh;//输入的字符串InCh=(char*)malloc(sizeof(char)*N);

gets(InCh);

printf("\n****************************符号串%s的LR分析过程****************************\n\n",InCh);

menu();

int ToS=0,InS=0,count=0;

while(strncmp(Action[ToS][InS],"acc",3))

{

count++;//步骤序号

if(!strncmp(Action[ToS][InS],"ERROR",5))

{

printf("error");

break;

}

else if(!strncmp(Action[ToS][InS],"S",1))

{

int temp;

printf("\n%d\t",count);

PrinStack(State,InChar);

switch(Action[ToS][InS][1])

{

case'1':temp=_Push(State,InChar,1,*InCh);break;

case'2':temp=_Push(State,InChar,2,*InCh);break;

case'3':temp=_Push(State,InChar,3,*InCh);break;

case'4':temp=_Push(State,InChar,4,*InCh);break;

case'5':temp=_Push(State,InChar,5,*InCh);break;

}

printInCh(InCh);

printAanly('S',atoi(&Action[ToS][InS][1]));

printNextState('S',Action[ToS][InS][1]);

ToS=temp;

InCh++;

if(*InCh=='a')InS=0;

if(*InCh=='b')InS=1;

if(*InCh==',')InS=2;

if(*InCh=='#')InS=3;

}

else if(!strncmp(Action[ToS][InS],"R",1))

{

int itemp;

int ntemp;

int temp;

char ctemp;

printf("\n%d\t",count);

PrinStack(State,InChar);

int f=atoi(&Action[ToS][InS][1])-1;

itemp=Lcount(GL[f]);//右部的符号个数

_Pop(State,InChar,itemp);//删除两栈中的tem个字符

ctemp=*GL[f];//获取当前文法的左边字符

if(ctemp=='L')

temp=0;

if(ctemp=='E')

temp=1;

ToS=State.back();

ntemp=GoTo[ToS][temp];//获取当前的下一状态

_Push(State,InChar,ntemp,ctemp);

printInCh(InCh);

printAanly('R',f+1);

printf("GOTO[%d,%c]=%d",ToS,ctemp,ntemp);

ToS=ntemp;

}

}

count++;

//处理当acc时的情况

if(!strncmp(Action[ToS][InS],"acc",3))

{

printf("\n%d\t",count);

PrinStack(State,InChar);

printInCh(InCh);

printf("acc\n");

}

五、程序测试结果

输入:a,b,a#的执行过程如下

输入:a,,#的执行过程如下

本次试验相对来说比较有挑战性,但是如果利用现成的vs2012中动态数组(其底层实质还是栈)来实现还是比较轻松的,而且这只是语言语法方面,重要的是理解LR分析法的过程及其思想.而且在逻辑方面也要很清楚.总的来说这次试

验比较成功.

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

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

编译原理语法分析实验报告 - 班级:XXX 学号:XXX 姓名:XXX 年月日 1、摘要: 用递归子程序法实现对pascal的子集程序设计语言的分析程序 2、实验目的: 通过完成语法分析程序,了解语法分析的过程和作用 3、任务概述 实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用 4、实验依据的原理 递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。 递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。

为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的,,,如下: <程序>?<程序首部><分程序>。 <程序首部>?PROGRAM标识符; <分程序>?<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部分>?CONST<常量定义><常量定义后缀>;|ε <常量定义>?标识符=无符号整数 <常量定义后缀>?,<常量定义><常量定义后缀> |ε <变量说明部分>?VAR<变量定义><变量定义后缀> |ε <变量定义>?标识符<标识符后缀>:<类型>; <标识符后缀>?,标识符<标识符后缀> |ε <变量定义后缀>?<变量定义><变量定义后缀> |ε <类型>?INTEGER | LONG <过程说明部分>?<过程首部><分程序>;<过程说明部分后缀>|ε <过程首部>?PROCEDURE标识符<参数部分>; <参数部分>?(标识符: <类型>)|ε <过程说明部分后缀>?<过程首部><分程序>;<过程说明部分后缀>|ε <语句>?<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句> |<写语句>|<复合语句>|ε <赋值或调用语句>?标识符<后缀> <后缀>?:=<表达式>|(<表达式>)|ε <条件语句>?IF<条件>THEN<语句> <当型循环语句>?WHILE<条件>DO <语句> <读语句>?READ(标识符<标识符后缀>)

【实验报告】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); }

语法分析实验

一、实验目的及内容 实现下述我们定义的语言的语法分析器 这种语言的程序结构很简单,语法相当于c的函数体,即由一对大括号括起来的语句序列,没有过程或函数。声明语句、表达式语句及控制语句的写法都与c 类似,但规定:一条声明语句只能声明一个整型变量,没有数组;控制语句只是if、for和while三个语句,这三个语句本身也可以包含语句序列;表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用<,>,<=,>=,= =,!=比较运算符;算术表达式可以包括整型常数、变量以及+,-,*,/这四个运算符。另外,还可以有复合语句。用read和write语句实现输入输出。注释用/*和*/括起来,但注释不能嵌套。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 实验所用的产生式: <程序> →‘{’ <声明序列> <语句序列> ‘}’ <声明序列> → <声明语句> { <声明语句> } <声明语句> → int <标志符>; <语句序列> → <语句> { <语句> } <语句> → | | | | | <复合语句> | <表达式语句> → if (<表达式>) <语句> [ else <语句> ] → while (<表达式>) <语句> → for (<表达式>;<表达式>;<表达式>) <语句> → read <标识符>; → write <表达式>; <复合语句> →‘{ ’ <语句序列>‘ }’ <表达式语句> → <表达式>; | ; <表达式> → <布尔表达式> | <标志符> = <布尔表达式>

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

语法分析程序实验报告及代码

LL(1)语法分析实验报告 一、实验题目 LL(1)语法分析 二、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。 三、实验内容 构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。 消除递归前的文法消除递归和提取公因子后的等价文法 S →S ∨ a T | a T | ∨ a T S→aTS’ |vaTS’ T →∧ a T | ∧a S’→vaTS’ |ε T→∧ a T’ T’→∧ aT’ |ε 根据已建立的分析表,对下列输入串:a∧ a∧ a进行语法分析,判断其是否符合文法。 四、实验要求 1.根据已由的文法规则建立LL(1)分析表; 2.输出分析过程。 请输入待分析的字符串: a∧ a∧ a 符号栈输入串所用产生式

#S a∧ a∧ a# #S’Ta a∧ a∧ a# S→aTS’ #S’T ∧ a∧ a# # S’T’a∧∧ a∧ a# T→∧ a T’ # S’T’a a∧ a# # S’T’∧ a# # S’T’a∧∧ a# T’→∧ aT’ # S’ T’a a# # S’ T’# # S’ # T’→ε # # S’→ε 五、程序思路 模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。 六、程序源代码 /* 程序名称: LL(1)文法分析程序 */ /* S->S>aT|aT|>aT */ /* T->

编译原理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检验

词法分析器实验报告

词法分析器实验报告 一、实验目的及要求 本次实验通过用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为输入串长度*/

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+"有词法错误!");

实验二语法分析

实验二、语法分析 一、实验目的: 设计MiniC的上下文无关文法,利用JavaCC生成调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、语法分析器: 按照MiniC语言的语法规则检查词法分析输出的记号流是否符合这些规则,并根据这些规则所体现出的语言中的各种语法结构的层次性。把规则写入到JavaCC的.jjt文件中,可以生成树状的层次结构。 三、JavaCC: 在JavaCC的文法规范文件中,不仅可以描述语言的语法规范,而且可以描述词法规范,本次实习中,利用JavaCC以MiniC语言构造一个不含语义分析的编译器前端,包括词法分析、语法分析,并要考虑语法分析中的错误恢复问题。通过使用JavaCC, 可以体会LL(k)文法的编写特点,掌握编写JavaCC文法规范文件的方法。 内容:利用JavaCC生成一个MiniC的语法分析器; 要求: 1.用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。 2.具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示 3.如果输入的源程序符合MiniC的语法规范,输出该程序的层次结构的语法树 具体实施步骤如下: 1.把MiniC转换为文法如下 Procedure()→void main() {WhileStatement()} WhileStatement()→while(Condition()){(WhileStatement()|ass ign())} assign()→= ; expression()→term() (( + | - ) term()) term()→unary() (( * | / ) unary()) unary()→| | ( expression()) Condition()→expression()( < expression() | > expression() | >= expression() | <= expression() )

相关与回归分析实验报告

课程论文 题目统计学实验 学院数学与统计学院 专业金融数学 班级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

相关文档
最新文档