计算机原理林美华实验,ll1语法分析器实验报告.doc

41528d3028836879cd698677c3999917.gifll1语法分析器实验报告.doc

南京信息工程大学实验(实习)报告实验(实习)名称LL(1)文法语法分析设计实验(实习)日期11月28日得分指导教师林美华系计算机专业计算机科学与技术年级2011班次计科3班姓名王欣学号20112308915一.实验目的1.熟悉判断LL(1)文法的方法及对某一输入串的分析过程。2.学会构造表达式文法的预测分析表。二.实验内容编写一个语法分析程序,对于给定的输入串,能够判断识别该串是否为给定文法的句型。三.实验步骤从键盘读入输入串,并判断正误;若无误,由程序自动构造FIRST、FOLLOW集以及SELECT集合,判断是否为LL(1)文法;若符合LL(1)文法,由程序自动构造LL(1)分析表;由算法判断输入符号串是否为该文法的句型【源代码】INCLUDE“STDIOH“INCLUDE“STDLIBH“DEFINEMAXRULENUM8DEFINEMAXVNNUM5DEFINEMAXVTNUM5DEFINEMAXSTACKDEPTH20DEFINEMAXPLENGTH20DEFINEMAXSTLENGTH50STRUCTPRNODE/产生式右部结构/{INTRCURSOR/右部序号/STRUCTPRNODENEXT}STRUCTPNODE/产生式结点结构/{INTLCURSOR/左部符号序号/INTRLENGTH/右部长度//注当RLENGTH1时,RCURSOR1为空产生式/STRUCTPRNODERHEAD/右部结点头指针/}CHARVNMAXVNNUM1/非终结符集/INTVNNUMCHARVTMAXVTNUM1/终结符集/INTVTNUMSTRUCTPNODEPMAXRULENUM/产生式/INTPNUM/产生式实际个数/CHARBUFFERMAXPLENGTH1CHARCH/符号或STRINGCH/CHARSTMAXSTLENGTH/要分析的符号串/STRUCTCOLLECTNODE/集合元素结点结构/{INTNVT/在终结符集中的下标/STRUCTCOLLECTNODENEXT}STRUCTCOLLECTNODEFIRSTMAXVNNUM1/FIRST集/STRUCTCOLLECTNODEFOLLOWMAXVNNUM1/FOLLOW集/INTANALYSETABLEMAXVNNUM1MAXVTNUM11/预测分析表存放为产生式的编号,1用于存放结束符,多1用于存放1/INTANALYSESTACKMAXSTACKDEPTH1/分析栈/INTTOPANALYSE/分析栈顶//INTREVERSESTACKMAXSTACKDEPTH1/颠倒顺序栈//INTTOPREVERSE/倒叙栈顶/VOIDINIT/初始化/INTINDEXCHCHARCH/返回VN在VN表中的位置100、VT在VT表中的位置,1表示未找到/VOIDVT/输入终结符/VOIDVN/输入非终结符/VOIDSHOWCHARRAYCHARCOLLECT,INTNUM/输出VN或VT的内容/VOIDP/产生式输入/BOOLCHECKPCHARST/判断产生式正确性/VOIDFIRSTINTU/计算FIRST集,UXX/VOIDADDFIRSTINTU,INTNCH/加入FIRST集/BOOLHAVEEMPTYINTNVN/判断FIRST集中是否有空1/VOIDFOLLOWINTV/计算FOLLOW集/VOIDADDFOLLOWINTV,INTNCH,INTKIND/加入FOLLOW集,KIND0表加入FOLLOW集,KIND1加入FIRST集/VOIDSHOWCOLLECTSTRUCTCOLLECTNODECOLLECT/输出FIRST或FOLLOW集/VOIDFIRSTFOLLOW/计算FIRST和FOLLOW/VOIDCREATEAT/构造预测分析表/VOIDSHOWAT/输出分析表/VOIDIDENTIFYCHARST/主控程序,为操作方便//分析过程显示操作为本行变换所用,与教程的显示方式不同/VOIDINITSTACK/初始化栈及符号串/VOIDSHOWSTACK/显示符号栈中内容/VOIDPOP/栈顶出栈/VOIDPUSHINTR/使用产生式入栈操作/INCLUDE“LL1H“VOIDMAINVOID{CHARTODO,CHINITVNVTPGETCHARFIRSTFOLLOWPRINTF“所得FIRST集为“SHOWCOLLECTFIRSTPRINTF“所得FOLLOW集为“SHOWCOLLECTFOLLOWCREATEATSHOWATTODO Y WHILE Y TODO{PRINTF“\N是否继续进行句型分析Y/N“TODOGETCHARWHILE Y TODOTODOGETCHAR}IF Y TODO{INTIINITSTACKPRINTF“请输入符号串以结束“CHGETCHARI0WHILE CHPTNEXTNULLPIRHEADPTN4WHILE \0 BUFFERN{QTPRNODEMALLOCSIZEOFPRNODEQTRCURSORINDEXCHBUFFERNQTNEXTNULLPTNEXTQTPTQTN}PIRLENGTHN3I/调试时使用/}ELSEPRINTF“输入符号含非法在成分,请重新输入\N“}}/判断产生式正确性/BOOLCHECKPCHARST{INTNIF100INDEXCHST0RETURNFALSEIF ST1RETURNFALSEIF ST2RETURNFALSEFORN3 \0 STNN{IF1INDEXCHSTNRETURNFALSE}RETURNTRUE}/FIRSTFORI0IPTRCURSOR{/注此处因编程出错,使空产生式时RLENGTH同样是1,故此处同样可处理空产生式/ADDFIRSTU,PTRCURSORBREAK}ELSE{IFNULLFIRSTPTRCURSOR100{FIRSTPTRCURSOR}ADDFIRSTU,PTRCURSORIFHAVEEMPTYPTRCURSOR{BREAK}ELSE{PTPTNEXT}}J}IFJPIRLENGTH/当产生式右部都能推出空时/ADDFIRSTU,1}}}/加入FIRST集/VOIDADDFIRSTINTU,INTNCH/当数值小于100时NCH为VT//当处理非终结符时,ADDFIRST不添加空项1/{STRUCTCOLLECTNODEPT,QTINTCH/用于处理VN/PTNULLQTNULLIFNCHNVTNCHBREAKELSE{QTPTPTPTNEXT}}IFNULLPT{PTSTRUCTCOLLECTNODEMALLOCSIZEOFSTRUCTCOLLECTNODEPTNVTNCHPTNEXTNULLIFNULLFIRSTU100{FIRSTU100PT}ELSE{QTNEXTPT/QT指向FIRST集的最后一个元素/}PTPTNEXT}}ELSE{PTFIRSTNCH100WHILENULLPT{CHPTNVTIF1CH{ADDFIRSTU,CH}PTPTNEXT}}}/判断FIRST集中是否有空1/BOOLHAVEEMPTY

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值