?? ll(1)分析法.cpp
字號(hào):
#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "afx.h"
//產(chǎn)生式定義
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;//步驟計(jì)算
int i,j;
printf("LL(1)分析程序,編制人:劉燦明 Ap0406519 網(wǎng)絡(luò)工程\n\n");
printf("請(qǐng)輸入一以#結(jié)束的符號(hào)串(包括+-*/()i#):");
c=getchar();
while(c!='\n'){
str1.Insert(str1.GetLength(),c);
c=getchar();
}
printf("步驟 分析棧 剩余輸入串 所用產(chǎn)生式\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(" ");
//判斷匹配和尋找產(chǎn)生式
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("出錯(cuò)!\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("出錯(cuò)!\n");
break;
}
}
else if(str1.GetAt(0)=='#'&&str2.GetAt(str2.GetLength()-1)=='#'){
printf("成功!\n");
return;
}
else{
printf("出錯(cuò)!\n");
break;
}
for(i=0;i<str[j].GetLength();i++)
printf("%c",str[j].GetAt(i));
printf("\n");
}
//判斷匹配和尋找產(chǎn)生式
}
getch();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -