0 Star 0 Fork 71

727240120/compiler-homework2

forked from zren/compiler-homework2 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
lexer.c 4.47 KB
一键复制 编辑 原始数据 按行查看 历史
727240120 提交于 2016-04-21 20:16 . homework2
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define KEY 6
char *keyword[KEY] = {"for", "if", "then", "else", "while", "do"};
char id[1024];
int num;
int token;
void lexical(FILE *fp) {
char x = getc(fp);//ȡǰַ
while(x==' '||x=='\n'||x=='\t')
{
x=getc(fp);
}
char temp='\0';
int i=0;
num = 0;
strcpy(id, "\0");
if((x>='A'&&x<='Z')||(x>='a'&&x<='z'))
{
id[i]=x;
i++;
x=getc(fp);
while((x>'a'&&x<'z')||(x>'A'&&x<'Z')||(x>'0'&&x<'9'))
{
id[i]=x;
i++;
x=getc(fp);
}
id[i]='\0';
ungetc(x,fp);
if(id[0]=='d'&&id[1]=='o')
{
token=6;
}
else if(id[0]=='i'&&id[1]=='f')
{
token=2;
}
else if(id[0]=='f'&&id[1]=='o'&&id[2]=='r')
{
token=1;
}
else if(id[0]=='t'&&id[1]=='h'&&id[2]=='e'&&id[3]=='n')
{
token=3;
}
else if(id[0]=='e'&&id[1]=='l'&&id[2]=='s'&&id[3]=='e')
{
token=4;
}
else if(id[0]=='w'&&id[1]=='h'&&id[2]=='i'&&id[3]=='l'&&id[4]=='e')
{
token=5;
}
else
{
token=10;
}
}
else if(x>='0'&&x<='9')
{
id[i]=x;
i++;
x=getc(fp);
if((x>='a'&&x<='z')||(x>='A'&&x<='Z'))
{
printf("\n");
return;
}
while(x>='0'&&x<='9')
{
id[i]=x;
i++;
x=getc(fp);
}
id[i]='\0';
ungetc(x,fp);
token=11;
return;
}
else
{
if(x==':')
{
id[i++]=':';
x=getc(fp);
if(x=='=')
{
id[i++]='=';
id[i]='\0';
token=18;
return;
}
else
{
ungetc(x,fp);
token=17;
return;
}
}
else if(x=='<')
{
id[i++]='<';
x=getc(fp);
if(x=='>')
{
id[i++]='>';
id[i]='\0';
token=21;
return;
}
else if(x=='=')
{
id[i++]='=';
id[i]='\0';
token=22;
return;
}
else
{
ungetc(x,fp);
id[i]='\0';
token=20;
}
}
else if(x=='>')
{
id[i++]='>';
x=getc(fp);
if(x=='=')
{
id[i++]='=';
id[i]='\0';
token=24;
return;
}
else
{
ungetc(x,fp);
id[i]='\0';
token=23;
return;
}
}
else if(x=='-')
{
token=14;
id[0]='-';
id[1]='\0';
return;
}
else if(x=='+')
{
token=13;
id[0]='+';
id[1]='\0';
return;
}
else if(x==';')
{
token=26;
id[0]=';';
id[1]='\0';
return;
}
else if(x=='*')
{
token=15;
id[0]='*';
id[1]='\0';
return ;
}
else if(x=='/')
{
token=16;
id[0]='/';
id[1]='\0';
return;
}
else if(x=='=')
{
token=25;
id[0]='=';
id[1]='\0';
return;
}
else if(x=='(')
{
token=27;
id[0]='(';
id[1]='\0';
return;
}
else if(x=='#')
{
token=0;
id[0]='#';
id[1]='\0';
return;
}
else if(x==')')
{
token=28;
id[0]=')';
id[1]='\0';
return;
}
}
}
int main(int argc, const char *argv[])
{
if(argc < 2) {
printf("insufficient args\n");
return 1;
}
FILE *fp = fopen(argv[1], "r");
do {
lexical(fp);
switch(token) {
case 10: printf("(id, %s)\n", id); break;
case 11: printf("(num, %s)\n", id); break;
case -1: printf("error!\n"); break;
default: printf("(%d, %s)\n", token, id);
}
} while(token != 0);
fclose(fp);
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zengxb/compiler-homework2.git
git@gitee.com:zengxb/compiler-homework2.git
zengxb
compiler-homework2
compiler-homework2
master

搜索帮助