C++求文法的first和follow集合
1. #include \ 2. #include \ 3. #include \ 4.
5. #ifdef _DEBUG 6. #undef THIS_FILE
7. static char THIS_FILE[]=__FILE__; 8. #define new DEBUG_NEW 9. #endif
10. //----调试部分使用的代码
11. CString MLR1::GetFirst(int i){
12. if(i<0||i>=GetIdentNum())return \;
13. return FirstSet5(m_first[i].Fi,m_first[i].flag&2); 14. }
15. CString MLR1::GetFollow(int i){
16. if(i<0||i>=GetIdentNum())return \;
17. return FollowSet1(m_first[i].Fo,m_first[i].flag&0x08); 18. }
19. //----构造部分 20. MLR1::MLR1(){ 21. }
22. MLR1::~MLR1(){ 23. }
24. void MLR1::ReSet(FILE* pf){ 25. //使用文件指针pf来重新驱动程序 26. int i; 27. p_file=pf;
28. list_Express.RemoveAll(); 29. list_Ident.RemoveAll();
30. for(i=0;i T-1;\ for(char* bit_map[i]=\>=(char*)m_first;p--) 31. *p=0; 32. Lex3(); 33. FirstSet6(); 34. // FollowSet3(); 35. } 36. //----输入分析部分 37. bool MLR1::Lex1(){ 38. //截取一个分号段到tocken中 39. //功能字符取其负数 40. char ch=0; 41. bool end=false; 42. token_len=0; 43. if(feof(p_file))return false; 44. while(!end&&!feof(p_file)){ 45. if(token_len>=LINE_LENGTH)break; 46. if(fread(&ch,1,1,p_file)<=0)break; 47. if(ch<=0)goto error; 48. switch(ch){ 49. case ';': 50. end=true; 51. case '<': 52. case '>': 53. case '=': 54. ch=-ch; 55. break; 56. case '\\\\': 57. fread(&ch,1,1,p_file); 58. if(ch<=0)goto error; 59. break; 60. } 61. token[token_len++]=ch; 62. } 63. token[token_len]=0; 64. return true; 65. error: 66. fprintf(stderr,\); 67. return false; 68. } 69. int MLR1::Lex2_1(char*&s,bool isUse){ 70. //识别非终结符并加入list_Ident 71. char ident[ID_LENGTH+1]; 72. int t=0; 73. if((int)*s++!=-'<')return 0; 74. if(isalpha(*s))ident[t++]=*s++; 75. else return 0; 76. while(isalpha(*s)||isdigit(*s))ident[t++]=*s++; 77. while(*s=='\\'')ident[t++]=*s++; 78. if((int)*s++!=-'>')return 0; 79. if(t==0)return 0; 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<0){ 84. if(list_Ident.GetSize()>=MAX_IDENT)return false; 85. list_Ident.Add((CString)ident); 86. t=list_Ident.GetSize()-1; 87. if(isUse)bit_map[t/8]|=1<<(t%8); 88. } 89. if(!isUse)bit_map[t/8]&=~(1<<(t%8)); 90. return t+1; 91. } 92. bool MLR1::Lex2(){ 93. //将token中的非终结符用(-1) -- (-127)表示 94. //进行语法判断<终结符>=符号表; 95. register char *s,*d; 96. char * end; 97. int i; 98. s=d=token; 99. end=&token[token_len]; 100. if(i=Lex2_1(s))*d++=-i; 101. else return false; 102. if(*s++!=-'=')return false; 103. while(s 式X能否推出LR_NULL *X){ MLR1::FirstSet1(const bool * 首先判断某非终结符能否推出LR_NULL ----First 集 } true; return false; if(bit_map[i]!=\ i=\)\ for(int else list_Express.Add((CString)token); if(Lex2()) if(token_len=\ while(Lex1()){ 判断bit_map是否为全零,如果不是则表示有未定义的非终结符 循环调用Lex1读入一句,调用Lex2进行语法分 析 MLR1::Lex3(){ s 106. if(*p==*X)return false; 107. if(!FirstSet2(*p)) 108. return false; 109. } 110. p++; 111. } 112. return true; 113. } 114. bool MLR1::FirstSet2(const char X){ 115. //判断非终结符X能否推出LR_NULL 116. CString temp; 117. if(m_first[-X-1].flag&0x40)return false; 118. if(m_first[-X-1].flag&1) 119. return (m_first[-X-1].flag&2)!=0; 120. m_first[-X-1].flag|=0x40; 121. for(int i=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. return true; 127. } 128. } 129. } 130. m_first[-X-1].flag|=1; 131. m_first[-X-1].flag^=0x40; 132. return false; 133. } 134. bool MLR1::FirstSet3(const char *X,char*Fi){ 135. //求产生式X的First集放在F中,如果LR_NULL在First集中则返回true 136. //如果要求符号串的First集,就将X[0]设为0 137. //假设X中不出现LR_NULL,LR_EOF和LR_EOS 138. //假设F的长度为MAP_SIZE,有128b 139. const char *p=X; 140. X++; 141. while(*X!=0){ 142. if(*X>=1){ 143. Fi[(*X)/8]|=1<<(*X)%8; 144. return false; 145. }else{ 146. if(*X==*p){ 147. if(!FirstSet2(*X)) 148. return false; 149. }else if(!FirstSet4(*X,Fi)){ 150. return false; 151. } 152. } 153. X++; 154. } 155. return true; 156. } 157. bool MLR1::FirstSet4(char const X,char*Fi){ 158. //求非终结符X的First集放在F中 159. //如果LR_NULL在其中则返回true 160. CString temp;
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




