α),则把α放入以A所在行为行号,以SELECT(A→α)为列
号的分析表pPredictTable[]中。重复以上操作,直到所有产生式的SELECT集合都分析完为止。
2.4利用预测分析表进行分析的算法设计
分析中需要用到分析栈、剩余输入串及有关产生式。为了显示整个分析过程,程序中分别用栈s,input,st来实现。分析时,首先将开始符压人分析栈s,用户输入的字符串与‘#’的连接串放入剩余压入栈input的第一个单元中,然后去掉s栈栈顶元素的最后一个字符,在预测分析表中查找该非终结符所在的行、input栈栈顶元素的第一个字符所在列的值。如果表中元素为空,则出错;否则将表中的产生式放入产生式栈st栈顶,并用该产生式的右部替换s的栈顶元素的字符串的最后一个非终结符,然后将替换后的非终结符串压入s栈栈顶。如果栈s的栈顶元素的最后一个字符是终结符,input栈的栈顶元素的第一个字符是终结符,若两个字符不相等,则出错;否则匹配,分别将两个栈的栈顶元素的匹配字符去掉,并将更新后的元素压入栈顶。st栈栈顶压入“匹配”字符串。如此一直进行到最后s及input栈栈时,分析完毕,表示可以接受此字符串。顶元素都为‘#’
boolIsInVt(charcChar);//判断cChar是否在终结符集合中charGetStart();//取代码的开始符号
boolIsLegalLL1Grammar();//判断是否为LL(1)代码private:
enumCanEmpty{CANTRUE,CANFALSE,UNDEFINED};//定义枚举型变量
//用来标明一个分析表是否为空,还是未定义SetVt;//终结符集合SetVn;//非终结符集合charcStart;//代码开始符号vector<Precept>P;//产生式
CanEmpty*pCanEmptyTable;//定义分析表所处状态的变量int*pPredictTable;//定义存放分析表的指针变量vector<Set>FirstSet;//产生First集vector<Set>FollowSet;//产生Follow集vector<Set>SelectSet;//产生Select集intnVt;//终结符的个数intnVn;//非终结符的个数intnP;//产生式的个数intiIsLL1;//标记是LL(1)代码voidMakeCanReachEmptyTable();//清空原来分析表中的内容,进行新的构造
voidCalculateFirstSet();//计算First集合中的字符个数voidCalculateFollowSet();//计算Follow集合中的字符个数voidCalculateSelectSet();//计算Selec集合中的字符个数
3结束语
该分析器不同于传统的多媒体教学软件,用户只要按规定的格式输入问题,系统能自动地给出该问题的答案和解答过程。该系统能作为学生学习的辅助工具,同时也可以作为教师的教学工具。这也是适应新世纪教学改革的需要。本系统是专门针对编译原理这门课程而设计的,因此,它的运用就仅局限于对编译原理的解答。
参考文献:
[1]吕映芝,张素琴.编译原理[M].清华大学出版社,1998.
[2]KennethCLounder编,冯博琴,冯岚译.编译原理及实践[M].机械
工业出版社,2000.
[3]陈火旺,刘春林等.程序设计语言编译原理(第3版)[M].国防工业出
版社,2001.
[4]温敬和.LL(1)代码及分析表的自动构造[J].计算机工程与应用,
2001.2:50 ̄54
CE
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说公务员考试LL_1_预测分析器的构造(3)在线全文阅读。
相关推荐: