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

📄 wordanalysis.cpp

📁 这是我们学校平时实习的四个内容:词法分析、递归下降子程序、ll1语法分析、lr0语法分析 是我用c++编写的。
💻 CPP
字号:
//朱贺 民航学院
#include"iostream.h"
#include"string.h"
#include "stdlib.h"
#include "iomanip.h"
#define $INDEX "关键字"
#define $ID "标识符"
#define $INT "常数"
#define $ASSIGN  "运算符"
#define $RAL  "关系符"
#define $PAR "分隔符"
char instr[100],*current;
char ch;
char strtoken[15];//构成单词的字符串
int m;static int ckin,skin;
struct jtb{//字符表
	char name[20];
	char *num;
	int n;
}word[]={{"","0",0},{"int","1",1},{"float","2",2},{"bool","3",3},{"char","4",4},{"if","5",5},{"else","6",6},{"while","7",7},
{"do","8",8},{"=","9",9},{"+","10",10},{"-","11",11},{"*","12",12},{"/","13",13},{",","14",14},{"{","15",15},{"}","16",16},{"(","17",17},
{")","18",18},{";","19",19},{"<","20",20},{">","21",21},{"","22",22},{"","23",23},{"","24",24},{"","25",25},{"","26",26},{"","27",27},{"","28",28},
{"","29",29},{"","30",30},{"","31",31},{"","32",32},{"","33",33},{"","34",34},{"","35",35}};

struct result{
	char *code;
	char *value;
	char *id;
};
getchar(){//取字符
	ch=*current;
	current++;
}
getbc(){//去空格和回车
	if(ch==' '||ch=='\n')
		getchar();
}
concat(int n){//将ch加到strtoken里
	strtoken[n]=ch;
	strtoken[n+1]='\0';
}
bool isdigit(){
	if(ch>='0'&&ch<='9') return 1;
	else return 0;
}

bool isletter(){
	if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
		return 1;
	else return 0;
}

int reserve(){//判断是否在关键字表里并返回其编号
    int j=0,value=0;
	for(int i=1;i<=8;i++){
		if(strlen(strtoken)==strlen(word[i].name))
		while(strtoken[j]!='\0'){
			if(word[i].name[j]==strtoken[j]){
				j++;
				value=1;
			}
			else {value=0;break;}
		}
		if(value==1){
			value=word[i].n;break;}
	}
     return value;
	 }

 retract(int n){
	 current--;
	 strtoken[n]='\0';
	 ch=' ';
 }

 int insertid(){
    for(int i=0;i<strlen(strtoken);i++)
	{
		word[skin].name[i]=strtoken[i];
		}
	    skin++;
		return (skin-1);
	
	}
 int insertconst(){

    for(int i=0;i<strlen(strtoken);i++)
	{
		word[ckin].name[i]=strtoken[i];
		}
	    ckin++;
		return (ckin-1);
 }

result analysis(){
    int code,value;m=0;
	strtoken[0]='\0';result *node=new result;
	getchar();getbc();
	if(isletter()){
		while(isletter()||isdigit()){
			concat(m);getchar();
            m++;
		}
		retract(m);
		code=reserve();
		if(code==0){
			value=insertid();
            node->code=$ID;node->value=word[value].name;
			node->id=word[value].num;
			return *node;}
		else {
			node->code=$INDEX;
			node->value=word[code].name;
			node->id =word[code].num;
			return *node;}
	}
	else if(isdigit()){
		while(isdigit()||ch=='.'){
		concat(m);m++;
		getchar();
		}
	retract(m);
	value=insertconst();
	node->code=$INT;node->value=word[value].name;node->id=word[value].num;
	return *node;
}
	else if(ch=='='){
		node->code =$ASSIGN;
		node->value="=";
		node->id="9";
		return *node;
	}
	else if(ch=='+'){
        node->code =$ASSIGN;
		node->value="+";
		node->id="10";
		return *node;
	}
	else if(ch=='-'){
        node->code =$ASSIGN;
		node->value="-";
		node->id="11";
		return *node;
	}
    
	else if(ch=='/'){
        node->code =$ASSIGN;
		node->value="/";
		node->id="13";
		return *node;
	}
	else if(ch=='*'){
        node->code =$ASSIGN;
		node->value="*";
		node->id="12";
		return *node;
	}
	else if(ch==';'){
        node->code =$PAR;
		node->value=";";
		node->id="19";
		return *node;
	}
	else if(ch=='('){
        node->code =$PAR;
		node->value="(";
        node->id="17";
		return *node;
	}
	else if(ch==')'){
        node->code =$PAR;
		node->value=")";
		node->id="18";
		return *node;
	}
	else if(ch=='{'){
        node->code =$PAR;
		node->value="{";
		node->id="15";
		return *node;
	}
	else if(ch=='}'){
        node->code =$PAR;
		node->value="}";
		node->id="16";
		return *node;
	}
	else if(ch=='>'){
        node->code =$RAL;
		node->value=">";
        node->id="20";
		return *node;
	}
	else if(ch=='<'){
        node->code =$RAL;
		node->value="<";
        node->id="21";
		return *node;
		}
	else cout<<"错误!";
}

void main(){
	int i=0,j=0;
	char in;result out[10];
	do{cin>>in;
	   instr[i++]=in;
	   }while(in!='#');
	instr[i]='\0';cout<<instr<<endl;
	ckin=29;skin=22;current=instr;
	cout<<"类型"<<setw(12)<<"值"<<setw(18)<<"字符表ID"<<endl;
	cout<<"======"<<setw(12)<<"===="<<setw(16)<<"========"<<endl;
    while(*current!='#'){
		out[j++]=analysis();
		cout<<out[j-1].code<<setw(10)<<out[j-1].value<<setw(12)<<out[j-1].id <<endl;
			}
    
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -