您好,欢迎来到刀刀网。
搜索
您的当前位置:首页LR分析

LR分析

来源:刀刀网
LR分析源程序: #include #include #include using namespace std; #define maxsize 10

typedef struct stack //状态栈与符号栈 { int data1[maxsize]; char data2[maxsize]; int top; }stack;

string act[7]={\"S->E\//文法表达式

int main() { int transform(char a); void LRanalysis(int Action[12][6],int Goto[12][4],string str,stack st); stack st; string str;

int Action[12][6]={ //Action分析表 {100,1,100,100,2,100}, {-6,100,-6,-6,100,-6}, {100,1,100,100,2,100}, {0,100,7,100,100,100}, {-2,100,-2,8,100,-2}, {-4,100,-4,-4,100,-4}, {100,100,7,100,100,9}, {100,1,100,100,2,100}, {100,1,100,100,2,100}, {-5,100,-5,-5,100,-5}, {-1,100,-1,8,100,-1}, {-3,100,-3,-3,100,-3}}; int Goto[12][4]={ //Goto分析表

{-1,3,4,5}, {-1,-1,-1,-1}, {-1,6,4,5}, {-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,10,5}, {-1,-1,-1,11}, {-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,-1,-1}}; st.top=-1; st.top++;

st.data1[st.top]=0; st.data2[st.top]='#';

cout<<\"请输入分析串:\"; cin>>str;

cout<<\"步骤 \"<<\"状态栈 \"<<\" 符号栈\"<<\" \"<<\" ACTION\"<<\" GOTO\"<LRanalysis(Action,Goto,str,st); //LALR(1)分析 cout<int transform(char a) //符号转换为整型 { int nsym; if(a>='A'&&a<='Z') switch(a) { case 'S':nsym=0;break; case 'E':nsym=1;break; case 'T':nsym=2;break;

输入串 case 'F':nsym=3;break; } else switch(a) { case '#': nsym=0;break; case '+': nsym=2;break; case '*': nsym=3;break; case '(': nsym=4;break; case ')': nsym=5;break; } if(a>='a'&&a<='z') nsym=1; return nsym; } void LRanalysis(int Action[12][6],int Goto[12][4],string str,stack st) {

int sym,tos,p,m=1,n=0,r;

sym=transform(str[n]); tos=st.data1[st.top];

while(Action[tos][sym]!=0) { cout<int q=0; //输出状态栈 while(q<=st.top) { cout<} q=0; //输出符号栈 while(q<=st.top) { cout<sym=transform(str[n]); tos=st.data1[st.top]; if(Action[tos][sym]==100) { cout<<\"出错\"; break; } else if(Action[tos][sym]==0) { cout<<\"acc\"; break; } else if(Action[tos][sym]>-1&&Action[tos][sym]!=100) {

//输出输入 cout<<\"S\"<cout<st.data1[st.top]=Goto[tos][p]; st.data2[st.top]=act[r][0]; } } cout<\"; //归约弹栈

实验运行截图:

(1)对输入串i +(i*i)# 进行分析

与手动分析一致。

(2)对输入串i+(ii*i)# 进行分析

与手动分析一致

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务