编译原理。求结构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
自己写的,感觉好多缺陷:
------解决思路----------------------
构造DFA啊..
------解决思路----------------------
参考TCC源代码。
------解决思路----------------------
http://blog.****.net/u013298384/article/details/45675019
构造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