/*******************************************************************************
Title(c++): LR语法分析器.cpp
Author: volantfish num:10211xxx Class:2010211309 Date: 2012.11 (volantfish)
Introduction:
Version:
*******************************************************************************/
#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();