LR语法分析器 北邮 编译原理 实验

2018-12-27 15:56

/*******************************************************************************

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分析表中表项的状态

enumformStyle{SHIFT, REDUCE, ACCEPT, GOTO, ERROR};

//the element of result of lexical analysis classWordEle { public: WordEle():style(-1), real(\ WordEle(intst, string re):style(st), real(re){} int style; //the string real; // };

//the element of the form classformEle {

public: formStyle style; //enum intnum; //the number of production. };

//the element of stack classstackEle { public: stackEle():state(-1), ch(-1){} stackEle(intst, int c):state(st), ch(c){} int state; //the number of state. intch; //the number of character. };

/*Global variable*/

mapcharNum; //char->number vectornumChar; //number->char vectorproListL; //the left side of productions vector>proListR; //the right side of productions vectorwordList; //the list of result of lexical analysis map, formEle> form; //the action and goto form /**

* Description: 打印此刻的分析动作

* Arguments: 输入此刻分析表的一个元素 * Returns: 用string表示的分析动作 */

stringPrintOption(constformEle&formTemp) { string output;

char charTemp[100]; //装门用于atoi()函数的参数,没有其他作用

if(formTemp.style == SHIFT) { output += \ output += itoa(formTemp.num, charTemp, 10); } else { if(formTemp.style == REDUCE) { output += \

output += numChar.at(proListL.at(formTemp.num)); output += \ vectorvecTemp = proListR.at(formTemp.num); for(vector::iterator i = vecTemp.begin(); i != vecTemp.end(); ++i) { output += numChar.at(*i); } } else { if(formTemp.style == ACCEPT) { output = \ } } } return output; } /**

* Description: 打印未处理的输入串

* Arguments: 输入字符串的迭代器,指向正在处理的字符 * Returns: 未处理的输入串 */

stringPrintInput(vector::const_iteratoriterWord) { string output; for(; iterWord != wordList.end(); ++iterWord) { output += iterWord->real; } return output; } /**

* Description: 打印栈的全部元素 ~ * Arguments: 栈

* Returns: 储存栈元素的string

*/

stringPrintStack(const list&st) { char charTemp[100]; //装门用于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: */

voidGramAna() { vector::const_iteratoriterWord = wordList.begin(); //指向当前正在处理的字符 listst; //stack used in the analysis st.push_front(stackEle(0, charNum[\//在栈底压入状态0 formEleformTemp; //充当中间变量的角色 printf(\语法分析过程*********************\\n\ printf(\ 栈输入分析动作 \\n\ //printf(\ %-15s\\n\ // PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str()); while(iterWord != wordList.end()) { formTemp = form[make_pair(st.front().state, iterWord->style)]; if(formTemp.style == SHIFT) // 移进 { printf(\ %-15s\\n\ PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str()); st.push_front(stackEle(formTemp.num, iterWord->style)); ++iterWord; }

else { if(formTemp.style == REDUCE) // 归约 { printf(\ %-15s\\n\ PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str()); for(vector::size_type i = 0; i < (proListR.at(formTemp.num)).size(); ++i) { st.pop_front(); } intiTemp = form[make_pair(st.front().state, proListL.at(formTemp.num))].num; st.push_front(stackEle(iTemp, proListL.at(formTemp.num))); } else { if(formTemp.style == ACCEPT) // 接受,分析成功 { printf(\ %-15s\\n\ PrintInput(iterWord).c_str(), PrintOption(formTemp).c_str()); cout<< \ ++iterWord; } else //error processing { cout<< \ ++iterWord; } } } }//end of while(iterWord != wordList.end()) } /**

* Description: 词法分析程序

* Arguments: 未经处理的输入符号串 * Returns: */

voidLexiAna(const string inputStr) { string::const_iteratoriter = inputStr.begin();


LR语法分析器 北邮 编译原理 实验.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:(新)某居住小区东区会所钢结构工程施工组织设计 -

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: