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;
}