编译原理课程设计说明书--词法分析,语法分析,语义分析 联系客服

发布时间 : 星期三 文章编译原理课程设计说明书--词法分析,语法分析,语义分析更新完毕开始阅读4a57f290d15abe23492f4d1a

桂林电子科技大学编译原理课程设计说明书 第31页

extern string s_NT;

extern int feCount,tpCount; int actionLen;//action的长度

int parseInt(string);

string test(string Action[12][6],int Goto[12][3],string input) {

int top_st;//状态栈的栈顶变量 int subScript=0;//输入串的下标

//char tmp;//临时变量,用于对字符串到字符的转换

char ch=input[subScript];//取输入串数组中的当前字符

stack result; //stack result;

while(1) { top_st=s_state.top();//取得状态栈的栈顶元素 int index = get_index(ch); string action=Action[top_st][index]; actionLen=action.length(); cout<<\action=\ if(action[0]=='S') { string rString= action.substr(1,actionLen-1); int tmp_int = parseInt(rString); s_sign.push(ch); //压入到符号栈的是当前字符,只是转换查action的时候要找类型 s_state.push(tmp_int); ch=input[++subScript];//提取下一个输入串的字符 } else if(action[0]=='r')//需要进行规约 { string rString= action.substr(1,actionLen-1); int tmp_int = parseInt(rString); int k=p[tmp_int].right.length();//取得该条文法的长度 //cout<<\ for(int i=0;i

桂林电子科技大学编译原理课程设计说明书 第32页

{ s_state.pop(); char pop_sign = s_sign.top(); s_sign.pop(); char ttt[10]; string x=\ if( pop_sign>='a' && pop_sign<='z' ) { // cout<<\ \ result\ result.push(x+pop_sign); // cout<<\ result.top()= \ } else if(pop_sign == '+'||pop_sign == '*') { if(pop_sign == '+') fe[feCount].op = '+'; else fe[feCount].op = '*'; fe[feCount].x1 = result.top(); result.pop(); fe[feCount].x2 = result.top(); result.pop(); // fe[feCount].re = tpCount+\ fe[feCount].re += \ itoa(tpCount, ttt,10); fe[feCount].re += ttt; result.push(fe[feCount].re); feCount++; tpCount++; } } char A=p[tmp_int].left;//取得文法左部的字符 index = get_index(A); int j=Goto[s_state.top()][index];//规约 s_sign.push(A); s_state.push(j); }

to 桂林电子科技大学编译原理课程设计说明书 第33页

else if(action==\ { //cout<<\表达式正确!\ break; } else { cout<<\表达式错误! \ cout<<\错误字符为\ break; } }

for(int t=0;t

return result.top(); }

int main() {

string Action[12][6]={ {\ {\ {\ {\ {\ {\ {\ {\ {\ {\ {\ {\

int Goto[12][3]={{1,2,3}, {-1,-1,-1}, {-1,-1,-1}, {-1,-1,-1}, {8,2,3}, {-1,-1,-1}, {-1,9,3}, {-1,-1,10}, {-1,-1,-1}, {-1,-1,-1},

桂林电子科技大学编译原理课程设计说明书 第34页

{-1,-1,-1}, {-1,-1,-1}}; init();//初始化操作

//测试中缀转后缀

freopen(\ string input;

cout<

while(cin>>input) { s_state.push(0); s_sign.push('#'); cout<<\\ while(s_state.empty()==false)s_state.pop(); while(s_sign.empty()==false)s_sign.pop(); feCount = 0; tpCount = 0; }

return 0; }

int parseInt(string str) { int len = str.length(); int sum = 0;

float carry = 1.0/10; for(int i=0; i

carry *= 10;

sum += (str[len-1-i]-'0')*carry; }

return sum; }