Tiny C 语言编译程序实验一 Scanner由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“程序设计语言与编译”。
Tiny C语言编译程序实验一 Scanner Tiny C语言编译程序实验一 Scanner 要求:填写getToken()函数,完成词法分析器scan.c。
约定:
仅允许整数类型,不允许实数类型
标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则 整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始 由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉
识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’
typedef enum
{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE, /* 保留字 */
ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=
=
+
*
/
()
;
} TokenType;
画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器
/****************************************************/ /* File: scan.c
*/ /* The scanner implementation for the TINY compiler
*/ /****************************************************/ #include “globals.h”
#include “util.h”
#include “scan.h”
typedef enum
{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;char tokenString[MAXTOKENLEN+1];static int getNextChar(void)
//获得下一字符
Tiny C语言编译程序实验一 Scanner
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};
//定义保留字表
static TokenType reservedLookup(char * s)
//进行保留字的匹配 {实现请自己看scan.c文件}
/**********************************************/ /* the primary function of the scanner
*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;
TokenType currentToken;
//保存被识别Token的类属
StateType state = START;
//初始状态为START
int save;
//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符
while(state!= DONE)
//DONE状态表示已识别出一个Token
{ int c = getNextChar();
save = TRUE;
switch(state)
{ case START:
if(isdigit(c))
state = INNUM;
else if(isletter(c))
{ state=DONE;currentToken=END;state=INID;state=INASSIGN;state=INCOMMENT;else if(c==':')else if(c=='{')else
}
break;
case INCOMMENT:
if(c=='}')
Tiny C语言编译程序实验一 Scanner
{ state=DONE;currentToken=END;}
break;case INASSIGN: if(c=='=')
{
} else { error();currentToken=ERROR };/* 此处已填写完整 */ state=DONE;currentToken=ASSIGN;break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
if(!isletter(c)){ /* backup in the input */ ungetNextChar();save = FALSE;state = DONE;currentToken =ID;
break;
case DONE: //不可能到
default: /* should never happen */
fprintf(listing,“Scanner Bug: state= %dn”,state);
state = DONE;
currentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
Tiny C语言编译程序实验一 Scanner
{ tokenString[tokenStringIndex] = ' ';
if(currentToken == ID)
currentToken = reservedLookup(tokenString);
}
}
---------end WHILE
if(TraceScan){
fprintf(listing,“t%d: ”,lineno);
printToken(currentToken,tokenString);
}
return currentToken;} /* end getToken */