Để xõy dựng chương trỡnh bằng phương phỏp này, điều cơ bản nhất là chỳng ta phải xõy dựng bảng chuyển trạng thỏi. Để tổng quỏt, thụng tin của bảng chuyển trạng thỏi nờn được lưu ở một file dữ liệu bờn ngoài, như vậy sẽ thuận tiện cho việc chỳng ta thay đổi dữ liệu chuyển trạng thỏi của ụtụmỏt mà khụng cần quan tõm đến chương trỡnh.
Đối với cỏc trạng thỏi khụng phải là trạng thỏi kết thỳc thỡ chỳng ta chỉ cần tra bảng một cỏch tổng quỏt sẽ biết được trạng thỏi tiếp theo, và do đú chỳng ta chỉ cần thực hiện cỏc trường hợp cụ thể đối với cỏc trạng thỏi kết thỳc để biết từ tố cần trả về là gỡ.
Giả sử ta cú hàm khởi tạo bảng trạng thỏi là: int InitStateTable(); Hàm phõn loại ký hiệu đầu vào (ký hiệu kết thỳc): int GetCharType(); Khi đú đoạn chương trỡnh sẽ được mụ tả như dưới đõy:
#define TERMINAL _NUM 100
#define STATE_ERROR –1 // trạng thỏi lỗi int table[STATE_NUM][TERMINAL_NUM] // ban đầu gọi hàm khởi tạo bảng chuyển trạng thỏi. InitStateTable();
int GetNextChar(); // hàm lấy ký tự tiếp theo
enum Token {IDENT, INTEGER, REAL, LT, LE, GT, GE, NE, EQ, ERROR}; // hàm này trả về loại từ tố // từ vị nằm trong s Token GetNextToken(char *s) { int state=0; int i=0; while(1) { int c=GetNextChar(); int type=GetCharType(c); switch(state) {
case 2: s[i]=0; GetBackChar(); return IDENT;
case 4: s[i]=0; GetBackChar(); return INTEGER;
case 6: s[i]=0; GetBackChar();
return REAL;
case 8: s[i]=0;
return LE;
case 9: s[i]=0;
return NE;
case 10: s[i]=0; GetBackChar(); return LE; case 11: s[i]=0; return EQ; case 13: s[i]=0; return GE; case 14: s[i]=0; return GT;
case STATE_ERROR: return ERROR; defaulf: state=table[state][type]; s[i++]=c; } if(c==0) break; }// end while }// end function
Nhận xột: Ưu điểm:
+ Thớch hợp với bộ phõn tớch từ vựng cú nhiều trạng thỏi, khi đú chương trỡnh sẽ gọn hơn.
+ Khi cần cập nhật từ tố mới hoặc sửa đổi mẫu từ tố thỡ chỳng ta chỉ cần thay đổi trờn dữ liệu bờn ngoài cho bảng chuyển trạng thỏi mà khụng cần phải sửa chương trỡnh nguồn hoặc cú sửa thỡ sẽ rất ớt đối với cỏc trạng thỏi kết thỳc.
Nhược điờ̉m: khó khăn cho việc lập bảng, kích thước bảng nhiờ̀u khi là quá lớn, và khụng trực quan.