




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*Title(c+): LR语法分析器.cpp Author: volantfish num:10211xxx Class:2010211309 Date: 2012.11 (volantfish)Introduction: Version: */#include #include #include #include #include #include #include #include using namespace std;/#define DEBUG_/枚举常量:用来表示LR分析表中表项的状态 enum formStyleSHIFT, REDUCE, ACCEPT, GOTO, ERROR;/the element of result of lexical analysisclass WordElepublic:WordEle():style(-1), real(init)WordEle(int st, string re):style(st), real(re)int style;/the string real;/;/the element of the formclass formElepublic:formStyle style;/enumint num;/the number of production.;/the element of stackclass stackElepublic:stackEle():state(-1), ch(-1)stackEle(int st, int c):state(st), ch(c)int state;/the number of ch;/the number of character.;/*Global variable*/map charNum;/char-numbervector numChar;/number-charvector proListL;/the left side of productionsvectorvector proListR;/the right side of productionsvector wordList;/the list of result of lexical analysismappair, formEle form;/the action and goto form/*Description: 打印此刻的分析动作 *Arguments: 输入此刻分析表的一个元素 *Returns: 用string表示的分析动作 */string PrintOption(const formEle &formTemp)string output;char charTemp100;/装门用于atoi()函数的参数,没有其他作用 if(formTemp.style = SHIFT)output += Shift ;output += itoa(formTemp.num, charTemp, 10);elseif(formTemp.style = REDUCE)output += Reduced by ;output += numChar.at(proListL.at(formTemp.num);output += -;vector vecTemp = proListR.at(formTemp.num);for(vector:iterator i = vecTemp.begin(); i != vecTemp.end(); +i)output += numChar.at(*i);elseif(formTemp.style = ACCEPT)output = acc;return output;/*Description: 打印未处理的输入串 *Arguments: 输入字符串的迭代器,指向正在处理的字符 *Returns: 未处理的输入串 */string PrintInput(vector:const_iterator iterWord)string output;for(; iterWord != wordList.end(); +iterWord)output += iterWord-real;return output;/*Description: 打印栈的全部元素 *Arguments: 栈 *Returns: 储存栈元素的string */string PrintStack(const list &st)char charTemp100;/装门用于atoi()函数的参数,没有其他作用 string output;/for(list:const_reverse_iterator i = st.rbegin(); i != st.rend(); +i)output += numChar.at(i-ch);output += itoa(i-state, charTemp, 10);return output;/*Description: LR语法分析主程序 *Arguments:*Returns:*/void GramAna()vector:const_iterator iterWord = wordList.begin();/指向当前正在处理的字符 list st;/stack used in the analysisst.push_front(stackEle(0, charNum$);/在栈底压入状态0 formEle formTemp;/充当中间变量的角色 printf(nn*LR语法分析过程*n);printf(n 栈 输 入 分析动作 n);/printf(%-18s%18s %-15sn, PrintStack(st).c_str(), /PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str(); while(iterWord != wordList.end()formTemp = formmake_pair(st.front().state, iterWord-style);if(formTemp.style = SHIFT)/ 移进 printf(%-18s%18s %-15sn, PrintStack(st).c_str(), PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str(); st.push_front(stackEle(formTemp.num, iterWord-style);+iterWord;elseif(formTemp.style = REDUCE)/ 归约 printf(%-18s%18s %-15sn, PrintStack(st).c_str(), PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str(); for(vector:size_type i = 0; i (proListR.at(formTemp.num).size(); +i)st.pop_front();int iTemp = formmake_pair(st.front().state, proListL.at(formTemp.num).num;st.push_front(stackEle(iTemp, proListL.at(formTemp.num);elseif(formTemp.style = ACCEPT)/ 接受,分析成功 printf(%-18s%18s %-15sn, PrintStack(st).c_str(), PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str();cout nGrammatical analysis success endl;+iterWord;else/error processing cout error: analysis endl;+iterWord;/end of while(iterWord != wordList.end()/*Description: 词法分析程序 *Arguments: 未经处理的输入符号串 *Returns:*/void LexiAna(const string inputStr)string:const_iterator iter = inputStr.begin();string token;/存储记号 int charState = 0;/表示开头字符的类别 while(iter != inputStr.end()if(isalpha(*iter) != 0)/ 字母 charState = 1;elseif(isdigit(*iter) != 0)/ 数字 charState = 2;elsestring tempIter;tempIter.push_back(*iter);/ 如果在终结符串中可以搜到 if(count(numChar.begin(), numChar.begin()+8, tempIter) != 0)charState = 3;elsecharState = 4;WordEle wTemp(-1, error);switch(charState)case 1:/标识符while(*iter = _ | isalpha(*iter) != 0 | isdigit(*iter) != 0)token.push_back(*iter);+iter;wTemp.style = charNumid;wTemp.real = token;token.clear();wordList.push_back(wTemp);break;case 2:/数字 while(isdigit(*iter) != 0)token.push_back(*iter);+iter;if(*iter = .)token.push_back(*iter);+iter;while(isdigit(*iter) != 0)token.push_back(*iter);+iter;wTemp.style = charNumnum;wTemp.real = token;token.clear();wordList.push_back(wTemp);break;case 3:/操作符 token.push_back(*iter);wTemp.style = charNumtoken;wTemp.real = token;token.clear();wordList.push_back(wTemp);+iter;break;default:/出现space 或 错误终结符 时的处理 if(isspace(*iter) = 0)/when iter belongs to space, ignore it.printf(!lexical analyse errorn);printf(!there do not exist character: %cn, *iter);+iter;break;/end of switch(charState)/end of while(iter != inputStr.end()/打印词法分析结果printf(nn*词法分析过程*n);cout The result of lexical analysis is: endl;for(vector:iterator i = wordList.begin(); i != wordList.end(); +i)cout style , real endl; /在输入字符串末尾加上符号$wordList.push_back(WordEle(charNum$, $); /*Description: 由文件input.txt读入分析程序所需的的数据 *Arguments:*Returns:*/void inputData()ifstream inFileStre(input.txt);/读入文件流 if(!inFileStre)cerr error: unable to open input.txt word)/read in terminal character.charNumword = number+;numChar.push_back(word);getline(inFileStre, line);getline(inFileStre, line);inStrStre.clear();inStrStre.str(line);/read in non-terminal character.#ifdef DEBUG_cout 11 inStrStre.str() word)#ifdef DEBUG_cout 22 word word;#ifdef DEBUG_cout 77 line word word;vector vecTemp;while(inStrStre word)vecTemp.push_back(charNumword);proListR.push_back(vecTemp);getline(inFileStre, line);getline(inFileStre, line);getline(inFileStre, line);getline(inFileStre, line);int xTemp;string yTemp;char sTemp;formEle fEleTemp;while(line != end)/read in form iteminStrStre.clear();inStrStre.str(line);inStrStre xTemp yTemp sTemp fEleTemp.num;#ifdef DEBUG_cout 55 xTemp yTemp endl;#endifswitch(sTemp)case s:fEleTemp.style = SHIFT;bre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025甘肃农业大学招聘博士专职辅导员16人考前自测高频考点模拟试题及答案详解(必刷)
- 2025西安水务投资有限责任公司见习招聘(5人)笔试历年参考题库附带答案详解
- 2025福建福州市科技园区仓山园建设发展总公司招聘3人笔试历年参考题库附带答案详解
- 2025福建盐业集团有限责任公司招聘综合笔试历年参考题库附带答案详解
- 2025福建厦门港务控股集团社会招聘权属企业财务岗2人笔试历年参考题库附带答案详解
- 2025牧原集团盛夏招聘1934人(吉林通榆县)笔试历年参考题库附带答案详解
- 2025年亳州蒙城县城建集团第二期招考3人笔试历年参考题库附带答案详解
- 2025北京京能清洁能源电力内蒙古分公司招聘31人考前自测高频考点模拟试题附答案详解
- 2025年济南市章丘区卫生健康局所属事业单位公开招聘工作人员职位表(116人)考前自测高频考点模拟试题及答案详解(历年真题)
- 2025吉林大学白求恩第一医院中医科医生招聘1人考前自测高频考点模拟试题及一套参考答案详解
- 2025房屋宅基地买卖合同
- 高中政治答题模板
- 2020年高考数学真题(共13套)后附解析
- 非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力试题及答案
- 境外信托合同范本
- 2024届高考二元思辨作文写作指导课件
- 数据治理的数据治理组织与流程
- (高清版)TDT 1055-2019 第三次全国国土调查技术规程
- 个人施工安全免责简单协议书(通用)带详尽条款
- 电梯结构与原理-第2版-全套课件
- 128个护理诊断和措施大全
评论
0/150
提交评论