当前位置:文档之家› LR 分析方法程序设计原理与实现技术

LR 分析方法程序设计原理与实现技术

LR 分析方法程序设计原理与实现技术
LR 分析方法程序设计原理与实现技术

LR 分析方法程序设计原理与实现技术1

郑杰09274053

本实验程序中的一些约定:在工程文件main.h中定义所有函数,和数据结构。在

符号方面,$S定义为拓广文法的新引入的起始符号,$START不能和$S一样,并

且,为了方便,在原来的产生式上强行加上这么一条产生式$S $START,这一点

在main.c中定义文法可以看出来,并且该产生式加在产生式集的首要位置。

状态栈的设计引用以前程序中的数据结构,但是栈操作在本程序中有所扩展。

下面按照程序编写过程顺序介绍各个模块:

一.文法产生式扩展

由原来的产生式拓展成为加’.’的文法,并且在这个过程中要引入新的起始符号,但是在程序中并没有在这个过程中这么做,原因是因为在原来的产生式集中已经引入新的符号以及产生式,根据原始产生式集计算所需要存储新的拓展产生式集的所需要的产生式个数,然后动态开辟内存空间,再对每个原始产生式的各个位置加'.'。

在本次程序中用来产生拓展文法产生式集的函数定义如下:

PPRO ParseProArray(

PPRO lpPriProArr,

int iProLen,

int *iParsedLen)

//参数说明:

lpPriProArr:PPRO原始产生式集

iProLen:int原始产生式个数

iParsedLen:int*;拓展产生式集的个数返回值

//返回值:拓展产生式集的首地址

二.CLOSURE闭包求取

在介绍求一个项目集的闭包前,先介绍程序中存储项目集(状态)的数据结构:

typedef struct _ITEM_COLLOECTION

{

int iCount;//项目集合中的产生式个数

int iSeqNumber;//项目集合(状态)的状态号

PPRO ProCollection[MAX_ITEM_COUNT];//产生式集合的引用数组

struct _ITEM_COLLOECTION * nextCollection;//由于程序中项目集合之间存储组织是单向链表,因此有这个域

struct _GO{//GOTO映射数组,

byte Symbol;//经历当前符号

struct _ITEM_COLLOECTION * DestStatus;//跳转的下一个状态(项目集合)的引用

}GO_MAP[SYMBOL_COUNT];//由符号个数来定义这个数组的长度

}ITEM_COLL,*PITEM_COLL;

1编译原理第五次实验报告.

求解一个项目集合的CLOSURE闭包的具体方法是

1.对于给定的项目集I,对于I中的的每一个产生式属于

2.对于现有的闭包集合中的产生式A-->a.Xb,其中X是非终结符,那么对于文法拓展的产生式X-->.Y均属于CLOSURE(I)。迭代这个过程直到收敛为止。

程序中沿用之前程序中收敛方式,引入一下函数:

int AddPro(PITEM_COLL pColl,PPRO ppro,int *iVar)

//这个函数往项目集中加入产生式

//iVar的值为在函数成功调用的时候返回加入产生式前后的变化

//iVar==0说明这个函数在此次调用中并没有加入新的产生式,即该产生式重复

//iVar==1说明加入的产生式为之前不存在的

在上述求闭包的过程中进行一次完整的查找遍历时候,每次调用AddPro的时候,若都iVar==0,则说明可以收敛了。

产生CLOSURE闭包的函数定义如下:

PITEM_COLL GetClosure(

PPRO lpProArray,

PITEM_COLL lpSrcColl,

int iProLen)

//参数说明:lpSrcColl:PPRO ,拓展文法产生式数组

//lpSrcColl:PITEM_COLL源状态

//iProLen:int

//返回值:闭包集

三.创建项目集规范族

创建项目集规范族的过程也是一个收敛迭代过程,以状态(项目集)为单位,对于每一个符号S,在这个项目集中查找右部形如-->.Sb的产生式,获取其后继项目2,,对于所有满足条件的后继项目所组成的集合,当这个项目集不为空时,再获取其闭包,这个闭包就是项目集合,但是这个项目集合有可能与之前的项目集合重复3,因此不能在没有判断是否重复的情况下加入的项目集规范族。

程序中构建项目集规范族的函数在程序中如下定义:

void ConstructItemCollFamily(

PITEM_COLL lpCollHeader,

PPRO lpProArray,

int iProLen,

PITEM_COLL lpInitStatus)

//lpCollHeader:PITEM_COLL:项目族的链表头

//lpProArray:PPRO原始产生式数组

//iProLen:int 原始产生式数组长度

//lpInitStatus:PITEM_COLL:初始状态

函数返回后,以lpCollHeader为首的状态链表中蕴含了能够识别所有活前缀的有穷自动机。状态变迁隐含在项目集族的每一个项目集中GO_MAP:struct _GO数组域中,数组的长度为

2程序中获取后继项目的函数在程序中定义为:

PPRO GetSubSeqItem(PPRO lpProArray,int iProLen,PPRO lpCurPro)

