C语言简单词法分析器实现

2020-05-21  本文已影响0人  大栗几

文章来源本人的博客:http://codelifeliwan.github.io/ 转载请注明出处

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_KEY 39
#define MAX_COUPLE_OP 16
char C[100];
char temp[100];
#define MAX_TYPE 100
int type[MAX_TYPE];
int count=0;
char
S[MAX_KEY+1][10]={“”,”auto”,”break”,”case”,”char”,”const”,”continue”,”default”,”do”,”double”,”else”,”enum”,”extern”,”float”,”for”,
“goto”,”if”,”inline”,”int”,”long”,”register”,”resteict”,”return”,”short”,”signed”,”sizeof”,”static”,”struct”,”switch”,
     
“typedef”,”union”,”unsigned”,”void”,”volatile”,”while”,”#include”,”#define”,”#ifdef”,”#ifndef”,”#endif”};
char
couple_op[MAX_COUPLE_OP+1][5]={“==”,”>=”,”<=”,”!=”,”?:”,”+=”,”-=”,”*=”,”/=”,”<<“,”>>”,”<<==”,”>>==”,”++”,”–“,”->”};
int is_char(char c){
 
if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’)||(c>=’0’&&c<=’9′)||(c==’_’))return
1;
  return 0;
}
int is_keyword(char *c,int begin,int *x){
  int i,j=0,k=0;
  int len=strlen(c);
  memset(temp,0,sizeof(temp));
 
for(i=begin;i<len;i++){
    temp[k++]=c[i];
   
for(j=1;j<=MAX_KEY;j++){
     
if((!is_char(c[i+1]))&&(!strcmp(S[j],temp))){
*x=j;
return i;
     
}
    }
  }
  return -1;
}
int is_signal(char *c,int begin){
  int i;
  int len=strlen(c);
 
if(!(c[begin]==’_’||(c[begin]>=’a’&&c[begin]<=’z’)||(c[begin]>=’A’&&c[begin]<=’Z’)))return
-1;
  //
  if(is_keyword(c,begin))return -1;
 
for(i=begin;i<len;i++){
   
if(!(is_char(c[i])))return i-1;
  }
  return len-1;
}
int is_char_digit(char c){
 
if(c>=’0’&&c<=’9′)return
1;
  return 0;
}
int is_digit(char *c,int begin){
  int i=begin;
  int len=strlen(c);
  int mark=0;
  if(c[begin]==’-‘)i++;
  if(!is_char_digit(c[i]))return -1;
  for(;i<len;i++){
   
if(is_char(c[i])&&(!(is_char_digit(c[i])))){
     
return -1;
    }
   
if(!mark&&c[i]==’.’){
     
mark=1;
     
continue;
    }
   
if(!is_char_digit(c[i])){
     
return i-1;
    }
  }
  return len-1;
}
int is_single_op(char c){
 
if(c==’=’||c==’+’||c==’-‘||c==’*’||c==’/’||c=='<‘||c==’>’||c==';’
   
  ||c==’#’||c==’|’||c==’&’||c==’!’||c==’~’||c=='(‘||c==’)’||c=='{‘
   
  ||c==’}’||c=='<‘||c==’>’||c=='”‘||c==”’||c==’.’||c==’%’||c==’\’
   
  ||c==’,’||c=='[‘||c==’]’)
    return 1;
  return 0;
}
int is_couple_op(char *c,char begin){
  int len=strlen(c);
  int i,j=0,k=0;
  memset(temp,0,sizeof(temp));
 
for(i=begin;i<len;i++){
   
if(!is_single_op(c[i]))return -1;
    temp[k++]=c[i];
   
for(j=0;j<MAX_COUPLE_OP;j++){
     
if(!strcmp(temp,couple_op[j])){
return i;
     
}
    }
  }
  return -1;
}
int is_ops(char *c,int begin){
  int re=is_couple_op(c,begin);
  char c1;
  if(re!=-1)return re;
  //负数判断
  if(c[begin]==’-‘){
    if(begin==0)return
-1;
    c1=c[begin-1];
   
if(c1=='(‘||c1==’=’||c1==’>’||c1=='<‘){
     
return -1;
    }
  }
  re=is_single_op(c[begin]);
  if(re)return begin;
  return -1;
}
int check_others(char *c,int begin){
  int i;
  int len=strlen(c);
  if(c[begin]=='”‘){
   
if(begin==0||’\’!=c[begin-1]){
     
for(i=begin+1;i<len;i++){
if(c[i]=='”‘&&c[i-1]!=’\’){
  return i-1;
}
     
}
    }
  }else
if(c[begin]=='<‘&&type[(count-2)%MAX_TYPE]<=MAX_KEY){
   
for(i=begin+1;i<len;i++){
     
if(c[i]==’>’){
return i-1;
     
}
    }
  }
  return -1;
}
void print_c(char *c,int begin,int end){
 
for(;begin<=end;begin++){
   
printf(“%c”,c[begin]);
  }
}
void scan(char *c){
  int len=strlen(c);
  int i,j,tmp,x;
  if(0==len)return;
  for(i=0;i<len;i++){
   
tmp=is_keyword(c,i,&x);
    if(tmp!=-1){
     
//处理keyword的输出
     
printf(“(%d,%s)n”,x,S[x]);
     
i=tmp;
     
type[count]=x;
     
count=(count+1)%MAX_TYPE;
     
continue;
    }
    tmp=is_ops(c,i);
    if(tmp!=-1){
     
//处理符号输出
     
j=i;
     
i=tmp;
     
printf(“(42,”);
     
print_c(c,j,i);
     
printf(“)n”);
     
type[count]=42;
     
count=(count+1)%MAX_TYPE;
     
tmp=check_others(c,i);
     
if(tmp!=-1){
j=i+1;
i=tmp;
printf(“(43,”);
print_c(c,j,i);
printf(“)n”);
type[count]=43;
count=(count+1)%MAX_TYPE;
     
}
     
continue;
    }
   
tmp=is_signal(c,i);
    if(tmp!=-1){
     
//处理signal的输出
     
j=i;
     
i=tmp;
     
printf(“(40,'”);
     
print_c(c,j,i);
     
printf(“‘)n”);
     
type[count]=40;
     
count=(count+1)%MAX_TYPE;
     
continue;
    }
    tmp=is_digit(c,i);
    if(tmp!=-1){
     
//处理digit的输出
     
j=i;
     
i=tmp;
     
printf(“(41,”);
     
print_c(c,j,i);
     
printf(“)n”);
     
type[count]=41;
     
count=(count+1)%MAX_TYPE;
     
continue;
    }
   
printf(“***********ERROR************n”);
    return;
  }
}
int main()
{
  freopen(“in.txt”,”r”,stdin);
  // freopen(“out.txt”,”w”,stdout);
  count=0;
  while(scanf(“%s”,C)!=EOF){
    scan(C);
  }
  return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读