非递归预测分析器

上传人:m**** 文档编号:486854860 上传时间:2023-06-05 格式:DOC 页数:10 大小:144KB
返回 下载 相关 举报
非递归预测分析器_第1页
第1页 / 共10页
非递归预测分析器_第2页
第2页 / 共10页
非递归预测分析器_第3页
第3页 / 共10页
非递归预测分析器_第4页
第4页 / 共10页
非递归预测分析器_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《非递归预测分析器》由会员分享,可在线阅读,更多相关《非递归预测分析器(10页珍藏版)》请在金锄头文库上搜索。

1、预料分析法1试验目的与任务设计一个非递归预料分析器,实现对表达式语言的分析,理解自上而下语法分析方法的基本思想,驾驭设计非递归预料分析器的基本方法。2试验要求建立文法及其LL(1)分析表表示的数据结构,设计并实现相应的预料分析器,对源程序经词法分析后生成的二元式代码流进行预料分析,假如输入串是文法定义的句子则输出“是”,否则输出“否”。3试验内容(1)文法描述及其LL(1)分析表表达式语言(XL)的语法规则如下:1 程序 表达式;2 |表达式;程序3 表达式 表达式 + 项4 |项5 项 项 * 因式6 |因式7 因式 num_or_id8 |(表达式)将该语言的文法转换为如下的LL(1)文法

2、:1 prgm expr;prgm 8 term factor term2 prgm prgm 9 term *factor term 3 prgm 10 term 4 expr term expr 11 factor (expr) 5 expr 12 factor num6 expr +term expr 13 system_goal prgm7 expr 该LL(1)文法的LL(1)分析表如下: TNNum+*();#prgm111prgm2223expr4455expr677term88term1091010factor1211system_goal131313对文法中每个文法符号指定一

3、个常数值,符号编码表如下:文法符号常数值备注(Num+);*#4625130终结符(#为输入结束标记)Exprexprtermtermfactorprgmprgmsystem_goal258260259262261256257263非终结符(2)文法及其LL(1)分析表的数据结构文法的产生式可用数组Yy_pushtab存放。数组的第一个下标是产生式号,第一个产生式的序号为0;每列按逆序存放该产生式右部各符号的常数值,并以0结束。对于该表达式语言XL的LL(1)分析表,可用数组Yy_d存放。第一个下标是非终结符数值,其次个下标是终结符数值,数组元素的值为:0(表示接受),1(表示产生式号),-1

4、(表示语法错)。数组Yy_d的详细内容及表示如下:0 1 2 3 4 5 6# ; + * ( ) Num-10-1-10-1021-1-11-11-14-1-1343-1-1-1-17-17-165-1-16-1-1-1-1-110-111-1998-19-1-112-1-112-112prgm 256 prgm 257 expr 258 term 259 expr 260factor 261term 262system_goal 263数组Yy_pushtab的详细内容及表示如下:257,1,258,0prgm ; expr256,0prgm0260,259,0expr term0260,

5、259,2,0expr term +0262,261,0term factor262,261,2,0term factor *5,258,4,0) expr (06,0Num256,0prgm0123456789101112Yyp00Yyp01Yyp02Yyp03Yyp04Yyp05Yyp06Yyp07Yyp08Yyp09Yyp10Yyp11Yyp12(3)预料分析器总控程序结构预料分析器总控程序运用上面的两个表Yy_pushtab、Yy_d和一个分析栈(元素类型为int),其结构如下:初始化;/* 把起先符号的常数值压入分析站,输入指向第一个输入符号 */while(分析栈非空) if(栈顶

6、常数表示一个终结符)if(该常数与输入符号的常数不等)报语法错;else 把一个数从栈顶弹出;advance读下一输入符号;else /* 栈顶的常数表示一个非终结符 */what_to_do=Yy_d栈顶常数当前输入符号的常数;if(what_to_do= -1)报语法错;else 把栈顶元素弹出栈;把Yy_pushtabwhat_to_do中列出的全部常数压入分析栈;请实现该程序。在程序中添加输出栈内容的功能,以便和手工模拟分析过程作比较。(4)用预料分析器和手工模拟两种方式对文法的句子1+2;进行分析。综合分析过程可用下表表示。栈(符号)栈(数值)输入串What_to_dosystem_

7、goalprgmprgm ; exprprgm ; expr termprgm ; expr term factorprgm ; expr term Numprgm ; expr termprgm ; expr prgm ; expr term +prgm ; expr termprgm ; expr term factorprgm ; expr term Numprgm ; expr term prgm ; expr prgm ; prgm 263256257 1 258257 1 260 259257 1 260 262 261257 1 260 262 6257 1 260 262 25

8、7 1 260 257 1 260 259 2257 1 260 259 257 1 260 262 261257 1 260 262 6257 1 260 262257 1 260 257 1 260 262257 1+2;#1+2;#1+2;#1+2;#1+2;#1+2;#+2;#+2;#+2;#2;#2;#2;#;#;#;#120371195711962(5)请考虑如何设计并实现LL(1)分析表的自动生成程序。源程序:预料分析法源程序:#include#include#include#includeusing namespace std;#define stacksize 10#defi

9、ne stringsize 20typedef struct sqst /定义分析栈int datastacksize;int top; /栈顶指针sqstack;string word1=prgm,prgm,expr,term,expr,factor,term,system_goal;string word2 =#,;,+,*,(,),NUM;int main()void out(sqstack st,string str,int sp,int k); /输出函数void init(int Yy_pushtab134,int Yy_d2647); /初始化分析栈Yy_d与Yy_pushtab

10、void str_to_st1(string str,int st1); /对输入字符串的转换 void Foreparser(sqstack st,int Yy_pushtab134,int Yy_d2647, int st1,string str); /预料分析法int Yy_pushtab134,Yy_d2647; int st1stringsize;string str;sqstack st;st.top=-1; /分析栈的初始化 st.top+; st.datast.top=263; /分析栈初始化# coutstr;cout栈(符号) 栈(数值) 输入串 What_to_doendl; str_to_st1(str,st1); init(Yy_pushtab,Yy_d);Foreparser(st,Yy_pushtab,Yy_d,st1,str); return 0;void out(sqstack st,string str,int sp,int k)/输出函数 int n,m=0;for(int i=0;i=sp;i+)/输出栈(符号)if(st.datai7)coutword2st.datai ;n=word2st.datai.length()+1;else coutword1st.datai-256 ;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号