3程序中判断项目集合产生式相等的函数定义:

int BeEqualColl(PITEM_COLL Coll1,PITEM_COLL Coll2);

int beEqualPro(PPRO lpPro1,PPRO lpPro2);

文法中所有的除了拓广文法起始符号的所有符号。

四.构建LR(0)分析表(状态迁移函数)

在程序中,建表的目的是为了提高程序处理速度,但是在本程序中为了处理方便和表中元素统一格式存储,并没有构造一张内存中真实的查找表,取而代之的是一个状态字获取函数,函数返回一个状态字4这个状态字有两个字节构成:状态字节和内容字节,下面是图示:状态字图示:

程序中定义如下函数获取状态字:

word GetStatusWord(

PITEM_COLL lpCollHeader,

PPRO lpProArray,

int iProLen,

byte bCurStatus,

byte bSymbol)

//参数描述

4借鉴Window消息参数构造方式

typedef unsigned char byte;

typedef unsigned short word;

并且定义三个字节重组字的宏和字拆分为字节的宏

#define MAKEWORD(highbyte,lowbyte) ((word)((0xff&(highbyte))<<8|(0xff&(lowbyte))))

#define HIBYTE(data) ((byte)((data)>>8))

#define LOWBYTE(data) ((byte)data)

例如:word wd=MAKEWORD(0xff,0x12)

那么HIBYTE(wd)==0xff,LOWBYTE(wd)==0x12

lpCollHeader:项目集规范族的链表首,DFA的表示

lpProArray:原始产生式数组

iProLen:产生式数组长度

bCurStatus:当前状态

bSymbol:遇到的符号

**当前状态和符号用来在LR(0)分析表中作为索引查找ACTION或者GOTO元素

**但是在程序中没有构造这张表,而是从DFA(项目集族中的)实时查找

//返回值说明:

由图示中可以看出,返回的状态字类型有五种

1.遇到终结符号移进:return MAKEWORD(VS_FLAG,迁移的状态序号);

2.遇到非终结符号移进return MAKEWORD(NS_FLAG,迁移的状态序号);

3.遇到非终结符规约(规约产生式左部不是拓广文法起始符号遇到'#'):

return MAKEWORD(R_FLAG,规约产生式序号);

4.当遇到"#"符号,并且规约产生式左部是拓广文法起始符号:

return MAKEWORD(ACC_FLAG,0);

5.其余情况:return MAKEWORD(ERR_FLAG,0);

五.分析总控程序

状态栈:状态栈的数据结构沿用之前程序中的定义,但是在每次试验中添加了新操作: byte Peek(LPSTACK lpStack);

这个函数的作用是返回栈顶元素的内容,但是实际上并不做退栈工作。

在程序中只设置一个状态栈,没有设置符号栈

下面是驱动程序的伪代码:

Push(0);//入展初始状态

//inPtr是输入符号指针

while(1)

{

StatusWord=GetStatusWord(CurStatus,szInput[inPtr]);

switch(HIBYTE(StatusWord))

{

case VS_FLAG:

Push(CurStatus=LOWBYTE(StatusWord));

inPtr++;

break;

case ACC_FLAG:

puts("Accept Successfully");

return 1;

break;

case R_FLAG:

lpProBuff=lpProArray+LOWBYTE(StatusWord);

for(idx_buff=0;lpProBuff->rightTerArr[idx_buff];idx_buff++)Pop ();//以当前规约产生式的右部符号个数做POP操作

StatusWord=GetStatusWord(Peek(&StatusStack),lpProBuff->leftNon Ter);//以当前栈顶的状态和规约产生式左部符号

if(HIBYTE(StatusWord)!=NS_FLAG){ReportError();;return 0;}//在这种情况下应该标志NS_FLAG

Push(CurStatus=LOWBYTE(StatusWord));

break;

case NS_FLAG:

default:

ReportError();

return 0;

}

}

分析函数的定义如下:

int AnalyzeInput(

PITEM_COLL lpCollHeader,

PPRO lpProArray,

int iProLen,

byte bInputStr[]);

//说明:

1.bInputStr是待分析的符号数组,必须以$SHARP结尾

2.分析成功返回1,错误返回0

示例演示分析:

1.项目集规范族和DFA的演示:

在main.c中定义文法:定义如下产生式:

PRO PrimitiveProArray[]=

{

{$S,$START,0},//Should Exists In Every Grammer,in terms of Extending This Grammer

{$E,$a,$A,0},

{$E,$b,$B,0},

// {$E,$B,0},//Used For Test Production

{$A,$c,$A,0},

{$A,$d,0},

{$B,$c,$B,0},

{$B,$d,0}

};

下面分别对两种情况中间结果进行罗列:

不存在红色注释的产生式存在上述上产生

