LR1.docx
- 文档编号:28006321
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:16
- 大小:16.21KB
LR1.docx
《LR1.docx》由会员分享,可在线阅读,更多相关《LR1.docx(16页珍藏版)》请在冰豆网上搜索。
LR1
/*
对应文法:
E->E+T
E->E-T
E->T
T->T*F
T->T/F
T->F
F->(E)
F->i
*/
#include"stdio.h"
#include"string.h"
/*************************LR
(1)分析表********************************/
/*+-*/()i#ETF*/
chartable[30][11][4]=
/*0*/{"e","e","e","e","s4","e","s5","e","1","2","3",
/*1*/"s6","s7","e","e","e","e","e","acc","e","e","e",
/*2*/"r3","r3","s8","s9","e","e","e","r3","e","e","e",
/*3*/"r6","r6","r6","r6","e","e","e","r6","e","e","e",
/*4*/"e","e","e","e","s13","e","s14","e","10","11","12",
/*5*/"r8","r8","r8","r8","e","e","e","r8","e","e","e",
/*6*/"e","e","e","e","s4","e","s5","e","e","15","3",
/*7*/"e","e","e","e","s4","e","s5","e","e","16","3",
/*8*/"e","e","e","e","s4","e","s5","e","e","e","17",
/*9*/"e","e","e","e","s4","e","s5","e","e","e","18",
/*10*/"s20","s21","e","e","e","s19","e","e","e","e","e",
/*11*/"r3","r3","s22","s23","e","r3","e","e","e","e","e",
/*12*/"r6","r6","r6","r6","e","r6","e","e","e","e","e",
/*13*/"e","e","e","e","s13","e","s14","e","24","11","12",
/*14*/"r8","r8","r8","r8","e","r8","e","e","e","e","e",
/*15*/"r1","r1","s8","s9","e","e","e","r1","e","e","e",
/*16*/"r2","r2","s8","s9","e","e","e","r2","e","e","e",
/*17*/"r4","r4","r4","r4","e","e","e","r4","e","e","e",
/*18*/"r5","r5","r5","r5","e","e","e","r5","e","e","e",
/*19*/"r7","r7","r7","r7","e","e","e","r7","e","e","e",
/*20*/"e","e","e","e","s13","e","s14","e","e","25","12",
/*21*/"e","e","e","e","s13","e","s14","e","e","26","12",
/*22*/"e","e","e","e","s13","e","s14","e","e","e","27",
/*23*/"e","e","e","e","s13","e","s14","e","e","e","28",
/*24*/"s20","s21","e","e","e","s29","e","e","e","e","e",
/*25*/"r1","r1","s22","s23","e","r1","e","e","e","e","e",
/*26*/"r2","r2","s22","s23","e","r2","e","e","e","e","e",
/*27*/"r4","r4","r4","r4","e","r4","e","e","e","e","e",
/*28*/"r5","r5","r5","r5","e","r5","e","e","e","e","e",
/*29*/"r7","r7","r7","r7","e","r7","e","e","e","e","e",
};
intstep=0;///输出步骤计数
charinput[100];//输入串
intinputCount=0;//输入串计数
intstateStack[10];//状态栈
intstateStackCount=0;//状态栈计数
charcharacterStack[10];//符号栈
intcharacterStackCount=0;//符号栈计数
voidstateStackPush(intpush)//状态栈入栈
{
stateStack[stateStackCount++]=push;
}
voidstateStackPop()//状态栈出栈
{
if(stateStackCount>0)
{
stateStack[stateStackCount--]='\0';
}
}
voidcharacterStackPush(charpush)//符号栈入栈
{
characterStack[characterStackCount++]=push;
}
voidcharacterStackPop()//符号栈出栈
{
if(characterStackCount>0)
{
characterStack[characterStackCount--]='\0';
}
}
voidoutputStateStack()//输出状态栈
{
inti=0;
while(i { printf("%d",stateStack[i++]); } printf("\t\t"); } voidoutputCharacterStack()//输出符号栈 { inti=0; while(characterStack[i]! ='\0') { printf("%c",characterStack[i++]); } printf("\t\t"); } voidoutputLastInput()//输出剩余输入串 { inti=inputCount; while(input[i]! ='\0') { printf("%c",input[i++]); } printf("\t\t"); } voidoutputTotalInput()//输出全部输入串 { inti=0; while(input[i]! ='\0') printf("%c",input[i++]); } voidoutput()//输出信息 { printf("\n%d\t",step++); outputStateStack(); outputCharacterStack(); outputLastInput(); } boolcopy(chararray[],inti,intj)///将table中字符串赋到value中 { boolres; if(j=='+') { strcpy(array,table[i][0]); res=true; } elseif(j=='-') { strcpy(array,table[i][1]); res=true; } elseif(j=='*') { strcpy(array,table[i][2]); res=true; } elseif(j=='/') { strcpy(array,table[i][3]); res=true; } elseif(j=='(') { strcpy(array,table[i][4]); res=true; } elseif(j==')') { strcpy(array,table[i][5]); res=true; } elseif(j=='i') { strcpy(array,table[i][6]); res=true; } elseif(j=='#') { strcpy(array,table[i][7]); res=true; } elseif(j=='E') { strcpy(array,table[i][8]); res=true; } elseif(j=='T') { strcpy(array,table[i][9]); res=true; } elseif(j=='F') { strcpy(array,table[i][10]); res=true; } else { res=false; } returnres; } voidcheck(inti,charj)///核心分析程序 { charvalue[4]; if(copy(value,i,j)==true) { intvalueCount=0; if(value[valueCount]=='s')//移进操作 { output(); printf("移进"); valueCount++; if(value[valueCount]=='2')//s20,s21,s22,s24,s29 { valueCount++; stateStackPush(20+value[valueCount]-48); characterStackPush(input[inputCount]); inputCount++; } elseif(value[valueCount]=='1')//s13,s18,s19 { valueCount++; stateStackPush(10+value[valueCount]-48); characterStackPush(input[inputCount]); inputCount++; } else//s4,s5,s6,s7,s8,s9 { stateStackPush(value[valueCount]-48); characterStackPush(input[inputCount]); inputCount++; } check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='r')//归约操作 { output(); printf("归约"); valueCount++; if(value[valueCount]=='1') { printf("E->E+T"); characterStackPop(); characterStackPop(); characterStackPop(); characterStackPush('E'); stateStackPop(); stateStackPop(); stateStackPop(); } elseif(value[valueCount]=='2') { printf("E->E-T"); characterStackPop(); characterStackPop(); characterStackPop(); characterStackPush('E'); stateStackPop(); stateStackPop(); stateStackPop(); } elseif(value[valueCount]=='3') { printf("E->T"); characterStackPop(); characterStackPush('E'); stateStackPop(); } elseif(value[valueCount]=='4') { printf("T->T*F"); characterStackPop(); characterStackPop(); characterStackPop(); characterStackPush('T'); stateStackPop(); stateStackPop(); stateStackPop(); } elseif(value[valueCount]=='5') { printf("T->T/F"); characterStackPop(); characterStackPop(); characterStackPop(); characterStackPush('T'); stateStackPop(); stateStackPop(); stateStackPop(); } elseif(value[valueCount]=='6') { printf("T->F"); characterStackPop(); characterStackPush('T'); stateStackPop(); } elseif(value[valueCount]=='7') { printf("F->(E)"); characterStackPop(); characterStackPop(); characterStackPop(); characterStackPush('F'); stateStackPop(); stateStackPop(); stateStackPop(); } elseif(value[valueCount]=='8') { printf("F->i"); characterStackPop(); characterStackPush('F'); stateStackPop(); } check(stateStack[stateStackCount-1],characterStack[characterStackCount-1]); } elseif(value[valueCount]=='1')///归约后状态栈信息变化1,10,11,12,14,15,16,17 { valueCount++; if(value[valueCount]=='\0') { stateStackPush (1); } elseif(value[valueCount]=='0') { stateStackPush(10); } elseif(value[valueCount]=='1') { stateStackPush(11); } elseif(value[valueCount]=='2') { stateStackPush(12); } elseif(value[valueCount]=='4') { stateStackPush(14); } elseif(value[valueCount]=='5') { stateStackPush(15); } elseif(value[valueCount]=='6') { stateStackPush(16); } elseif(value[valueCount]=='7') { stateStackPush(17); } check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='2')///归约后状态栈信息变化2,23,25,26,27,28 { valueCount++; if(value[valueCount]=='\0') { stateStackPush (2); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='3') { stateStackPush(23); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='5') { stateStackPush(25); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='6') { stateStackPush(26); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='7') { stateStackPush(27); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='8') { stateStackPush(28); check(stateStack[stateStackCount-1],input[inputCount]); } } elseif(value[valueCount]=='3')///归约后状态栈信息变化3 { stateStackPush(3); check(stateStack[stateStackCount-1],input[inputCount]); } elseif(value[valueCount]=='a')///acc成功 { output(); printf("分析成功\n\n"); outputTotalInput(); printf("为合法符号串\n"); } else//error { printf("分析出错2\n\n"); outputTotalInput(); printf("为非法符号串\n"); } } elseif(copy(value,i,j)==false)//error { printf("分析出错1\n\n"); outputTotalInput(); printf("为非法符号串\n"); } } voidmain() { printf("LP (1)分析程序,编制人: ****\n"); printf("输入一以#结束的符号串(包括+-*/()i#): "); scanf("%s",input); printf("\n步骤状态栈符号栈剩余输入串动作所用产生式\n"); stateStackPush(0); characterStackPush('#'); check(stateStack[stateStackCount],input[inputCount]); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LR1