Professional Documents
Culture Documents
Yêu Cầu Trình Bày Nhóm 3
Yêu Cầu Trình Bày Nhóm 3
1. Hàm getToken():
1.1 Tham số đầu vào: void
1.2 Kết quả đầu ra: trả về object kiểu Token
1.3 Luồng hoạt động chính:
Kiểm tra kiểu của currentChar (kí tự hiện hành) trong mảng charCodes
// checking the code of that currentChar to see what type it is
switch (charCodes[currentChar]) {
Nếu kí tự đầu tiên là dấu cách ‘ ’, thì tiếp túc skip các dấu cách ở sau nó cho đến
khi gặp kí tự kết thúc hoặc là một kí tự không phải là dấu cách. Sau khi skip hết các
dấu cách thì thực hiện lại hàm getToken() để tiếp tục đọc các kí tự tiếp theo
// if current char is space -> skip blank line until currentChar is EOF or cur
rentChar is not SPACE
// then call getToken() again means go back to state 0 to read the next char
acter
case CHAR_SPACE: skipBlank(); return getToken();
Nếu gặp kí tự là một chữ thì gọi hàm readIdentKeyword() có chức năng:
- Đọc các kí tự tiếp theo sau nó và hợp lại thành xâu và check xem xâu đó
có phải là một từ khoá hay không (KW_PROGRAM, KW_FUNCTION,
…), nếu có thì dạng từ tố (tokenType) là một từ khoá, còn không phải thì
dạng từ tố là một TK_IDENT
// if it is a letter
// read if it's a ident or a kpl language's key word (KW_PROGRAM, KW_FUNCTIO
N, KW_BEGIN, KW_END)
// saved infomation into a created new token and return that token
case CHAR_LETTER: return readIdentKeyword();
Nếu gặp một kí tự là ‘<’ thì đọc kí tự tiếp theo, và nếu kí tự tiếp theo là ‘=’ thì sẽ
trả về dạng token là SB_LE (less then or equal) còn nếu kí tự tiếp theo không phải
là dấu ‘=’ thì chỉ trả về dạng token SB_LT (less then)
// '<'
case CHAR_LT:
ln = lineNo;
cn = colNo;
readChar(); // read the next char
if ((currentChar != EOF) && (charCodes[currentChar] == CHAR_EQ)) {
// if it is '<=' , read the next char
readChar();
return makeToken(SB_LE, ln, cn); // return the '<=' token
} else return makeToken(SB_LT, ln, cn); // return the '<' token
2. Hàm checkKeyWord():
#define ERM_ENDOFCOMMENT "End of comment expected!"
#define ERM_IDENTTOOLONG "Identification too long!"
#define ERM_INVALIDCHARCONSTANT "Invalid const char!"
#define ERM_INVALIDSYMBOL "Invalid symbol!"
4.2. Việc phân biệt chữ hoa và chữ thường trong từ khóa và định danh
Từ khoá không phần biệt chữ hoa chữ thường:
Lý do vì trong hàm keywordEq() khi so sánh từng kí tự đều in hoa kí tự đầu vào,
nên INTeGER vẫn là INTEGER.
Việc phân biệt chữ hoa chữ thường ở định danh : (có)