Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Yêu cầu trình bày nhóm 3:

1/ chạy chương tình với ví dụ 2:

2/ Trình vày hoạt động của các hàm sau:


Flow chương trình:
Từ hàm main trong SCANNER.C
Main() -> scan() -> openInputStream() -> readChar() : đọc từng kí tự trong
file văn bản

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():

Đầu vào: một xâu


Đầu ra: Trả về dạng tự tố (TokenType)
Luồng hoạt động:
Đi qua tất cả các phần tử trong mảng keywords, check xem xâu đầu vào có
bằng với một trong các phẩn tử keywords[i] không, nếu có thì xâu đó là một từ
khoá của ngôn ngữ, trả về tokenType của keyword đó, vd đầu vào là “program” thì
trả về tokenType = KW_PROGRAM. Còn nếu không trùng với phần tử nào thì trả
về TK_NONE.

3. Các lỗi về từ vựng:


typedef enum {
  ERR_ENDOFCOMMENT,
  ERR_IDENTTOOLONG,
  ERR_INVALIDCHARCONSTANT,
  ERR_INVALIDSYMBOL
} ErrorCode;

#define ERM_ENDOFCOMMENT "End of comment expected!"
#define ERM_IDENTTOOLONG "Identification too long!"
#define ERM_INVALIDCHARCONSTANT "Invalid const char!"
#define ERM_INVALIDSYMBOL "Invalid symbol!"

Lỗi 1 “End of comment expected!”:


Sửa file example1.kpl, bỏ dấu comment ở dòng cuối.

Lỗi 2 “Indentification too long!”:


Sửa file example1.kpl như sau sẽ hiện lỗi khi chạy chương trình.
Lỗi 3 “Invalid const char”:
Vào file example3.kpl và sửa ở dòng 27 như sau
Lỗi 4 “Invalid symbol”:
Th1:
Vào file example3.kpl và sửa ở dòng thứ 8 thêm một dấu ‘$’ và chạy chương trình.
Th2:
Vào file example3.kpl , sửa ở dòng 10 như hình và chạy chương trình
4.Trả lời câu hỏi:
4.1. Việc mã hóa các ký tự: dấu trắng, chữ cái, chữ số, các ký tự được phép
xuất hiện trong chương trình (chưa rõ yêu cầu).

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ó)

4.3. Kiểm soát độ dài các số


Sửa các hàm như sau:
File scanner.c
File error.h
File error.c

Tiến hành build lại code và chạy lại chương trình.


4.4. Có cần dừng chương trình khi gặp lỗi từ vựng không?
Có thể không cần nếu xoá lệnh exit(-1)

You might also like