编译原理课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理课程设计报告

软件学院05级

学号:********

姓名:***

时间:2007年7月25日

一、词法分析

1、实验目的

编程实现词法分析程序,加深理解对词法分析原理。

2、实验要求

a、识别出特殊符号(用顿号隔开),如=、+、- 、*、/、<、>、<=、>=、==、!= 、;、:、,、{、}、[、]、(、)等

b、识别出关键字,如if;then;while;do;end;for等

c、识别其它标记ID 和NUM,并通过以下正规式定义其他标记:

ID -> letter ( letter | digit )

letter -> a | b ... | z | A |B ... | Z

NUM -> digit digit*

digit -> 0 | 1 ... | 9

3、算法思路:

本程序每次判断均连续输入几个的词,不同的词之间用“空格”隔开,因为所输入的字符串中含有“空格”,故在输入的时候启用文本监视器,利用字符串解析器扫描所输入的字符串,以逗号,空格,分号分开,以java.util包中的模式匹配生成文法和保留字对每个token进行分析,测试其匹配的模式,把它们区分开来

4、程序流程图

主程序流程图

5.运行环境JDK6.0

实验二:LL1语法判断

一、实验目要求:

自定义一个文法集,输入文法产生式,计算文法的FIRST,FOLLOW和SELECT集合,

利用SELECT集合构造预测分析表,接着用预测分析程序,栈和预测分析表对输入串进行分析,给出分析过程。

二、设计思想:

设计算法实现:

(1)求FIRST集(用关系图法)

(a)每个文法符号对应图中一个结点。

(b)如果文法中有产生式A αXβ,且α =>* ε,则从对应A的结点到对应X的结点连一条箭弧。

(c)凡是从FIRST(A)的结点有路径可到达的终结符结点所标记的终结符都为FIRST(A的成员。

(d)判定ε是否为某非终结符FIRST集的成员,若是则将加入该非终结符的FIRST 集中。

(2)求FOLLOW集

对于G中的每一A∈VN,为构造FOLLOW(A),可反复使用如下的规则,直到每个

FOLLOW集不再增大为止。

(a) 对于文法的开始符号S,令#∈FOLLOW(S)。

(b) 对于每一A→αBβ∈P,令FIRST(β)-{ε} = FOLLOW(B)。

(c) 对于每一A→αB∈P或A→αBβ∈P,且ε∈FIRST(β),则令FOLLOW(A)

FOLLOW(B)。

(3)求SELECT集

若α≠>*ε,则

SELECT(A→α)=FIRST(α)

若α=>*ε,则

SELECT(A→α)=(FIRST(α)-{ε})∪FOLLOW(A)

三、程序的详细分析过程及相应说明

预测分析程序工作过程:

四、程序结构

(一)程序中的主要变量和存储结构说明

(1)主要变量

char nontermina[FZJ_NUM]={'E','D','T','S','F'} /* 文法的非终结符集*/;

char termina[ZJF_NUM]={'i','+','*','(',')','#','$'}; /* 文法的终结符集*/;

char vocab[ALL_NUM]={'E','D','T','S','F','i','+','*','(',')','#','$'} /* 文法的单词表*/ production *expression[20]; /* 存储产生式*/

firfol fstfow[10]; /* 存储非终结符的FIRST集, FOLLOW集*/

char nonrecycle;

int recyclenum; /* 用来控制不出现重复计算同一个字符的FOLLOW集*/ (2)存储结构

/*---------------------------单链表--------------------------------*/

typedef struct firstnode

{

char value;

struct firstnode *next;

}firstset;

/*---------------------------产生式,存有SELECT--------------------------------*/

typedef struct

{

char source;

char result[10];

firstset *selects;

}production;

/*---------------------------存放FIRST ,FOLLOW--------------------------------*/ typedef struct

{

char value;

firstset *firsts;

firstset *follows;

int success;

}firfol;

/*---------------------------边表结点--------------------------------*/

typedef struct node{

int adjvex;

struct node * next;

}EdgeNode;

/*---------------------------顶点表结点--------------------------------*/ typedef struct vnode{

char vertex;

EdgeNode * firstedge;

}VertexNode;

typedef VertexNode AdjList[20];

/*---------------------------邻接表--------------------------------*/

typedef struct{

AdjList adjlist;

int n,e;

}ALGraph;

ALGraph *T;

/*--------------------------- 栈--------------------------------*/

typedef struct Stack

{

char stack[MAX_STACK];

int index;

} STACK,*pSTACK;

(二)函数功能介绍

ALGraph *CreateALGraph(ALGraph *G)

建立有向图的邻接表存储

DFSAL(ALGraph *G,int i)

深度优先搜索

int search_position(char c,char a[])

查找字符在数组的位置

int isnontermina(char x)

判断是否为非终结符

int istermina(char x)

判断是否为终结符

int isunempty(char c)

相关文档
最新文档