0 Star 0 Fork 71

Shinsoukun/compiler-homework2

forked from zren/compiler-homework2 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
lexer.c 2.31 KB
一键复制 编辑 原始数据 按行查看 历史
Shinsoukun 提交于 2016-04-21 21:44 . first push
#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);
num = 0;
strcpy(id, "\0");
while(x==' '||x=='\t'||x=='\n')
x=getc(fp);
if(x>='0'&&x<='9')
{
int i=0;
for(;x>='0'&&x<='9';x=getc(fp))
id[i++]=x;
id[i]='\0';
num=atoi(id);
token=11;
ungetc(x, fp);
}
else if((x>='a'&&x<='z')||(x>='A'&&x<='Z'))
{
int i=0;
for(;(x>='a'&&x<='z')||(x>='A'&&x<='Z')||(x>='0'&&x<='9');x=getc(fp))
id[i++]=x;
id[i]='\0';
token=10;
int j=0;
for(j=0;j<6;j++)
{
if(strcmp(keyword[j],id)==0)
{
token=j+1;
break;
}
}
ungetc(x, fp);
}
else
{
int i=0;
switch(x)
{
case '+':token=13;id[i++]='+';break;
case '-':token=14;id[i++]='-';break;
case '*':token=15;id[i++]='*';break;
case '/':token=16;id[i++]='/';break;
case ':':token=17;id[i++]=':';
x=getc(fp);
if(x=='=')
{
token=18;
id[i++]='=';
}
else
ungetc(x, fp);
break;
case '<':token=20;id[i++]='<';
x=getc(fp);
if(x=='>')
{
token=21;
id[i++]='>';
}
else if(x=='=')
{
token=22;
id[i++]='=';
}
else
ungetc(x, fp);
break;
case '>':token=23;id[i++]='>';
x=getc(fp);
if(x=='=')
{
token=24;
id[i++]='=';
}
else
ungetc(x, fp);
break;
case '=':token=25;id[i++]='=';break;
case ';':token=26;id[i++]=';';break;
case '(':token=27;id[i++]='(';break;
case ')':token=28;id[i++]=')';break;
case '#':token=0;id[i++]='#';break;
default:break;
}
id[i]='\0';
}
//process x
//process each regex here
//store the result in global variables id, num, or token
//in case of backtrack, use
//ungetc(x, fp);
}
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, %d)\n", num); 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/shinsoukun/compiler-homework2.git
git@gitee.com:shinsoukun/compiler-homework2.git
shinsoukun
compiler-homework2
compiler-homework2
master

搜索帮助