代码拉取完成,页面将自动刷新
同步操作将从 zren/compiler-homework2 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。