【问题描述】设计c语言常见单词的正规式,编制lex源文件,利用flex编译得到词法分析的.c文件,继而对该文件编译得到词法分析器。
【输入形式】输入一段c语言程序
【输出形式】各类单词的token字,或者给出程序中的单词错误。
【样例输入】
int main(){
int a = 10;
double b = 20.9;
if(a <= b)
a+=b;
else a = 0;
return a;
}
【样例输出】
line1:(type, int)
line1:(keyword, main)
line1:(bracket, ()
line1:(bracket, ))
line1:(bracket, {
)
line2:(type, int)
line2:(identify, a)
line2:(OPT, =)
line2:(integer, 10)
line2:(bracket, ;)
line3:(type, double)
line3:(identify, b)
line3:(OPT, =)
line3:(decimal, 20.9)
line3:(bracket, ;)
line4:(keyword, if)
line4:(bracket, ()
line4:(identify, a)
line4:(OPT, <=)
line4:(identify, b)
line4:(bracket, ))
line5:(identify, a)
line5:(OPT, +=)
line5:(identify, b)
line5:(bracket, ;)
line6:(keyword, else)
line6:(identify, a)
line6:(OPT, =)
line6:(integer, 0)
line6:(bracket, ;)
line7:(keyword, return)
line7:(identify, a)
line7:(bracket, ;)
line8:(bracket, })
【样例说明】需要识别的关键字包括main, return, if, else, do, while, for, scanf, printf, sqrt, abs;type类型包括void, int, double, float, char;运算符(算术、关系、逻辑、位);需要识别的其他单词有标识符, 整数(十进制形式、指数形式),实数(十进制形式、指数形式),字符串(输出类型名为string);过滤注释及空格。
【评分标准】根据设计文档的质量、lex文件的正确性,代码的正确性、代码的时间空间复杂度、识别单词的种类等综合评分
实现代码:
%option noyywrap
%{
#include
#include
int line=1;
typedef struct answer{
int line;
char type[100];
char text[100];
}s;
s a[1000];
int x=1;
void push(int line1,char *type,char *text){
a[x].line=line1;
strcpy(a[x].type,type);
strcpy(a[x].text,text);
x++;
}
int error=0;
%}
digital [0-9]
integer ("+"|"-")?[0-9]{
digital}*
decimal {
integer}(.(0)*[1-9]{
digital}*)
float [0-9]*([0-9]\.?|\.[0-9])[0-9]*([Ee]([-+]?[0-9]+)?)
alphabet [A-Za-z]
identify ({
alphabet}|"_")({
alphabet}|"_"|{
digital})*
OPT ("+"|"-"|"*"|"/"|"+="|"-="|"*="|"/="|"++"|"--"|">"|"<"|">="|"<="|"=="|"=")
type ("int"|"void"|"char"|"float"|"double")
keyword ("if"|"else"|"scanf"|"printf"|"for"|"while"|"return"|"do"|"main"|"abs"|"sqrt")
typeidentify ("&"|"%"){
alphabet}
bracket ("("|")"|"{"|"}"|"["|"]"|"\""|","|";"|":"|"\'")
%%
\n {
line++;}
\s {
}
{
keyword} {
push(line,"keyword",yytext);}
{
OPT} {
push(line,"OPT",yytext);}
{
type} {
push(line,"type",yytext);}
{
typeidentify} {
push(line,"typeidentify",yytext);}
{
identify} {
push(line,"identify",yytext);}
{
integer} {
push(line,"integer",yytext);}
{
decimal} {
push(line,"decimal",yytext);}
{
bracket} {
push(line,"bracket",yytext);}
{
float} {
char *c=strchr(yytext,'e');
int n=strlen(yytext);
if(c!=0&&yytext[n-1]=='e'){
error=1;
printf("Error at Line %d: Illegal floating point number \"%s\".\n",line,yytext);
}
push(line,"float",yytext);
}
"//".* {
}
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] {
}
%%
int main(){
int i=1;
yyin=stdin;
yylex();
if(error==1){
return 0;
}
else
while(i<x){
printf("line%d:(%s, %s)\n",a[i].line,a[i].type,a[i].text);
i++;
}
}