第一篇: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 <= MAXTOKENLEN))
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
Tiny C語言編譯程序實驗一 Scanner
{ tokenString[tokenStringIndex] = ' 主站蜘蛛池模板: 人人玩人人添人人澡| 国产色欲av一区二区三区| 国产又色又爽又黄刺激的视频| 狠狠色噜噜狠狠狠狠色综合久| 国产精品自在拍首页视频| 国产精品久久久久久麻豆一区| 久久天天躁狠狠躁夜夜躁2o2o| 国产成人精品午夜视频| 日韩无码专区| 精品无人区麻豆乱码1区2区| 亚 洲 视 频 高 清 无 码| 无码中文字幕av免费放dvd| 国产伦精品一区二区三区免费| 麻豆一精品传媒卡一卡二传媒短视频| 伦理片午夜视频在线观看| 亚洲成av人片在线观看wv| 亚洲a片国产av一区无码| 波多野结衣免费一区视频| 日韩欧美一区二区三区免费观看| 97se色综合一区二区二区| 亚洲国产精品综合久久20| 无码免费午夜福利片在线| 无码乱码av天堂一区二区| 欧美大屁股bbbbxxxx| 久久精品无码一区二区无码| 无码国产69精品久久久久孕妇| 国产黑色丝袜在线观看下| 9l国产精品久久久久尤物| 国产女人喷浆抽搐高潮视频| 超级大爆乳奶牛被调教出奶水| 人人妻人人做人人爽夜欢视频| 天天摸夜夜添狠狠添婷婷| 国产一极内射視颍一| 思思久久精品一本到99热| 极品熟妇大蝴蝶20p| 国产大片黄在线观看私人影院| 免费精品99久久国产综合精品| 日本久久精品一区二区三区| 国产又爽又猛又粗的视频a片| 成人午夜国产内射主播| 亚洲 欧美 综合 在线 精品|