拓广文法:(说明:图中的产生式均为main.h中宏定义码,其中$DOT==5,S'==81)

0 .81-->5 82

1 .81-->8

2 5

2 .82-->5 1 83

3 .82-->1 5 83

4 .82-->1 83 5

5 .82-->5 2 84

6 .82-->2 5 84

7 .82-->2 84 5

8 .83-->5 3 83

9 .83-->3 5 83

10.83-->3 83 5

11.83-->5 4

12.83-->4 5

13.84-->5 3 84

14.84-->3 5 84

15.84-->3 84 5

16.84-->5 4

17.84-->4 5 拓广文法:

0 .81-->5 82

1 .81-->8

2 5

2 .82-->5 1 83

3 .82-->1 5 83

4 .82-->1 83 5

5 .82-->5 2 84

6 .82-->2 5 84

7 .82-->2 84 5

8 .82-->5 84

9 .82-->84 5

10.83-->5 3 83

11.83-->3 5 83

12.83-->3 83 5

13.83-->5 4

14.83-->4 5

15.84-->5 3 84

16.84-->3 5 84

17.84-->3 84 5

18.84-->5 4

19.84-->4 5

项目集族和DFA

0 .Collection Total Item:3

(0)Item Pro:81--> 5 82

(1)Item Pro:82--> 5 1 83

(2)Item Pro:82--> 5 2 84 [0]Status Transit:--82-->1 0 .Collection Total Item:6

(0)Item Pro:81--> 5 82

(1)Item Pro:82--> 5 1 83

(2)Item Pro:82--> 5 2 84

(3)Item Pro:82--> 5 84

(4)Item Pro:84--> 5 3 84

[3]Status Transit:--1 -->2

[4]Status Transit:--2 -->3 1 .Collection Total Item:1

(0)Item Pro:81-->82 5

2 .Collection Total Item:3

(0)Item Pro:82--> 1 5 83

(1)Item Pro:83--> 5 3 83

(2)Item Pro:83--> 5 4

[1]Status Transit:--83-->4

[5]Status Transit:--3 -->5

[6]Status Transit:--4 -->6 3 .Collection Total Item:3

(0)Item Pro:82--> 2 5 84

(1)Item Pro:84--> 5 3 84

(2)Item Pro:84--> 5 4

[2]Status Transit:--84-->7

[5]Status Transit:--3 -->8

[6]Status Transit:--4 -->9 4 .Collection Total Item:1

(0)Item Pro:82--> 1 83 5 5 .Collection Total Item:3

(0)Item Pro:83--> 3 5 83

(1)Item Pro:83--> 5 3 83

(2)Item Pro:83--> 5 4

[1]Status Transit:--83-->10

[5]Status Transit:--3 -->5

[6]Status Transit:--4 -->6 6 .Collection Total Item:1

(0)Item Pro:83--> 4 5

7 .Collection Total Item:1

(0)Item Pro:82--> 2 84 5 8 .Collection Total Item:3

(0)Item Pro:84--> 3 5 84

(1)Item Pro:84--> 5 3 84

(2)Item Pro:84--> 5 4

[2]Status Transit:--84-->11

[5]Status Transit:--3 -->8

[6]Status Transit:--4 -->9 9 .Collection Total Item:1

(0)Item Pro:84--> 4 5

10 .Collection Total Item:1

(0)Item Pro:83--> 3 83 5 11 .Collection Total Item:1

(0)Item Pro:84--> 3 84 5 (5)Item Pro:84--> 5 4

[0]Status Transit:--82-->1

[2]Status Transit:--84-->2

[3]Status Transit:--1 -->3

[4]Status Transit:--2 -->4

[5]Status Transit:--3 -->5

[6]Status Transit:--4 -->6 1 .Collection Total Item:1

(0)Item Pro:81-->82 5

2 .Collection Total Item:1

(0)Item Pro:82-->84 5

3 .Collection Total Item:3

(0)Item Pro:82--> 1 5 83

(1)Item Pro:83--> 5 3 83

(2)Item Pro:83--> 5 4

[1]Status Transit:--83-->7

[5]Status Transit:--3 -->8

[6]Status Transit:--4 -->9 4 .Collection Total Item:3

(0)Item Pro:82--> 2 5 84

(1)Item Pro:84--> 5 3 84

(2)Item Pro:84--> 5 4

[2]Status Transit:--84-->10

[5]Status Transit:--3 -->5

[6]Status Transit:--4 -->6 5 .Collection Total Item:3

(0)Item Pro:84--> 3 5 84

(1)Item Pro:84--> 5 3 84

(2)Item Pro:84--> 5 4

[2]Status Transit:--84-->11

[5]Status Transit:--3 -->5

[6]Status Transit:--4 -->6 6 .Collection Total Item:1

(0)Item Pro:84--> 4 5

7 .Collection Total Item:1

(0)Item Pro:82--> 1 83 5 8 .Collection Total Item:3

(0)Item Pro:83--> 3 5 83

(1)Item Pro:83--> 5 3 83

(2)Item Pro:83--> 5 4

[1]Status Transit:--83-->12

[5]Status Transit:--3 -->8

[6]Status Transit:--4 -->9 9 .Collection Total Item:1

(0)Item Pro:83--> 4 5

10 .Collection Total Item:1

(0)Item Pro:82--> 2 84 5 11 .Collection Total Item:1

(0)Item Pro:84--> 3 84 5 12 .Collection Total Item:1

(0)Item Pro:83--> 3 83 5

说明:

1.上述每个单元分别代表一个状态(项目集)

2.红色标注的是接收状态

3.蓝色标记的是规约状态,可以看出其中项目产生式均是以"."结尾

4.其余均为移进项目,状态迁移为:

迁移说明:Status Transit:--4 -->9

当前状态在遇到符号4(宏定义码)的时候移进并状态迁移到9,由前述可知当前情况下查表返回VS_FLAG标志的状态字。

2.输入分析符号串测试

有原始文法可以识别的符号串为ac*d和bc*d

样例1:{$a,$c,$c,$d,$SHARP}

输出:

样例2:{$a,$d,$SHARP}

样例3:{$a,$a,$c,$c,$d,$SHARP}

3.修改文法后进行样例测试:

修改,添加产生式:{$E,$B,0}

在添加这条式后,文法能识别的形式为:ac*d和bc*d和c*d

下面以{$c,$c,$c,$c,$d,$SHARP}

实验2层次分析法

项目六矩阵的特征值与特征向量 实验2 层次分析法 实验目的 通过应用层次分析法解决一个实际问题,学习层次分析法的基本原理与方法;掌握用层次 分析法建立数学模型的基本步骤;学会用Mathematica解决层次分析法中的数学问题. 基本原理 层次分析法是系统分析的重要工具之一,其基本思想是把问题层次化、数量化, 并用数学 方法为分析、决策、预报或控制提供定量依据. 它特别适用于难以完全量化, 又相互关联、相互制约的众多因素构成的复杂问题. 它把人的思维过程层次化、数量化,是系统分析的一中 新型的数学方法. 运用层次分析法建立数学模型, 一般可按如下四个基本步骤进行. 1.建立层次结构 首先对所面临的问题要掌握足够的信息, 搞清楚问题的范围、因素、各因素之间的相互关系,及所要解决问题的目标. 把问题条理化、层次化, 构造出一个有层次的结构模型. 在这 个模型下,复杂问题被分解为元素的组成部分. 这些元素又按其属性及关系形成若干层次.层 次结构一般分三层: 第一层为最高层, 它是分析问题的预定目标和结果, 也称目标层; 第二层为中间层, 它是为了实现目标所涉及的中间环节, 如: 准则、子准则, 也称准则层; 第三层为最底层, 它包括了为实现目标可供选择的各种措施、决策方案等, 也称方案层.

图2-1 决策目标 准则1准则2准则n 方案1方案2方案m …… …… 注:上述层次结构具有以下特点:(1) 从上到下顺序地存在支配关系, 并用直线段表示;(2) 整个层次结构中层次数不受限制. 2.构造判断矩阵 构造判断矩阵是建立层次分析模型的关键. 假定以上一层的某元素y 为准则,它所支配 的下一层次的元素为n x x x ,,,21 ,这n 个元素对上一层次的元素y 有影响,要确定它们在y 中的比重. 采用成对比较法. 即每次取两个元素i x 和j x , 用ij a 表示i x 与j x 对y 的影响之比, 全部比较的结果可用矩阵A 表示,即 .,,2,1,,)(n j i a A n n ij ==? 称矩阵A 为判断矩阵. 根据上述定义,易见判断矩阵的元素ij a 满足下列性质: )(,1),(1 j i a j i a a ii ij ji ==≠= 当0>ij a 时,我们称判断矩阵A 为正互反矩阵. 怎样确定判断矩阵A 的元素ij a 的取值呢? 当某层的元素n x x x ,,,21 对于上一层某元素 y 的影响可直接定量表示时, i x 与j x 对y 的影响之比可以直接确定, ij a 的值也可直接确定. 但对于大多数社会经济问题, 特别是比较 复杂的问题, 元素i x 与j x 对y 的重要性不容易直接获得, 需要通过适当的量化方法来解决. 通常取数字1~9及其倒数作为ij a 的取值范围. 这是因为在进行定性的成对比较时, 通常采用 5级制(表1),在每两个等级之间各有一个中间状态, 共1~9个尺度, 另外心理学家认为进行成 对比较的因素太多, 将超出人们的判断比较能力, 降低精确. 实践证明, 成对比较的尺度以 27±为宜, 故ij a 的取值范围是9,,2,1 及其倒数.

材料分析方法实验报告

篇一:材料分析方法实验报告 篇二:材料分析方法课程设计报告 材料分析测试方法 课程设计(论文) 题目:磁控溅射c/w多层膜成分及微观分析 学院材料科学与工程 专业材料化学 班级材化082 学生王维娜 学号 3080101296 指导教师陈迪春 起止时间 2010.12.27-2011.1.1 年 材料分析测试方法课程设计任务书 课程设计内容要求: 掌握高分辨透射电子显微镜样品制备方法,学习并了解真空镀膜 技术-磁控溅射技术,多层膜制备过程,以及其微观结构分析,成分 分析所用仪器和原理。 学生(签名) 月日 材料分析测试方法课程设计评语 指导教师(签名) 年日 目录 材料分析测试方法 ............................................................................. .. (1) 1.1 磁控溅射 ............................................................................. (5) 1.2 x射线衍射仪 ............................................................................. . (5) 1.3 透射电子显微镜 ............................................................................. (6) 1.4 x射线光电子能谱仪(xps) ........................................................................ (7) 第二章实验方法 ............................................................................. .. (9) 2.1 tem样品的制备方法 .............................................................................

c语言编译原理预测分析法实验报告

编译原理 实 验 报 告 目的要求 1.构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法 分析。 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

源程序: //LL(1)预测分析控制程序 #include #include #include 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];

编译原理实验--词法分析器

编译原理实验--词法分析器 实验一词法分析器设计 【实验目的】 1(熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。 2(复习高级语言,进一步加强用高级语言来解决实际问题的能力。 3(通过完成词法分析程序,了解词法分析的过程。 【实验内容】 用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符 串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字, 运算符,标识符,常数以及界符)输出。 【实验流程图】

【实验步骤】 1(提取pl/0文件中基本字的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) {

if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {printf("%s\t",wsym[m]);m=14;n=k+1;} } 2(提取pl/0文件中标识符的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]=" "; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) { if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {m=14;n=k+1;} } if(m==13) for(m=0;a[m]!=NULL;m++) printf("%c ",a[m]);

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理语法分析程序设计分析法

1.实验目的:掌握LL(1)分析法的基本原理,掌握LL(1)分析表的构造方法,掌握LL(1) 驱动程序的构造方法。 2.实验要求:实现LR分析法(P147,例)或预测分析法(P121,例)。 3.实验环境:一台配置为1G的XP操作系统的PC机;Visual C++. 4.实验原理:编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语 法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该 语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单 位。编译程序的语法规则可用上下文无关文法来刻画。 语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法 的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想 是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生 式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。 自顶向下带递归语法分析:1、首先对所以的生成式消除左递归、提取公共左因子 2、在源程序里建立一个字符串数组,将所有的生成式都存在这个数组中。 3、给每个非终结符写一个带递归的匹配函数,其中起始符的函数写在main函数里。 这些函数对生成式右边从左向右扫描,若是终结符直接进行匹配,匹配失败,则调用出错函 数。如果是非终结符则调用相应的非终结符函数。 4、对输入的符号串进行扫描,从起始符的生成式开始。如果匹配成功某个非终结符 生成式右边的首个终结符,则将这个生成式输出。匹配过程中,应该出现的非终结符没有出 现,则出错处理。 5.软件设计与编程:对应源程序代码: #include <> #include <> #include using namespace std; struct Node1 { char vn; char vt; char s[10]; }MAP[20]; n==vn && MAP[i].vt==vt) {return MAP[i].s;} } return "error";} char * Analyse(char * word) { char p,action[10],output[10]; int i=1,j,l=strlen(word),k=0,l_act,m; while(!()) {();} ('#'); (start); printf("___________________________________________________________\n"); printf("\n 对符号串%s的分析过程\n",word); printf(" -----------------------------------------------------------------------\n

材料分析(SEM)实验报告

材料专业实验报告 题目:扫描电镜(SEM)物相分析实验学院:先进材料与纳米科技学院专业:材料物理与化学 姓名: 学号:1514122986 2016年6月30日

扫描电镜(SEM)物相分析实验 一.实验目的 1.了解扫描电镜的基本结构与原理 2.掌握扫描电镜样品的准备与制备方法 3.掌握扫描电镜的基本操作并上机操作拍摄二次电子像 4.了解扫描电镜图片的分析与描述方法 二.实验原理 1.扫描电镜的工作原理 扫描电镜(SEM)是用聚焦电子束在试样表面逐点扫描成像。试样为块状或粉末颗粒,成像信号可以是二次电子、背散射电子或吸收电子。其中二次电子是最主要的成像信号。由电子枪发射的电子,以其交叉斑作为电子源,经二级聚光镜及物镜的缩小形成具有一定能量、一定束流强度和束斑直径的微细电子束,在扫描线圈驱动下,于试样表面按一定时间、空间顺序作栅网式扫描。聚焦电子束与试样相互作用,产生二次电子发射以及背散射电子等物理信号,二次电子发射量随试样表面形貌而变化。二次电子信号被探测器收集转换成电讯号,经视频放大后输入到显像管栅极,调制与入射电子束同步扫描的显像管亮度,得到反映试样表面形貌的二次电子像。 本次实验中主要通过观察背散射电子像及二次电子像对样品进行分析表征。 1)背散射电子 背散射电子是指被固体样品原子反射回来的一部分入射电子,其中包括弹性背反射电子和非弹性背反射电子。弹性背反射电子是指被样品中原子和反弹回来的,散射角大于90度的那些入射电子,其能量基本上没有变化(能量为数千到数万电子伏)。非弹性背反射电子是入射电子和核外电子撞击后产生非弹性散射,不仅能量变化,而且方向也发生变化。非弹性背反射电子的能量范围很宽,从数十电子伏到数千电子伏。背反射电子的产生范围在100nm-1mm深度。背反射电子产额和二次电子产额与原子序数的关系背反射电子束成像分辨率一般为50-200nm(与电子束斑直径相当)。背反射电子的产额随原子序数的增加而增加,所以,利用背反射电子作为成像信号不仅能分析形貌特征,也可以用来显示原子序数衬

编译原理 语法分析器 (java完美运行版)

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

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

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 …< >?为非终结符。 …::=? 该符号的左部由右部定义,可读作“定义为”。 …|? 表示…或?,为左部可由多个右部定义。 …{ }? 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 …[ ]? 表示方括号内的成分为任选项。 …( )? 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号…?括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

编译原理实验报告材料(预测分析报告表方法)

预测分析表方法 一、实验目的 理解预测分析表方法的实现原理。 二、实验内容: 编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。 三、实验步骤 1.算法数据构造: 构造终结符数组:char Vt[10][5]={“id”,”+”……}; 构造非终结符数组:char Vn[10]={ }; 构造follow集数组:char *follow[10][10]={ } (可将follow集与预测分析表合并存放) 数据构造示例(使用的预测分析表构造方法1): /*data1.h简单算术表达式数据*/ char VN[10][5]={"E","E'","T","T'","F"}; //非终结符表 int length_vn=5; //非终结符的个数 char VT[15][5]={"id","+","*","(",")","#"}; //终结符表 int length_vt=6; //终结符的个数 char Fa[15][10]={"TE'","+TE'","","FT'","*FT'","","(E)","id"}; //产生式表:0:E->TE' 1:E'->+TE' 2:E'->空 // 3:T->FT' 4:T'->*FT' 5:T'->空 6:F->(E) 7:F->id int analysis_table[10][11]={0,-1,-1,0,-2,-2,0,0,0,0,0, -1,1,-1,-1,2,2,0,0,0,0,0, 3,-2,-1,3,-2,-2,0,0,0,0,0, -1,5, 4,-1,5, 5,0,0,0,0,0, 7,-2,-2,6,-2,-2,0,0,0,0,0}; //预测分析表,-1表示出错,-2表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组Fa 中的编号,0表示多余的列。 (1)预测分析表的构造方法1 给文法的正规式编号:存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。如上述Fa数组表示存储产生式。 构造正规式数组:char P[10][10]={“E->TE’”,”E’->+TE’”,……..}; (正规式可只存储右半部分,如E->TE’可存储为TE’,正规式中的符号可替换,如可将E’改为M ) 构造预测分析表:int analyze_table[10][10]={ } //数组元素值存放正规式的编号,-1表示出错 (2)预测分析表的构造方法2 可使用三维数组 Char analyze_table[10][10][10]={ }

AHP层次分析法计算原理

AHP层次分析法计算原理 一般地,可以选用三层结构对发展战略作出整体评价。 第一层为目标层,它是企业要实现的战略目标,第二层是评价因素层,它包括战略目标实现进行评价的所考虑的各种因素以及各因素之间的相对比值,并求出各要素实现总体目标所占的权重。第三层是指标层,即个评价因素需考虑的具体指标。 首先,根据总目标确定各要素之间的相对重要关系,构建两两比较判断矩阵,其基本形式为: 其中,a j表示对于C来说,A对A相对重要性的数值体现,通常a j可取1、2、3……、9以及它们的倒数作为标度。其中, 1――表示两个元素相比,具有同样的重要性; 3――表示两个元素相比,一个元素比另一个元素稍微重要; 5――表示两个元素相比,一个元素比另一个元素明显重要; 7――表示两个元素相比,一个元素比另一个元素强烈重要; 9――表示两个元素相比,一个元素比另一个元素极端重要。 2、4、6、8为上述相邻判断的中值。 矩阵中的元素具有以下特征:①a j >0,②a j二丄,③a H=1o a ji 然后,根据判断矩阵计算相对于战略目标各评价元素的相对重要 性次序的权重,首先计算判断矩阵A的最大特征根入max和其对应的经归一化后的特征向量W=[W i, W2 , W3, , W n ]T,计算的公式为:(8 - 1)

归一化后的特征向量W=[W i, W2, W3, , W n]T即为各评价因素对于总目标的权重。 (8 - 2)W i - n W i i J 其 1 n 中,W = a j (8 - 3) 入max为判断矩阵A的最大特征根,计算公式为: (8 - 4) 其中,(AW)i表示AW的第i个元素。 最后,对矩阵A进行一致性检验。当a q二空时,称判断矩阵为a jk 致性矩阵。判断一致性的指标为C.R.的取值。 C.R.嚅 (8 - 5) (8 - 6) R丄为随机一致性指标,其值是通过多次重复进行随机判断矩阵特征值的计算后得到的。随机一致性指标R丄的取值见表8-2。 表8-2随机一致性指标R.I?的取值表 维数12 345 6 7 8 9 10 J (AW)i i吕nw

材料现代分析方法实验报告

力学与材料学院 材料现代分析方法实验报告二 XRD图谱分析 专业年级:1 姓名:1 指导老师:1 学号:1 2016年12月 中国南京 目录 实验名称:XRD图谱分析…………………………………………… 一、实验目的……………………………………………………

二、实验要求…………………………………………………… 三、操作过程…………………………………………………… 四、结果分析与讨论……………………………………………… 实验名称:XRD图谱分析 一、实验目的 了解XRD基本原理及其应用,不同物相晶体结构XRD图谱的区别,熟练掌握如何来分析利用X射线测试得到的XRD图谱。 二、实验要求

1、熟练掌握如何来利用软件打开、分析XRD图谱,以及输出分析结果。 2、明确不同物质的XRD图谱,掌握XRD图谱包含的晶体结构的关系,通过自己分析、数据查找和鉴别的全过程,了解如何利用软件正确分析和确定不同物相的XRD图谱,并输出分析结果。 3、实验报告的编写,要求报告能准确的反映实验目的、方法、过程及结论。 三、操作过程 1、启动Jade 6.0,并打开实验数据。 2、点击图标使图谱平滑后,再连续两次点击图标扣除背景影响。 3、右击工具栏中的图标,全选左侧的项目,取消选择右侧中的Use Chemistry Filter,最后在下方选择S/M Focus on Major Phases(如图一),并点击OK。 图一

4、得到物相分析,根据FOM值(越小,匹配性越高)可推断出该物相为以ZnO为主,可能含有CaF2、Al2O3、Mg(OH)2混合组成的物质(如图二),双击第一种物质可以得到主晶相的PDF卡片(如图三),点击图三版面中的Lines可以观察到不同角度处的衍射强度(如图四)。 图二

编译原理实验词法分析语法分析

本代码只供学习参考: 词法分析源代码: #include #include #include using namespace std; string key[8]={"do","end","for","if","printf","scanf","then","while"}; string optr[4]={"+","-","*","/"}; string separator[6]={",",";","{","}","(",")"}; char ch; //判断是否为保留字 bool IsKey(string ss) { int i; for(i=0;i<8;i++) if(!strcmp(key[i].c_str(),ss.c_str())) return true; return false; } //字母判断函数 bool IsLetter(char c) { if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'))) return true; return false; } //数字判断函数 bool IsDigit(char c) { if(c>='0'&&c<='9') return true; return false; } //运算符判断函数 bool IsOptr(string ss) { int i; for(i=0;i<4;i++) if(!strcmp(optr[i].c_str(),ss.c_str())) return true ; return false; } //分界符判断函数 bool IsSeparator(string ss) { int i; for(i=0;i<6;i++) if(!strcmp(separator[i].c_str(),ss.c_str()))

材料分析与表征方法实验报告

材料分析与表征方法实验报告 热重分析实验报告 一、实验目的 1.了解热重分析法的基本原理和差热分析仪的基本构造。 2.掌握热重分析仪的使用方法。 二、实验原理 热重分析指温度在程序控制时,测量物质质量与温度之间的关系的技术。热重分析所用的仪器是热天平,它的基本原理是,样品重量变化所引起的天平位移量转化成电磁量,这个微小的电量经过放大器放大后,送入记录仪记录;而电量的大小正比于样品的重量变化量。当被测物质在加热过程中有升华、汽化、分解出气体或失去结晶水时,被测的物质质量就会发生变化。 三、实验原料 一水草酸钙CaC2O4·H2O 四、实验仪器 美国TA公司TGA55 升温与降温速率(K/min)0.1-100℃/min 天平灵敏度(μg)0.1μg 温度范围(°C)室温-1000℃ 五、操作条件

第一组:10℃/min空气条件下和20℃/min空气条件下,对TG和DTG 曲线进行对比。 第二组:10℃/min空气条件下和10℃/min氮气条件下,对DSC进行对比。 第三组:10℃/min氮气条件下,得到TG、DTG、DSC曲线。 六、结果与讨论 含有一个结晶水的草酸钙(242CaC.OHO)在100℃以前没有失重现象,其热重曲线呈水平状,为TG曲线的第一个平台。DTG曲线在0刻度。 在100℃和200℃之间失重并出现第二个平台。DTG曲线先升后降,在108.4℃达到最大值,即失重速率的最大值。DSC曲线先降后升,在188.4℃达到最小值,即热功率的最小值。这一步的失重量占试样总质量的12.47%,相当于每mo CaC2O4·H2O失掉1mol H2O,其热分解反应为: CaC2O4·H2O CaC2O4 + H2O 在400℃和500℃之间失重并开始呈现第三个平台,DTG曲线先升后降,在

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

河南工业大学实验报告 课程编译原理实验名称实验二 LL(1)分析法 实验目的 1.掌握LL(1)分析法的基本原理; 2.掌握LL(1)分析表的构造方法; 3.掌握LL(1)驱动程序的构造方法。 一.实验内容及要求 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i 程序输入一以#结束的符号串(包括+*()i#),如:i+i*i#。输出过程如下: 步骤分析栈剩余输入串所用产生式 1E i+i*i#E->TG ............ 二.实验过程及结果 代码如下: #include #include "edge.h" using namespace std; edge::edge() { cin>>left>>right; rlen=right.length(); if(NODE.find(left)>NODE.length()) NODE+=left; }

string edge::getlf() { return left; } string edge::getrg() { return right; } string edge::getfirst() { return first; } string edge::getfollow() { return follow; } string edge::getselect() { return select; } string edge::getro() { string str; str+=right[0]; return str; } int edge::getrlen() { return right.length(); } void edge::newfirst(string w) { int i; for(i=0;ifirst.length()) first+=w[i]; }

编译原理实验报告2词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

编译原理-预测分析法(附源码)

预测分析法实验报告 一、实验项目名称 预测分析法 二、实验目的 根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。 三、实验环境 Windows 10 Microsoft Visual Studio 2015 四、实验内容 本次实验的LL(1)文法为表达式文法: E→E+T | T T→T*F | F F→i | (E) 编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示 五、源程序清单、测试数据、结果 #include #include using namespace std; const int NUM = 20;//初始化的栈的大小 //非终结符数组集 char Var[5] = { 'E','R','T','M','F' }; //终结符数组集 char Ter[6] = { 'i','+','*','(',')','#' }; string pred[5][6] = { { "TR","","","TR","","" },{ "","+TR","","","@","@" },{ "FM","","","FM","","" },{ ""," @","*FM","","@","@" },{ "i","","","(E)","","" } }; typedef struct { char *top; char *base; int stacksize; int num; }Stack;// 栈结构体 void init(Stack *ss) {//初始化栈 ss->base = (char *)malloc(NUM * sizeof(char)); if (!ss->base) exit(1); ss->top = ss->base; ss->stacksize = NUM; ss->num = 0; }

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

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

(完整版)层次分析法步骤

层次分析法实例与步骤 结合一个具体例子,说明层次分析法的基本步骤和要点。 【案例分析】市政工程项目建设决策:层次分析法问题提出 市政部门管理人员需要对修建一项市政工程项目进行决策,可选择的方案是修建通往旅游区的高速路(简称建高速路)或修建城区地铁(简称建地铁)。除了考虑经济效益外,还要考虑社会效益、环境效益等因素,即是多准则决策问题,考虑运用层次分析法解决。 1. 建立递阶层次结构 应用AHP解决实际问题,首先明确要分析决策的问题,并把它条理化、层次化,理出递阶层次结构。 AHP要求的递阶层次结构一般由以下三个层次组成: ●目标层(最高层):指问题的预定目标; ●准则层(中间层):指影响目标实现的准则; ●措施层(最低层):指促使目标实现的措施; 通过对复杂问题的分析,首先明确决策的目标,将该目标作为目标层(最高层)的元素,这个目标要求是唯一的,即目标层只有一个元素。 然后找出影响目标实现的准则,作为目标层下的准则层因素,在复杂问题中,影响目标实现的准则可能有很多,这时要详细分析各准则因素间的相互关系,即有些是主要的准则,有些是隶属于主要准则的次准则,然后根据这些关系将准则元素分成不同的层次和组,不同层次元素间一般存在隶属关系,即上一层元素由下一层元素构成并对下一层元素起支配作用,同一层元素形成若干组,同组元素性质相近,一般隶属于同一个上一层元素(受上一层元素支配),不同组元素性质不同,一般隶属于不同的上一层元素。 在关系复杂的递阶层次结构中,有时组的关系不明显,即上一层的若干元素同时对下一层的若干元素起支配作用,形成相互交叉的层次关系,但无论怎样,上下层的隶属关系应该是明显的。 最后分析为了解决决策问题(实现决策目标)、在上述准则下,有哪些最终解决方案(措施),并将它们作为措施层因素,放在递阶层次结构的最下面(最低层)。 明确各个层次的因素及其位置,并将它们之间的关系用连线连接起来,就构成了递阶层次结构。 【案例分析】市政工程项目进行决策:建立递阶层次结构 在市政工程项目决策问题中,市政管理人员希望通过选择不同的市政工程项目,使综合效益最高,即决策目标是“合理建设市政工程,使综合效益最高”。 为了实现这一目标,需要考虑的主要准则有三个,即经济效益、社会效益和环境效益。但问题绝不这么简单。通过深入思考,决策人员认为还必须考虑直接经济效益、间接经济效益、方便日常出行、方便假日出行、减少环境污染、改善城市面貌等因素(准则),从相互关系上分析,这些因素隶属于主要准则,因此放在下一层次考虑,并且分属于不同准则。 假设本问题只考虑这些准则,接下来需要明确为了实现决策目标、在上述准则下可以有哪些方案。根据题中所述,本问题有两个解决方案,即建高速路或建地铁,这两个因素作为措

相关主题
文本预览
相关文档 最新文档