编译原理。求结构C语言的词法分析程序

编译原理。求构造C语言的词法分析程序
构造miniC语言的词法分析程序,程序要求能对输入的字符串流进行词法分析,并输出相应的单词。miniC语言的单词包括整数、标识符、分隔符、运算符和关键字,编制相应的词法分析程序。

标识符    ID = letter (letter|digit)*
                                    letter = a | .. | z | A | .. | Z 
                                    digit = 0 | .. | 9
十进制整数    0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
运算符                   +  -  *  /  <  <=   ==  =  !=  > >=
分隔符                      ( ) {  } [ ];,
关键字     if  else  return int void  while main


自己写的,感觉好多缺陷:
#include <stdio.h>
#include <stdlib.h>

int is_letter(char cha)
{
    if((cha >= 'a' && cha <= 'z') || (cha >= 'A' && cha <= 'Z'))
    return 1;
    else
    return 0;
}
int is_digit(char cha)
{
    if(cha >= '0' && cha <= '9')
    return 1;
    else
    return 0;
}
int is_operator(char cha)
{
    if(cha == '+' || cha=='-' ||cha == '*' || cha=='/' ||cha == '<' || cha=='<=' ||cha == '==' || cha=='=' ||cha == '!=' || cha=='>' || cha =='>=')
    return 1;
    else
    return 0;
}
int is_fgf(char cha)
{
    if(cha=='(' || cha==')' || cha=='{' || cha=='}' || cha=='[' ||cha==']')
    return 1;
    else
    return 0;
}
int is_gjc(char *str)
{
    char s1[]="if";
    char s2[]="else";
    char s3[]="return";
    char s4[]="int";
    char s5[]="void";
    char s6[]="while";
    char s7[]="main";
    if(strcmp(str,s1)==0 || strcmp(str,s2)==0 || strcmp(str,s3)==0 || strcmp(str,s4)==0 || strcmp(str,s5)==0 || strcmp(str,s6)==0 || strcmp(str,s7)==0)
    return 1;
    else
    return 0;
}
int is_identify(char *str)
{
    int state = 1;
    int i = 0;
    while(str[i] != '\0')
    {
        if(state == 1 && is_letter(str[i]))
           state=2;
        else
        break;
        if((state == 2 && is_letter(str[i])) || is_digit(str[i]))
           state=2;
        i++;
    }
    if(state == 2)
    return 1;
    else return 0;
}
int is_identify1(char *str)
{
    int i=0;
    int j=1;
    while(str[i]!='\0')
    {
        if(!(is_digit(str[i])))
        {
            j=0;
            break;
        }
        i++;
    }
    if(j==1)
    return 1;
    else return 0;
}
int is_identify2(char *str)
{
    int i=0;
    int j=1;
    while(str[i]!='\0')
    {
        if(!(is_operator(str[i])))
        {
            j=0;
            break;
        }
        i++;
    }
    if(j==1)
    return 1;
    else return 0;
}
int is_identify3(char *str)
{
    int i=0;
    int j=1;
    while(str[i]!='\0')
    {
        if(!(is_fgf(str[i])))
        {
            j=0;
            break;
        }
        i++;
    }
    if(j==1)
    return 1;
    else return 0;
}
int main()
{
    char *str="a3232a";
    int i,j,k,l,g;
    i=is_identify(str);
    j=is_identify1(str);
    k=is_identify2(str);
    l=is_identify3(str);
    if(is_gjc(str))
    {printf("该字符串为关键词");}
    else if(i==1)
    {printf("该字符串为标识符");}
    else if(j==1)
    {printf("该字符串为十进制整数");}
    else if(k==1)
    {printf("该字符串为运算符");}
    else if(l==1)
    {printf("该字符串为分隔符");}
    else
    {printf("什么都不是");}
    return 0;
}

------解决思路----------------------
构造DFA啊..
------解决思路----------------------
参考TCC源代码。
------解决思路----------------------
http://blog.****.net/u013298384/article/details/45675019