收藏 分享(赏)

LL(1)语法分析程序设计.pdf

上传人:精品资料 文档编号:10776506 上传时间:2020-01-08 格式:PDF 页数:25 大小:107.67KB
下载 相关 举报
LL(1)语法分析程序设计.pdf_第1页
第1页 / 共25页
LL(1)语法分析程序设计.pdf_第2页
第2页 / 共25页
LL(1)语法分析程序设计.pdf_第3页
第3页 / 共25页
LL(1)语法分析程序设计.pdf_第4页
第4页 / 共25页
LL(1)语法分析程序设计.pdf_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、#include “stdio.h“#include “stdlib.h“#define MaxRuleNum 8#define MaxVnNum 5#define MaxVtNum 5#define MaxStackDepth 20#define MaxPLength 20#define MaxStLength 50struct pRNode /*产 生 式 右 部 结 构 */int rCursor; /*右 部 序 号 */struct pRNode *next;struct pNode /*产 生 式 结 点 结 构 */int lCursor; /*左 部 符 号 序 号 */int

2、 rLength; /*右 部 长 度 */*注 当 rLength = 1 时 , rCursor = -1为 空 产 生 式 */struct pRNode *rHead; /*右 部 结 点 头 指 针 */;char VnMaxVnNum + 1; /*非 终 结 符 集 */int vnNum;char VtMaxVtNum + 1; /*终 结 符 集 */int vtNum;struct pNode PMaxRuleNum; /*产 生 式 */int PNum; /*产 生 式 实 际 个 数 */char bufferMaxPLength + 1;char ch; /*符 号

3、 或 string ch;*/char stMaxStLength; /*要 分 析 的 符 号 串 */ struct collectNode /*集 合 元 素 结 点 结 构 */int nVt; /*在 终 结 符 集 中 的 下 标 */struct collectNode *next;struct collectNode* firstMaxVnNum + 1; /*first集 */struct collectNode* followMaxVnNum + 1; /*follow集 */ int analyseTableMaxVnNum + 1MaxVtNum + 1 + 1;/*预

4、 测 分 析 表 存 放 为 产 生 式 的 编 号 , +1用 于 存 放 结 束 符 , 多 +1用 于 存 放#(-1)*/int analyseStackMaxStackDepth + 1; /*分 析 栈 */int topAnalyse; /*分 析 栈 顶 */*int reverseStackMaxStackDepth + 1; /*颠 倒 顺 序 栈 */*int topReverse; /*倒 叙 栈 顶 */ void Init();/*初 始 化 */int IndexCh(char ch);/*返 回 Vn在 Vn表 中 的 位 置 +100、 Vt在 Vt表 中 的

5、 位 置 , -1表 示 未 找 到 */void InputVt(); /*输 入 终 结 符 */void InputVn();/*输 入 非 终 结 符 */void ShowChArray(char* collect, int num);/*输 出 Vn或 Vt的 内 容 */void InputP();/*产 生 式 输 入 */bool CheckP(char * st);/*判 断 产 生 式 正 确 性 */void First(int U);/*计 算 first集 ,U-xx.*/void AddFirst(int U, int nCh); /*加 入 first集 */b

6、ool HaveEmpty(int nVn); /*判 断 first集 中 是 否 有 空 (-1)*/void Follow(int V);/*计 算 follow集 */void AddFollow(int V, int nCh, int kind);/*加 入 follow集 ,kind = 0表 加 入 follow集 , kind = 1加 入 first集 */void ShowCollect(struct collectNode *collect);/*输 出 first或follow集 */void FirstFollow();/*计 算 first和 follow*/voi

7、d CreateAT();/*构 造 预 测 分 析 表 */void ShowAT();/*输 出 分 析 表 */void Identify(char *st);/*主 控 程 序 ,为 操 作 方 便 */*分 析 过 程 显 示 操 作 为 本 行 变 换 所 用 , 与 教 程 的 显 示 方 式 不 同 */void InitStack();/*初 始 化 栈 及 符 号 串 */void ShowStack();/*显 示 符 号 栈 中 内 容 */void Pop();/*栈 顶 出 栈 */void Push(int r);/*使 用 产 生 式 入 栈 操 作 */ /#

8、include “LL1.h“ void main()char todo,ch;void Init();InputVn();InputVt();InputP();getchar();FirstFollow();printf(“所 得 first集 为 : “);ShowCollect(first);printf(“所 得 follow集 为 : “);ShowCollect(follow);CreateAT();ShowAT();todo = y;while(y = todo)printf(“n是 否 继 续 进 行 句 型 分 析 ? (y / n):“); todo = getchar()

