C求文法的first和follow集合_第1页
C求文法的first和follow集合_第2页
C求文法的first和follow集合_第3页
C求文法的first和follow集合_第4页
C求文法的first和follow集合_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——C求文法的first和follow集合1.#include\2.#include\3.#include\4.

5.#ifdef_DEBUG6.#undefTHIS_FILE

7.staticcharTHIS_FILE[]=__FILE__;8.#definenewDEBUG_NEW9.#endif

10.//调试部分使用的代码

11.CStringMLR1::GetFirst(inti){

12.if(i=GetIdentNum())return\;

13.returnFirstSet5(m_first[i].Fi,m_first[i].flag14.}

15.CStringMLR1::GetFollow(inti){

16.if(i=GetIdentNum())return\;

17.returnFollowSet1(m_first[i].Fo,m_first[i].flag18.}

19.//构造部分20.MLR1::MLR1(){21.}

22.MLR1::~MLR1(){23.}

24.voidMLR1::ReSet(FILE*pf){25.//使用文件指针pf来重新驱动程序26.inti;27.p_file=pf;

28.list_Express.RemoveAll();29.list_Ident.RemoveAll();

30.for(i=0;i=(char*)m_first;p--)31.*p=0;32.Lex3();33.FirstSet6();34.//FollowSet3();35.}

36.//输入分析部分37.boolMLR1::Lex1(){

38.//截取一个分号段到tocken中39.//功能字符取其负数40.charch=0;41.boolend=false;42.token_len=0;

43.if(feof(p_file))returnfalse;

44.while(!end46.if(fread(47.if(ch':53.case'=':54.ch=-ch;55.break;56.case'\\\\':

57.fread(58.if(ch')return0;79.if(t==0)return0;80.ident[t]=0;

81.for(t=list_Ident.GetSize()-1;t>=0;t--)82.if(list_Ident[t]==(CString)ident)break;83.if(t=MAX_IDENT)returnfalse;85.list_Ident.Add((CString)ident);86.t=list_Ident.GetSize()-1;

87.if(isUse)bit_map[t/8]|=1=符号表;95.registerchar*s,*d;96.char*end;97.inti;98.s=d=token;

99.end=100.if(i=Lex2_1(s))*d++=-i;101.elsereturnfalse;

102.if(*s++!=-'=')returnfalse;

103.while(s=1){104.returnfalse;105.}else{

106.if(*p==*X)returnfalse;107.if(!FirstSet2(*p))108.returnfalse;109.}110.p++;111.}

112.returntrue;113.}

114.boolMLR1::FirstSet2(constcharX){115.//判断非终结符X能否推出LR_NULL116.CStringtemp;

117.if(m_first[-X-1].flag118.if(m_first[-X-1].flag120.m_first[-X-1].flag|=0x40;

121.for(inti=list_Express.GetSize();i>0;i--){122.temp=list_Express.GetAt(i-1);123.if(temp[0]==X){

124.if(FirstSet1((LPCSTR)temp)){125.m_first[-X-1].flag|=3;126.returntrue;127.}128.}129.}

130.m_first[-X-1].flag|=1;131.m_first[-X-1].flag^=0x40;132.returnfalse;133.}

134.boolMLR1::FirstSet3(constchar*X,char*Fi){

135.//求产生式X的First集放在F中,假使LR_NULL在First集中则返回true136.//假使要求符号串的First集,就将X[0]设为0137.//假设X中不出现LR_NULL,LR_EOF和LR_EOS138.//假设F的长度为MAP_SIZE,有128b139.constchar*p=X;140.X++;

141.while(*X!=0){142.if(*X>=1){

143.Fi[(*X)/8]|=10;i--){165.temp=list_Express.GetAt(i-1);166.if(temp[0]==X)

167.FirstSet3((LPCSTR)temp,m_first[-X-1].Fi);

168.}

169.m_first[-X-1].flag|=4;170.m_first[-X-1].flag^=0x40;171.}

172.if(Fi!=m_first[-X-1].Fi){

173.for(inti=0;i0;i--){174.if((m_first[i-1].flag176.}

177.for(i=list_Ident.GetSize();i>0;i--){178.if((m_first[i-1].flag180.}181.}

182.CStringMLR1::FollowSet1(constchar*Fo,boolhas_eof){183.//将集合表示的Follow变为字符串式184.chart[128];185.char*p=t;186.inti,j;

187.for(i=0;i0;i--){194.sprintf(temp,list_Express.GetAt(i-1));195.flag=false;196.p=temp+1;197.while(*p!=0){198.if(!flag){

199.if(*p==X){

200.//表达式中出现了符号X201.flag=true;}202.}else{

203.if(*p>0){

204.//规则2:X后碰上终结符205.flag=false;

206.Fo[*p/8]|=1199.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论