编译原理课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)