📄 ll(1)分析法.cpp
字号:
#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "afx.h"
//产生式定义
CString str[]={"E->TG" , "G->+TG" , "G->-TG" , "G->e" , "T->FS" ,//用小写的e代替ε
"S->*FS" , "S->/FS" , "S->e" , "F->(E)" , "F->i"};
main(){
CString str1="",str2="#E";
char c;
int count=1;//步骤计算
int i,j;
printf("LL(1)分析程序,编制人:刘灿明 Ap0406519 网络工程\n\n");
printf("请输入一以#结束的符号串(包括+-*/()i#):");
c=getchar();
while(c!='\n'){
str1.Insert(str1.GetLength(),c);
c=getchar();
}
printf("步骤 分析栈 剩余输入串 所用产生式\n");
printf(" %d ",count++);
for(i=0;i<str2.GetLength();i++)
printf("%c",str2.GetAt(i));
for(i=0;i+str2.GetLength()<12;i++)
printf(" ");
for(i=0;i<str1.GetLength();i++)
printf("%c",str1.GetAt(i));
for(i=0;i+str1.GetLength()<16;i++)
printf(" ");
j=0;
for(i=0;i<str[j].GetLength();i++)
printf("%c",str[j].GetAt(i));
printf("\n");
while(!str1.IsEmpty()&&!str2.IsEmpty()){
if(j<10){
str2.Delete(str2.GetLength()-1);
for(i=str[j].GetLength()-1;i>=3;i--)
str2.Insert(str2.GetLength(),str[j].GetAt(i));
j=10;
}
if(str2.GetAt(str2.GetLength()-1)=='e')
str2.Delete(str2.GetLength()-1);
printf(" %d ",count++);
for(i=0;i<str2.GetLength();i++)
printf("%c",str2.GetAt(i));
for(i=0;i+str2.GetLength()<12;i++)
printf(" ");
for(i=0;i<str1.GetLength();i++)
printf("%c",str1.GetAt(i));
for(i=0;i+str1.GetLength()<16;i++)
printf(" ");
//判断匹配和寻找产生式
if(str1.GetAt(0)==str2.GetAt(str2.GetLength()-1)){
str1.Delete(0);
str2.Delete(str2.GetLength()-1);
printf("匹配\n");
if(str1.IsEmpty()&&str2.IsEmpty())
printf("成功!\n");
}
else{
if(str1.GetAt(0)!='#'&&str2.GetAt(str2.GetLength()-1)!='#'){
for(i=0;i<10;i++){
if(str[i].GetAt(0)==str2.GetAt(str2.GetLength()-1)&&str[i].GetAt(3)>=65&&str[i].GetAt(3)<=90){
j=i;
break;
}
if(str[i].GetAt(0)==str2.GetAt(str2.GetLength()-1)&&str[i].GetAt(3)=='e'){
j=i;
break;
}
if(str[i].GetAt(0)==str2.GetAt(str2.GetLength()-1)&&str[i].GetAt(3)==str1.GetAt(0)){
j=i;
break;
}
}
if(i==10){
printf("出错!\n");
break;
}
}
else if(str1.GetAt(0)=='#'&&str2.GetAt(str2.GetLength()-1)!='#'){
for(i=0;i<10;i++){
if(str[i].GetAt(0)==str2.GetAt(str2.GetLength()-1)&&str[i].GetAt(3)=='e'){
j=i;
break;
}
}
if(i==10){
printf("出错!\n");
break;
}
}
else if(str1.GetAt(0)=='#'&&str2.GetAt(str2.GetLength()-1)=='#'){
printf("成功!\n");
return;
}
else{
printf("出错!\n");
break;
}
for(i=0;i<str[j].GetLength();i++)
printf("%c",str[j].GetAt(i));
printf("\n");
}
//判断匹配和寻找产生式
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -