0 Star 0 Fork 71

yanpanting/compiler-homework2

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

搜索帮助