⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ll1.cpp

📁 对自定的产生式规定LL(1)分析表后
💻 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 + -