用c语言写编译原理的getchar,编译原理简单的C MINUS 词法分析器

{

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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值