📄 ll1.cpp
字号:
#include<iostream>
#include<string>
using namespace std;
const int MAX_SIZE=100;
char symbol[MAX_SIZE];//分析栈
char terminal[6]={'i','+','*','(',')','#'};//终结符
//LL(1)分析表
char fenxibiao[5][6][10]={
{"TM","0","0","TM","0","0"},
{"0","+TM","0","0","1","1"},
{"FN","0","0","FN","0","0"},
{"0","1","*FN","0","1","1"},
{"i","0","0","(E)","0","0"}
};
//查找分析表函数
char * findout(char * & kk,char a,char b){
char *row="EMTNF";
char *col="i+*()#";
int r=0,c=0;
while((*row)!=a) {r++;row++;}
while((*col)!=b) {c++;col++;}
kk=fenxibiao[r][c];
return kk;
}
bool isLegal(char *str){
char *css=0;//产生式指针
int csslen=0;//产生式长度
int top=-1;//栈顶标记符
char x;//栈顶弹出符
char a;//当前指向的字符
//将“#”和文法开始符依次压入栈(用数组表示)中
symbol[top+1]='#';top++;
symbol[top+1]='E';top++;
//把第一个输入符号读入a;
char *instr=str;
a=*instr;
do{
//把栈顶符号弹出并放入x中;
x=symbol[top];
css=0;
//查分析表
findout(css,x,a);//while(*css!='\0'){cout<<*css;css++;}
if((*css)==terminal[0]||(*css)==terminal[1]||(*css)==terminal[2]||(*css)==terminal[3]||(*css)==terminal[4]||(*css)==terminal[5]){
if((*css)==a){
if(a!='#') {
instr++;
a=*instr;//把下一输入符号读入a中
top--;//做匹配,栈顶标记符退后一位
// for(int m=0;m<=top;m++)cout<<symbol[m];
}
}
else return false ;
}
else if(((*css)!='0')){ //产生式不为0
//输出所找到的产生式
if((*css)=='1')
top--;//只将栈顶符抛出
else{
while(css[csslen]!='\0') {csslen++;}//直到产生式结束
while(csslen)
{
//倒序把产生式->后面的字符压入栈,栈顶符top加上相应长度
symbol[top++]=css[csslen-1];
csslen--;
}
css=0;//压入栈后,产生式初始化为0
}
}else return false;
}while(x!='#');
return true;
}
void main(){
if(isLegal("i+i#"))
cout<<"is legal expression";
else
cout<<"isn't legal expression";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -