第一篇:《編譯原理》課程設計說明-第1次
《編譯原理》課程設計
《編譯原理》課程設計
1.要求
完成一個簡化C語言——TINY C語言的編譯程序,最終能為用TINY C語言編寫的源程序(后綴為.tny,已給sample.tny,用一般的文本編輯程序即可打開)生成目標代碼,并在給定的虛擬機TM上運行得到運行結果。
TINY C語言中允許出現的字詞: ? 整數、標識符;
? 算術運算符/關系運算符/賦值運算符/界符:+、-、*、/、=、<、:=、;、{、}、(、)? 其它保留字:IF THEN ELSE END REPEAT UNTIL READ WRITE TINY C語言中允許出現的語法單位
? 表達式:簡單整型算術表達式、關系表達式 ? 語句:
? 條件語句(IF THEN ELSE END)? 循環語句(REPEAT UNTIL)? 賦值語句(:=)? 讀寫語句(READ WRITE)? { }中可以有注釋,但不能嵌套
2.步驟
1)、詞法分析
2)、語法分析
3)、語義分析
4)、生成目標代碼
3.源碼構成
? MAIN.C 主程序
? GLOBALS.H 全局類型及變量(如Token類屬及語法樹結點的組成)? UTIL.H、UTIL.C 各步驟的實用函數。如輸出Token,生成語法樹結點等 ? SCAN.C、SCAN.H 詞法分析程序及其頭文件 ? PARSE.C、PARSE.H 語法分析程序及其頭文件 ? ANALYZE.C、ANALYZE.H 語義檢查程序及其頭文件 ? SYMTAB.C、SYMTAB.H 符號表生成程序及其頭文件
? CGEN.H、CGEN.C、CODE.C、CODE.H 目標代碼生成程序及其頭文件
《編譯原理》課程設計
? TM 編譯sample.tny源程序后得到目標代碼,在該虛擬機上運行得到結果
步驟1——詞法分析
要求:填寫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)
//獲得下一字符 {實現請自己看scan.c文件} static void ungetNextChar(void)
//用于回吐字符 {實現請自己看scan.c文件}
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 …… //此處請自己填寫(字符、:、空格/tab/換行、{、算符及界符等)
break;
case INCOMMENT:
…//此處請自己填寫,僅出現‘}’或EOF(注釋未完結束程序)時才改變狀態。
break;
case INASSIGN: …… //此處請自己填寫,‘=’或其它(出現錯誤)
《編譯原理》課程設計
break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
…… //此處請自己填寫,不是字符則回吐,并進入DONE,且識別出一個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)
{ tokenString[tokenStringIndex] = ' 主站蜘蛛池模板: 亚洲国产精品无码中文字2022| 亚洲精品久久久久久久蜜桃臀| 人禽伦免费交视频播放| 黑人强辱丰满的人妻熟女| 青楼妓女禁脔道具调教sm| 久久人妻无码一区二区三区av| 蜜桃一区二区三区| 丝袜美腿精品国产一区| 精品成人一区二区三区四区| 国产精品无码久久久久久| 国产在热线精品视频| 亚洲最大的熟女水蜜桃av网站| 中文字幕丰满乱子伦无码专区| 又大又粗又爽的少妇免费视频| 亚洲精品国产品国语原创| 精品欧美一区二区三区久久久| 亚洲欧美日韩国产综合在线一区| 大地资源中文在线观看官网第二页| 国产欧美日韩综合精品二区| 激烈的性高湖波多野结衣| 国产无套露脸在线观看| 国产精品美女被遭强扒开双腿| 国产成人精品永久免费视频| 亚洲精品久久一区二区三区四区| 真实的国产乱xxxx在线| 无码av一区二区三区无码| 无码欧精品亚洲日韩一区| 一卡二卡三卡视频| 亚洲av无码国产在丝袜线观看| 欧美性黑人极品hd| 亚洲图片校园另激情类小说| 小12萝8禁在线喷水观看| 亚洲乱码尤物193yw最新网站| 天堂网www在线资源网| 18禁高潮出水呻吟娇喘蜜芽| 国产成人精品亚洲日本在线| 人妻18毛片a级毛片免费看| 亚洲乱人伦中文字幕无码| 色狠狠成人综合网| 日韩精品亚洲一区在线综合| 国产欧美日韩久久久久|