9、;while(y != todo todo = getchar(); if(y = todo) int i;InitStack(); printf(“请 输 入 符 号 串 (以 #结 束 ) : “);ch = getchar(); i = 0;while(# != ch pt-next = NULL; Pi.rHead = pt;n = 4; while(0 != buffern) qt = (pRNode*)malloc(sizeof(pRNode);qt-rCursor = IndexCh(buffern); qt-next = NULL;pt-next = qt; pt = qt;n

10、+; Pi.rLength = n - 3; i+;/*调 试 时 使 用 */ else printf(“输 入 符 号 含 非 法 在 成 分 , 请 重 新 输 入 ! n“);/*判 断 产 生 式 正 确 性 */bool CheckP(char * st)int n;if(100 IndexCh(st0) return false;if(- != st1) return false;if( != st2) return false;for(n = 3; 0 != stn; n +)if(-1 = IndexCh(stn) return false;return true;/*=fi

11、rst for(i = 0; i pt-rCursor) /*注 :此 处 因 编 程 出 错 ,使 空 产 生 式 时rlength同 样 是 1,故 此 处 同 样 可 处 理 空 产 生 式 */ AddFirst(U, pt-rCursor);break; else if(NULL = firstpt-rCursor - 100) First(pt-rCursor); AddFirst(U, pt-rCursor); if(!HaveEmpty(pt-rCursor) break; else pt = pt-next; j+; if(j = Pi.rLength) /*当 产 生 式

12、右 部 都 能 推 出 空 时 */ AddFirst(U, -1);/*加 入 first集 */void AddFirst(int U, int nCh) /*当 数 值 小 于 100时 nCh为 Vt*/*当 处 理 非 终 结 符 时 ,AddFirst不 添 加 空 项 (-1)*/struct collectNode *pt, *qt;int ch; /*用 于 处 理 Vn*/pt = NULL;qt = NULL;if(nCh nVt = nCh) break;else qt = pt; pt = pt-next; if(NULL = pt) pt = (struct col

13、lectNode *)malloc(sizeof(struct collectNode);pt-nVt = nCh; pt-next = NULL;if(NULL = firstU - 100) firstU - 100 = pt; else qt-next = pt; /*qt指 向 first集 的 最 后 一 个 元 素 */ pt = pt-next; else pt = firstnCh - 100;while(NULL != pt) ch = pt-nVt; if(-1 != ch) AddFirst(U, ch); pt = pt-next;/*判 断 first集 中 是 否

14、有 空 (-1)*/bool HaveEmpty(int nVn)if(nVn nVt) return true;pt = pt-next;return false;/*计 算 follow集 ,例 : U-xVy,U-xV.(注 : 初 始 符 必 含 #-“-1“)*/void Follow(int V)int i;struct pRNode *pt ;if(100 = V) /*当 为 初 始 符 时 */AddFollow(V, -1, 0 );for(i = 0; i rCursor != V) /*注 此 不 能 处 理 : U-xVyVz的 情 况 */pt = pt-next;

15、 if(NULL != pt) pt = pt-next; /*V右 侧 的 符 号 */if(NULL = pt) /*当 V后 为 空 时 V-xV, 将 左 符 的 follow集 并 入 V的follow集 中 */ if(NULL = followPi.lCursor - 100 AddFollow(V, Pi.lCursor, 0); else /*不 为 空 时 V-xVy,(注 意 : y-), 调 用 AddFollow加 入 Vt或 y的first集 */ while(NULL != pt /*y的 前 缀 中 有 空 时 , 加 如 first集 */pt = pt-ne

16、xt; if(NULL = pt) /*当 后 面 的 字 符 可 以 推 出 空 时 */ if(NULL = followPi.lCursor - 100 AddFollow(V, Pi.lCursor, 0); else /*发 现 不 为 空 的 字 符 时 */ AddFollow(V, pt-rCursor, 1); /*当 数 值 小 于 100时 nCh为 Vt*/*#用 -1表 示 ,kind用 于 区 分 是 并 入 符 号 的 first集 , 还 是 follow集kind = 0表 加 入 follow集 , kind = 1加 入 first集 */void Add

17、Follow(int V, int nCh, int kind)struct collectNode *pt, *qt;int ch; /*用 于 处 理 Vn*/pt = NULL;qt = NULL;if(nCh nVt = nCh)break; else qt = pt;pt = pt-next; if(NULL = pt) pt = (struct collectNode *)malloc(sizeof(struct collectNode); pt-nVt = nCh;pt-next = NULL; if(NULL = followV - 100) followV - 100 = p

18、t; else qt-next = pt; /*qt指 向 follow集 的 最 后 一 个 元 素 */ pt = pt-next;else /*为 非 终 结 符 时 , 要 区 分 是 加 first还 是 follow*/if(0 = kind) pt = follownCh - 100; while(NULL != pt) ch = pt-nVt;AddFollow(V, ch, 0); pt = pt-next; else pt = firstnCh - 100; while(NULL != pt) ch = pt-nVt;if(-1 != ch) AddFollow(V, ch

19、, 1); pt = pt-next; /*输 出 first或 follow集 */void ShowCollect(struct collectNode *collect)int i;struct collectNode *pt;i = 0;while(NULL != collecti) pt = collecti;printf(“n%c:t“, Vni); while(NULL != pt) if(-1 != pt-nVt) printf(“ %c“, Vtpt-nVt); elseprintf(“ #“); pt = pt-next; i+;printf(“n“);/*计 算 firs

20、t和 follow*/void FirstFollow()int i;i = 0;while(0 != Vni)if(NULL = firsti) First(100 + i);i+;i = 0;while(0 != Vni) if(NULL = followi)Follow(100 + i); i+;/*=构 造 预 测 分 析 表 ,例 : U:xyz=*/void CreateAT()int i;struct pRNode *pt;struct collectNode *ct;for(i = 0; i rCursor) /*处 理 非 终 结 符 , 当 为 终 结 符 时 , 定 含

21、空 为 假 跳 出 */ct = firstpt-rCursor - 100; while(NULL != ct) if(-1 != ct-nVt)analyseTablePi.lCursor - 100ct-nVt = i; ct = ct-next; pt = pt-next; if(NULL = pt) /*NULL = pt, 说 明 xyz-,用 到 follow中 的 符 号 */ct = followPi.lCursor - 100; while(NULL != ct) if(-1 != ct-nVt)analyseTablePi.lCursor - 100ct-nVt = i;

22、 else /*当 含 有 #号 时 */analyseTablePi.lCursor - 100vtNum = i; ct = ct-next; else if(100 rCursor) /*不 含 空 的 非 终 结 符 */ ct = firstpt-rCursor - 100; while(NULL != ct) analyseTablePi.lCursor - 100ct-nVt = i;ct = ct-next; else /*终 结 符 或 者 空 */ if(-1 = pt-rCursor) /*-1为 空 产 生 式 时 */ ct = followPi.lCursor -

23、100;while(NULL != ct) if(-1 != ct-nVt) analyseTablePi.lCursor - 100ct-nVt = i;else /*当 含 有 #号 时 */ analyseTablePi.lCursor - 100vtNum = i;ct = ct-next; else /*为 终 结 符 */ analyseTablePi.lCursor - 100pt-rCursor = i; /*输 出 分 析 表 */void ShowAT()int i,j;printf(“构 造 预 测 分 析 表 如 下 : n“);printf(“t|t“);for(i

24、= 0; i analyseStacktopAnalyse) /*当 为 终 结 符 时 */ if(analyseStacktopAnalyse = IndexCh(stcurrent) /*匹 配 出 栈 , 指 示 器 后 移 */ Pop();current+; step+;printf(“%dt“, step); ShowStack();printf(“tt%ctt出 栈 、 后 移 n“, stcurrent); else printf(“%c-%c不 匹 配 ! “, analyseStacktopAnalyse, stcurrent);printf(“此 串 不 是 此 文 法

25、 的 句 子 ! n“); return; else /*当 为 非 终 结 符 时 */ r = analyseTableanalyseStacktopAnalyse - 100IndexCh(stcurrent);if(-1 != r) Push(r); /*产 生 式 右 部 代 替 左 部 , 指 示 器 不 移 动 */ step+;printf(“%dt“, step); ShowStack();printf(“tt%ctt%dn“, stcurrent, r); else printf(“无 可 用 产 生 式 , 此 串 不 是 此 文 法 的 句 子 ! n“); retur

26、n; if(# = stcurrent) if(0 = topAnalyse printf(“%dt“, step); ShowStack();printf(“tt%ctt分 析 成 功 ! n“, stcurrent); printf(“%s是 给 定 文 法 的 句 子 ! n“, st); else while(topAnalyse 0) if(100 analyseStacktopAnalyse) /*当 为 终 结 符 时 */ printf(“无 可 用 产 生 式 , 此 串 不 是 此 文 法 的 句 子 ! n“); return; else r = analyseTable

27、analyseStacktopAnalyse - 100vtNum;if(-1 != r) Push(r); /*产 生 式 右 部 代 替 左 部 , 指 示 器 不 移 动 */step+; printf(“%dt“, step);ShowStack(); if(0 = topAnalyse printf(“%s是 给 定 文 法 的 句 子 ! n“, st); else printf(“tt%ctt%dn“, stcurrent, r); else printf(“无 可 用 产 生 式 , 此 串 不 是 此 文 法 的 句 子 ! n“); return; /*初 始 化 栈 及 符 号 串 */void InitStack() int i;/*分 析 栈 的 初 始 化 */for(i = 0; i rCursor) /*为 空 产 生 式 时 */return;topAnalyse += Pr.rLength;for(i = 0; i rCursor;/*逆 序 入 栈 */ pt = pt-next;/*循 环 未 完 时 pt为 空 , 则 说 明 rLength记 录 等 出 错 */

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报