0x00 前言
最近在学编译原理,一个简单的词法分析程序。
0x01 题目描述
0x02 代码
#include<bits/stdc++.h>
int iskeyword(char tmp[])
{
if(!strcmp(tmp,"main")||!strcmp(tmp,"if")||!strcmp(tmp,"else")||!strcmp(tmp,"for")||!strcmp(tmp,"while")||!strcmp(tmp,"int"))
return 1;
else
return 0;
}
int islitter(char ch)
{
if(ch>='a'&&ch<='z')
return 1;
else if (ch>='A'&&ch<='Z')
return 1;
else
return 0;
}
int isnumber(char ch )
{
if(ch >= '0' && ch <= '9')
return 1;
else
return 0;
}
int isjf(char ch )
{
if(ch == '(' || ch == ')' || ch == '{' || ch == '}' || ch == ',' || ch == ';')
return 1;
else
return 0;
}
int iszf(char ch )
{
if(ch == '>' || ch == '<' || ch == '=' || ch == '!' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
return 1;
else
return 0;
}
int main()
{
char ch;
char tmp[100];
int line = 0;
int i = 0;
while(~scanf("%c",&ch))
{
if (ch == ' ' || ch == '\t')
continue;
else if (ch == '\n')
line ++;
else if (islitter(ch) || ch == '_')
{
while(islitter(ch) || isnumber(ch) || ch == '_')
{
tmp[i++] = ch;
scanf("%c",&ch);
}
tmp[i] = '\0';
i = 0;
if(iskeyword(tmp))
printf("(keyword,%s)\n",tmp);
else
printf("(identifier,%s)\n",tmp);
ungetc(ch,stdin);//将字符退回到输入流
}
else if (isnumber(ch))
{
while(isnumber(ch))
{
tmp[i++] = ch;
scanf("%c",&ch);
}
tmp[i] = '\0';
i = 0;
printf("(integer,%s)\n",tmp);
ungetc(ch,stdin);
}
else if (isjf(ch))
{
printf("(boundary,%c)\n",ch);
}
else if (iszf(ch))
{
while(iszf(ch))
{
tmp[i++] = ch;
scanf("%c",&ch);
}
tmp[i] = '\0';
i = 0;
printf("(operator,%s)\n",tmp);
ungetc(ch,stdin);
}
}
return 0;
}