📄 wordanalysis.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 + -