{
if(strcmp(s,reserved_words[i].str)==0)
return reserved_words[i].tok;
}
return ID;
}
static char GetChar(void)
{
if(linepos >= bufsize)
{
lineno++;
if(fgets(lineBuf,BUFLEN-1,source))
{
printf("%d:%s",lineno,lineBuf);
bufsize = strlen(lineBuf);
linepos = 0;
return lineBuf[linepos++];
}
else
return EOF;
}
else
return lineBuf[linepos++];
}
static void UngetChar(void)
{
linepos--;
}
void PrintToken(token_type token,const char *tokenString)
{
int i;
switch (token)
{
case ID:
printf("ID,name=%s\n",tokenString);
break;
case NUM:
printf("NUM,value=%s\n",tokenString);
break;
case ERROR:
printf("ERROR:%s\n",tokenString);
break;
case ENDFILE:
printf("EOF\n");break;
default:
for(i=0;i{
if(token==reserved_words[i].tok)
{
if(i<6)
{
fprintf(stdout,"reserved word:%s\n",tokenString);
break;
}
else
{
printf("%s\n",reserved_words[i].str);
break;
}
}
}
break;
}
}
token_type GetToken(void)
{
int str_index = 0;
token_type cur_token;
state_type state = START;
int save;
while(state != DONE)
{
char c = GetChar();
save = 1;
switch (state)
{
case START:
if((c ==' ')||(c =='\t')||(c =='\n'))
{
save = 0;
state = START;
}
else if (isdigit(c))
state = INNUM;
else if(isalpha(c))
state = INID;
else if ((c == '') || (c == '=') || (c == '!'))
state = IN1;
else if(c=='/')
state = IN2;
else
{
state=DONE;
switch(c){
case EOF:
save = 0;
cur_token=ENDFILE;
break;
case '+':
cur_token = PLUS;
break;
case '-':
cur_token = MINUS;
break;
case '*':
cur_token = TIMES;
break;
case '(':
cur_token = LKUO;
break;
case ')':
cur_token = RKUO;
break;
case '[':
cur_token = LINDEX;
break;
case ']':
cur_token = RINDEX;
break;
case '{':
cur_token = LDA;
break;
case '}':
cur_token = RDA;
break;
case ';':
cur_token = SMIT;
break;
case ',':
cur_token = COMMA;
break;
default:
cur_token = ERROR;
break;
}
}
break;
case INNUM:
if(!isdigit(c))
{
save=0;
state = DONE;
UngetChar();
cur_token = NUM;
}
break;
case INID:
if(!isalpha(c))
{
save=0;
state = DONE;
UngetChar();
cur_token = ID;
}
break;
case IN1:
state = DONE;
//UngetChar();
char pre_char = token_str[str_index-1];
if(c=='=')
{
if(pre_char == ' cur_token = LTEQ;
else if(pre_char =='>')
cur_token=GTEQ;
else if(pre_char =='=')
cur_token = EQ;
else
cur_token = NEQ;
}
else
if(pre_char == ' cur_token = LT;
else if(pre_char =='>')
cur_token=GT;
else if(pre_char =='=')
cur_token = ASSIGN;
else
cur_token = ERROR;
break;
case IN2:
if(c=='*')
{
state = INCOMMENT;
}
else
state = DONE;
break;
case INCOMMENT:
if(c=='*')
{
state = IN3;
}
else
state = INCOMMENT;
break;
case IN3:
if (c=='*')
{
state = IN3;
}
else if(c=='/')
{
state = DONE;
}
else
state = INCOMMENT;
break;
case DONE:
default:
state = DONE;
cur_token = ERROR;
break;
}
if((save)&&str_index{
token_str[str_index++]=c;
}
if(state==DONE)
{
token_str[str_index]='\0';
if(cur_token==ID)
{
cur_token=reserved_lookup(token_str);
}
printf("\t%d:",lineno);
PrintToken(cur_token,token_str);
str_index = 0;
}
}
return cur_token;
}
main.c
#include "minus.h"
int lineno = 0;
FILE *source;
int main(int argc, char const *argv[])
{
char filename[20];
fprintf(stdout,"输入文件\n");
scanf("%s",filename);
InitScan(filename);
while(GetToken() != ENDFILE);
fclose(source);
fprintf(stdout,"结束\n");
system("PAUSE");
return 0;
}