资源简介

实现了LR分析法; 完整vs2012工程; 代码精简,注释得当; 文法、Action、Goto表采用文件读入,操作灵活; 请尊重原创,如有问题,欢迎大家与我探讨。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 

using namespace std;

#define ACC 20

class Action {

public:
Action(void);
Action(const Action &cpy);//don not forget const
Action(bool SorR int status);

bool m_SorR;//true for shift false for reduce
int m_status;//-1 indicates not exists
};

Action::Action(void):m_SorR(true) m_status(-1){}
Action::Action(const Action &cpy):m_SorR(cpy.m_SorR) m_status(cpy.m_status){}
Action::Action(bool SorR int status):m_SorR(SorR) m_status(status){}


map char2int;
vector grammar;
vector> action(17 vector(9));
vector> jumpto(17 vector(3));


void LRanalysis(void);

int main()
{
ifstream inAction(“Action.txt“ ios::in);
ifstream inGoto(“Goto.txt“ ios::in);
ifstream inMap(“Map.txt“ ios::in);
ifstream inGrammar(“Grammar.txt“ ios::in);

if (!inAction.is_open() || !inGoto.is_open() 
|| !inMap.is_open() || !inGrammar.is_open()) {
cout << “can not open the file“ << endl;
return -1;
}

char temp[4];
int status = 0;
bool flag = true;

for (int i = 0; i < 17 && flag; ++i) {
for (int j = 0; j < 9 && flag; ++j) {

if (!inAction.eof())
inAction >> temp;
else 
flag = false;

switch (*temp)
{//case ‘e‘ in default is error
case ‘s‘:
sscanf(temp + 1 “%d“ &status);
action.at(i).at(j) = Action(true status);
break;
case ‘r‘:
sscanf(temp + 1 “%d“ &status);
action.at(i).at(j) = Action(false status);
break;

case ‘a‘:
action.at(i).at(j) = Action(true ACC);
break;
}
}
}

int formular = 0;
for (int i = 0; i < 17; ++i) {
for (int j = 0; j < 3; ++j) {
inGoto >> formular;
jumpto.at(i).at(j) = formular;
  }
}


char ch;
int id = 0;
while (!inMap.eof()) {
inMap >> ch >> id;
char2int.insert(pair(ch id));
}

string recv;
while (!inGrammar.eof()) {
inGrammar >> recv;
grammar.push_back(recv);
}

LRanalysis();

system(“pause“);

return 0;
}

void LRanalysis(void)
{
cout << “Please input a string“ << endl;

vector Symbol;//Grammar symbol stack
vector Status;//Status stack
Symbol.push_back(‘S‘);
Status.push_back(0);

string w;
cin >> w;
w.push_back(‘$‘);

int top = -1;
    char cur = NULL;
string::iterator ip = w.begin();

do {
top = *Status.rbegin();
cur = *ip;

int col = char2int.find(cur)->second;

if (action.at(top).at(col).m_status == ACC) {
cout << “Accept“ << endl;
return;
}

if (action.at(top).at(col).m_status == -1) {//multiple line need to add bracket
cout << “error“ << endl;
return;
}

if (action.at(top).at(col).m_SorR) {//shift
Symbol.push_back(cur);
Status.push_back(action.at(top).at(col).m_status);
++ip;

cout << “Shift “ << action.at(top).at(col).m_status << endl;

} else if (!act

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     230912  2012-12-28 21:09  LR\Debug\LR.exe

     文件    2181740  2012-12-28 21:09  LR\Debug\LR.ilk

     文件    2149376  2012-12-28 21:09  LR\Debug\LR.pdb

     目录          0  2012-12-28 18:59  LR\Debug

     文件        540  2012-12-28 13:12  LR\LR\Action.txt

     文件        448  2012-12-28 21:09  LR\LR\Debug\cl.command.1.tlog

     文件      11822  2012-12-28 21:09  LR\LR\Debug\CL.read.1.tlog

     文件        216  2012-12-28 21:09  LR\LR\Debug\CL.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link-cvtres.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link-cvtres.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link-rc.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link-rc.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548-cvtres.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548-cvtres.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548-rc.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548-rc.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1548.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676-cvtres.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676-cvtres.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676-rc.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676-rc.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1676.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832-cvtres.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832-cvtres.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832-rc.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832-rc.write.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832.read.1.tlog

     文件          2  2012-12-28 21:09  LR\LR\Debug\link.1832.write.1.tlog

............此处省略99个文件信息

评论

共有 条评论