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

C语言 码拜 10年前 (2015-05-11) 1277次浏览 0个评论

构造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;
}
分三类即可
1.字符串2.控制字符(包括运算符)3.数值
10分
构造DFA啊..
10分
参考TCC源代码。
20分
http://blog.csdn.net/u013298384/article/details/45675019

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明编译原理。求构造C语言的词法分析程序
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!