1. Trang chủ
  2. » Giáo Dục - Đào Tạo

NHẬP MÔN CHƯƠNG TRÌNH DỊCH

304 343 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 304
Dung lượng 2,01 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các chương trình dịch, Chương trình dịch là gì,Tại sao phải biết chúng,Các bộ phận,của một chương trình dịch,Phân tích từ vựng,Từ luồng văn bản đến luồng từ tố

Trang 2

Nhập môn Chương trình dịch

Bài 1: Tổng quan

Trang 3

Giới thiệu về “Phân tích từ vựng”

– Từ luồng văn bản đến luồng từ tố (tokens)

Trang 4

Aho, Sethi, Ullman, “Compilers –

Principles, Techniques and Tools”

Trang 5

Mục tiêu

 Ứng dụng thực tế của lý thuyết ngôn ngữ

 rất đẹp nhưng rất khó 

 Phân tích văn bản (parsing)

 Nâng cao hiểu biết về mã nguồn

 Sử dụng các cấu trúc dữ liệu phức tạp

 rất tốn nơron thần kinh 

 Hiểu cách cài đặt các ngôn ngữ bậc cao và cách chuyển đổi chúng về ngôn ngữ máy

 Hiểu ngữ nghĩa của các ngôn ngữ lập trình

 Lập trình giỏi hơn (đặc biệt là trong nhóm)

Trang 8

Mã máy

 Được tối ưu cho phần cứng

– Giảm tối đa số câu lệnh thừa

– Mã Assembly ≈ mã máy

addq $3,1,$4 mull $2,$4,$2 ldl $3,16($15) addq $3,1,$4 mull $2,$4,$2 stl $2,20($15) ldl $0,20($15)

br $31,$33

$33:

bis $15,$15,$30 ldq $26,0($30) ldq $15,8($30) addq $30,32,$30 ret $31,($26),1

lda $30,-32($30) stq $26,0($30) stq $15,8($30) bis $30,$30,$15 bis $16,$16,$1 stl $1,16($15) lds $f1,16($15) sts $f1,24($15) ldl $5,24($15) bis $5,$5,$2 s4addq $2,0,$3 ldl $4,16($15) mull $4,$3,$2 ldl $3,16($15)

Trang 9

Dịch như thế nào ?

 Mã nguồn và mã máy không giống nhau

 Độ phức tạp của các ngôn ngữ bậc cao cũng

khác nhau

 Mục tiêu của các chương trình dịch:

– Cho phép lập trình viên sử dụng ngôn ngữ nguồn để lập trình

– Chương trình dịch chuyển sang mã máy với hiệu quả cao nhất có thể

– Tốc độ dịch cao (< O(n3))

– Có thể thay đổi dễ dàng chương trình dịch khi cần

thay đổi ngôn ngữ (thêm từ vựng, cú pháp, khái niệm mới, hoặc chuyển sang ngôn ngữ mới)

Trang 10

Ví dụ

Mã máy sau khi tối ưu

s4addq $16,0,$0 mull $16,$0,$0 addq $16,1,$16 mull $0,$16,$0 mull $0,$16,$0 ret $31,($26),1

Mã máy chưa tối ưu

Trang 12

Dịch như thế nào để hiệu quả?

Mã nguồn ở ngôn ngữ bậc cao

?

Mã máy

Chương trình dịch

Errors

Trang 13

Ý tưởng: dịch từng bước

Chương trình nguồn sẽ chuyển qua mộtchuỗi các dạng thể hiện khác nhau

Mỗi dạng thể hiện được tối ưu để thực

hiện các thao tác khác nhau trong quá

trình dịch (ví dụ: kiểm tra kiểu, tối ưu mã)

Càng về cuối, các dạng thể hiện càng gầnvới mã máy hơn

Trang 14

Cấu trúc của chương trình dịch

Dãy các từ tố (token)

Cây cú pháp

Mã trung gian

Phần đầu (không phụ thuộc

máy)

Phần sau (phụ thuộc máy)

Trang 15

Dãy các từ tố (token)

Cây cú pháp

Mã trung gian

Phân tích từ vựng

Trang 16

; a

= n

i m )

b

<

a ( f

I

EOF

; b

= n

i

m

; Id:a

= Id:min )

Id:b

<

Id:a (

If

; Id:b

= Id:min Else

Trang 17

Dãy từ tố

Một dạng thể hiện của chương trình

nguồn

Mô tả từ tố: <loại từ tố> và <thuộc tính>

Ví dụ: <Id, “a”> <Id, “min”> <If,> <Int, 10>

<Float, 1.5> <[,> <),>

Khi cần gỡ lỗi, thông báo lỗi, mô tả từ tố

sẽ bao gồm cả vị trí của từ tố: file, số dòng

Ví dụ: <Id, “min”, “min.cpp”, 15>

Trang 19

Nhập môn Chương trình dịch

Bài 2: Phân tích từ vựng

Trang 20

Nội dung chính

 Mô tả các bước chính của chương trình dịch

 Phân tích từ vựng là gì?

 Viết một chương trình phân tích từ vựng

 Mô tả từ tố - biểu thức chính quy (REs)

 Viết một chương trình sinh ra chương trình phân tích từ vựng

 Chuyển đổi REs – NFAs

 Chuyển đổi NFAs – DFAs

 Bài tập về nhà 1

Trang 21

= Id:min )

0

==

Id:a (

Trang 22

= Id:min )

0

==

Id:a (

If

(lexical analysis)

Trang 23

Từ tố (token)

Tên: x, y11, elsex, _i00

Từ khóa: if, else, while, break

Số nguyên: 2, 1000, -500, 5L

Số thực: 2.0, 0.00020, 02, 1.1e5, 0.e-10

Kí hiệu: +, *, {, }, ++, <, <<, [, ], >=

Xâu kí tự: “x”, “He said, \“Are you?\””

Ghi chú: /** don’t change this **/

Trang 24

Phân tích từ vựng kiểu AD-HOC

Trang 25

Nhìn trước 1 kí tự

Duyệt chương trình nguồn từng kí tự một

– Sử dụng kí tự nhìn trước để quyết định loại từ

s l e

^

next

Trang 27

Các vấn đề của phương pháp

AD-HOC

 Trong một số trường hợp, không thể biết loại từ

tố qua kí tự đọc vào đầu tiên

– Nếu kí tự đầu tiên là “i”, đó có thể là tên hoặc từ khóa

 Vì vậy, cần một cách tiếp cận mới, có nguyên

tắc hơn: các chương trình sinh ra các chương trình phân tích từ vựng một cách tự động (ví dụ: lex, JLex)

Trang 28

if (x == 0) a = x<<1;

iff (x == 0) a = x<1;

 Phương pháp này phải hiệu quả

– Phân biệt các từ tố có chung đoạn kí tự đầu

– Chỉ cần nhìn trước 1 kí tự

Trang 30

Quy ước của REs

L(a) = {a} – tập hợp gồm xâu “a”

L(ε) = {ε} – tập hợp gồm xâu rỗng

L(R|S) = L(R)  L(S) – hợp của L(R) và L(S) L(RS) = {xy | x  L(R), y  L(S)} – nối 2 xâu

bất kì của L(R) và L(S) L(R*) = L(ε|R|RR|RRR|RRRR …) – nối các xâu của L(R) lại với nhau

Trang 31

Một số quy ước khác

L(R+) = L(R*) \ {ε} – R* loại bỏ xâu rỗng L(R?) = L(R|ε)

L([abcd]) = L(a|b|c|d) L([a-z]) = L(a|b| |z) L([^abc]) = kí tự bất kì không thuộc L([abc]) L([^a-z]) = kí tự bất kì không thuộc L([a-z])

Trang 33

[0-id = [a-zA-Z_][a-zA-Z0-9_]*

Xâu thuộc ngôn ngữ Biểu thức chính quy (RE)

Trang 34

Tách từ tố từ chuỗi kí tự

elsex = 0; 1 else x = 0 ;

2 elsex = 0 ;

 REs là chưa đủ để chỉ ra cách tách các từ tố

 Đa số các ngôn ngữ sử dụng luật “dài nhất

thắng”: RE cho xâu dài nhất có thể được sẽ

được chọn

 Khi RE cho các xâu dài bằng nhau, từ tố được

ưu tiên hơn sẽ được chọn

 Đặc tả chương trình PTTV = REs + luật “dài nhất thắng” + mức độ ưu tiên

Trang 35

Đặc tả chương trình PTTV

 Là đầu vào cho các chương trình sinh ra

chương trình phân tích từ vựng

– Danh sách REs theo thứ tự ưu tiên

– Hành động gắn liền với mỗi RE khi chương trình

PTTV nhận dạng được một từ tố bằng RE đó

 Đầu ra của các chương trình này là một chương

trình PTTV có thể

– Đọc chương trình nguồn và tách nó ra thành các từ tố bằng cách nhận dạng REs

– Thông báo lỗi nếu gặp phải kí tự không đúng theo

REs

Trang 36

“if” { return new IfToken(); }

“while” { return new WhileToken(); }

{identifier} { return new IdentifierToken(yytext()); }

Trang 37

Tổng kết

 Chương trình PTTV chuyển chương trình nguồn thành dãy các từ tố (token)

 PTTV kiểu AD-HOC khó viết đúng, khó bảo trì

 Có thể mô tả chính xác các từ tố trong các ngôn ngữ lập trình bằng biểu thức chính quy (RE)

 Đầu vào của chương trình sinh ra chương trình PTTV là đặc tả của chương trình PTTV: REs, mức độ ưu tiên và các hành động tương ứng

 Bài tới: hoạt động của các chương trình sinh ra chương trình PTTV

Trang 38

Nhập môn Chương trình dịch

Bài 3: Tự động sinh bộ PTTV

Trang 39

Nội dung chính

Mở rộng cú pháp biểu thức chính quy - RE

Vòng lặp chính

Ôtômát hữu hạn đơn định - DFAs

Ôtômát hữu hạn không đơn định - NFAs

Chuyển đổi RE-NFA

Chuyển đổi NFA-DFA

Trang 40

Mở rộng cú pháp của RE

 R1 và R2 là các RE, các biểu thức sau là RE

– R1|R2 L(R1|R2) = L(R1)  L(R2)

– R1R2 Nối 2 xâu thuộc L(R1) và L(R2)

– R1* Nối 0 hoặc nhiều xâu thuộc L(R1)

– R1? Xâu rỗng hoặc xâu thuộc L(R1)

– R1 Nối 1 hoặc nhiều xâu thuộc L(R1)

– (R1)

– [a-e] L([a-e]) = L(a|b| |e)

– [^…] Kí tự bất kì ngoài các kí tự trong ngoặc

Trang 41

Chương trình sinh ra bộ PTTV

 Đọc danh sách theo thứ tự ưu tiên các RE: R1,…R n, mỗi biểu thức mô tả một loại từ tố cùng với các hành động tương ứng

 Ví dụ

-?[1-9][0-9]* { return new Token(Tokens.IntConst, Integer.parseInt(yytext()) }

 Sinh ra mã lệnh của chương trình PTTV có thể

1 Kiểm tra tính đúng đắn về từ vựng của chương trình nguồn

2 Sinh ra một dãy các từ tố tương ứng

 Quan sát: Bài toán 1 tương đương với việc kiểm tra xem chương trình nguồn có thuộc ngôn ngữ của biểu thức chính quy sau

(R1|…|R n)*

 Bài toán 1: Tìm cách kiểm tra một xâu có thuộc L(R) với

R là biểu thức chính quy bất kì

Trang 42

Nhận dạng biểu thức chính quy

 Ôtômát nhận dạng RE

– Bắt đầu ở một trạng thái khởi tạo

– Lần lượt xét các kí tự của xâu

– Thay đổi trạng thái tùy theo kí tự đọc vào

– Khi đọc hết xâu, nếu đạt được trạng thái kết thúc thì xâu vào được nhận dạng theo biểu thức chính quy đó

 Với PTTV, ta chỉ cần một số hữu hạn trạng thái: ôtômát hữu hạn (đơn định hoặc không đơn định)

– NFA & DFA

– Trạng thái = một số nguyên

Trang 43

Ôtômát hữu hạn (FA)

 Biểu diễn ôtômát hữu

2

1 2

1

Error 1

Trang 46

Ôtômát hữu hạn không đơn định

(NFA)

 NFA bao gồm

– Tập trạng thái, trạng thái bắt đầu, tập trạng thái kết thúc

– Phép chuyển trạng thái bằng kí tự vào

– Kí tự rỗng -  (chuyển trạng thái không cần đọc kí tự của xâu vào)

– Từ một trạng thái có thể chuyển đến nhiều trạng thái khác bằng cùng một kí tự vào

Trang 49

RE  NFA

Nhận xét:

NFA chỉ cần một trạng thái kết thúc ?

Trang 50

RE  NFA (phương pháp quy nạp)

Trang 51

RE  NFA (phương pháp quy nạp)

Trang 52

Cài đặt NFA

 Kiểm tra 1 xâu có thuộc ngôn ngữ của NFA

– Kiểm tra xem có tồn tại 1 đường đi từ trại thái bắt đầu đến trạng thái kết thúc sử dụng các kí tự của xâu vào – Mỗi trạng thái có nhiều lựa chọn

 Tìm kiếm đồng thời nhiều đường đi

– Lưu giữ tập trạng thái có thể đạt tới ứng với một đoạn đầu của xâu vào

– Giống như ta chỉ vào nhiều trạng thái trên đồ thị cùng một lúc

?

Trang 54

Chuyển đổi NFA - DFA

Có thể chuyển NFA thành DFA bằng

Trang 55

Tối ưu hóa DFA

Chuyển đổi NFA sang DFA có thể tạo

thành các DFA có số lượng trạng thái rất lớn (≈ O(2n))

Các chương trình sinh ra bộ PTTV thường

có bước tối ưu hóa DFA tới kích thước

nhỏ nhất có thể được (xem tài liệu tham

khảo số 3 – Aho, Sethi, Ullman)

Trang 56

Xử lý nhiều REs cùng lúc

 Cài đặt luật “dài nhất thắng” bằng DFA: khi có lỗi, nếu đang ở trạng thái kết thúc thì trả về từ tố tương ứng với trạng thái kết thúc đó

Từ khóa Khoảng trống

Tên

Số

NFA DFA Đánh dấu bằng từ tố có ưu tiên cao nhất

Trang 57

 Chuyển đổi NFA-DFA giải quyết hiệu quả vấn đề các từ

tố có chung tiếp đầu ngữ (prefix)

– Mã lệnh dễ thay đổi và bảo trì khi từ vựng thay đổi

– Thường hiệu quả hơn là viết bằng tay

 Các chương trình sinh bộ PTTV đã có sẵn và miễn phí

Trang 58

Bài tập

Bài 1: Xây dựng NFA đoán nhận ngôn

ngữ được tạo bởi biểu thức chính quy

if|[a-zA-Z_][a-zA-Z_0-9]* Biến đổi NFA

Trang 59

Nhập môn Chương trình dịch

Bài 4: Phân tích cú pháp

(syntactic analysis)

Trang 61

= Id:min )

0

==

Id:a (

If

Trang 62

block if_stmt while_stmt bin_op

call

• stdio print

variable a

… …

Trang 63

Phân tích cú pháp

Kiểm tra tính đúng đắn về cú pháp của

chương trình nguồn

Xác định chức năng của các thành phần

trong chương trình nguồn

I gave him the book

câu

chủ ngữ vị ngữ bổ ngữ trực tiếp bổ ngữ gián tiếp

cụm danh từ quán từ danh từ

Trang 66

Đặc tả cú pháp của ngôn ngữ

Vấn đề: Làm thế nào để mô tả chính xác

và dễ dàng cú pháp của ngôn ngữ tạo nên

mã nguồn?

Giống như từ tố được mô tả bằng REs

REs dễ cài đặt (bằng NFA hoặc DFA)

Có thể dùng REs để mô tả cú pháp của

ngôn ngữ lập trình được không?

Trang 67

Giới hạn của REs

Cú pháp của ngôn ngữ lập trình không

thuộc lớp ngôn ngữ chính quy  khôngthể mô tả bằng REs được

Ví dụ: L  { (, ) }* sao cho L là tập các

cách viết () đúng

Nếu dùng RE để biểu diễn L  phải đếm

số lượng dấu “(“ chưa có dấu “)” tươngứng  số đếm không bị giới hạn

Trang 68

Cần cách mô tả mạnh hơn

Ta biết: RE  DFA

Số đếm không giới hạn  số trạng tháikhông giới hạn  mâu thuẫn với cấu trúccủa DFA (hữu hạn)

) )

) )

)

< 6: OK >=6

Trang 69

Một xâu nằm trong ngôn ngữ của CFG

nếu có một dãy suy dẫn sử dụng các sản

xuất của CFG tạo nên xâu đó

Trang 70

– Vế trái: kí hiệu không kết thúc

– Vế phải: xâu gồm kí hiệu kết thúc và không kết thúc

 Có thể gộp nhiều sản xuất có chung vế trái

S  (S)S | 

Trang 71

REs là tập con của CFG

REs không có đệ quy

digit = [0-9]

posint = digit+

real = int ( ε | ( posint))

Vế trái của REs có thể phát triển đến các

kí hiệu vào

real = -?[0-9]+( ε | ( [0-9]+))

Trang 73

kí hiệu không kết thúc – vế trái

vế phải của sản xuất

Trang 75

tạo thành xâu vào

– Nút trong của cây là các

3

E 5

Trang 76

Cây cú pháp

Giản lược các thông

tin thừa khỏi cây suy

dẫn

S

E 4

3

E 5 +

5 +

+ 1

+ 2

4 3

Trang 77

Dẫn xuất (2)

Thứ tự dẫn xuất tùy ý, có thể chọn bất cứmột kí hiệu không kết thúc nào để áp dụngsản xuất

Hai thứ tự dẫn xuất thường dùng:

– Suy dẫn trái: chọn kí hiệu bên trái nhất

– Suy dẫn phải: chọn kí hiệu bên phải nhất

Được sử dụng trong nhiều kiểu phân tích

cú pháp tự động (automatic parsing)

Trang 78

S  E+S  E+E  E+5  (S)+5  (E+S)+5

 (E+E+S)+5  (E+E+E)+5  (E+E+(S))+5

Trang 79

Văn phạm nhập nhằng (1)

 Ở ví dụ trước, cả hai cây suy

dẫn trái và phải đều giống nhau

 Lý do: phép cộng (+) có xu

hương kết hợp về bên phải bất

kể thứ tự dẫn xuất như thế nào

+ 1

+ 2

4 3

(1 + 2 + (3 + 4)) + 5

Trang 81

+

Trang 83

Loại bỏ nhập nhằng

 Có thể loại bỏ nhập nhằng bằng

– Thêm vào một số kí hiệu không kết thúc

– Chỉ cho phép sử dụng đệ quy trái hoặc

phải

S  S + T | T

T  T * num | num

 T: kí hiệu không kết thúc cho phép chỉ

ra thứ tự ưu tiên của các phép toán

 Đệ quy trái: các phép toán có xu

hướng kết hợp bên trái

S

S + T

T T * 3

1 2

Trang 84

Giới hạn của CFG

 Vẫn chưa thể bắt hết các lỗi cú pháp

 Ví dụ: C++

HashTable<Key,Value> x;

 Cần kiểm tra HashTable là kiểu gì?

 Các kí hiệu “<”, “,” được nạp chồng (overload)

Trang 85

Tổng kết

CFG cho phép mô tả cú pháp của mã

nguồn khá chính xác và ngắn gọn

CFG cho phép mô tả cách chuyển dãy các

từ tố thành cây suy dẫn (cây cú pháp)

Trang 86

Nhập môn Chương trình dịch

Bài 05: Phân tích trên xuống

(Top – down parsing)

Trang 88

= Id:min )

0

==

Id:a (

If

Trang 89

Văn phạm phi ngữ cảnh (CFG)

CFG có thể mô tả cú pháp của ngôn ngữlập trình

CFG có khả năng diễn tả các cú pháp lồng nhau (VD: dấu ngoặc, các lệnh lồng nhau)

Một xâu nằm trong ngôn ngữ của CFG

nếu có một suy dẫn từ kí hiệu bắt đầu sinh

ra xâu đó

Vấn đề: Văn phạm nhập nhằng

Trang 91

if E2 S else S2

if E1 S1

Trang 92

biệt 2 kí hiệu S với nhau

 Sửa lại văn phạm

matched → if (E) matched else matched | other

unmatched → if (E) matched else unmatched

Trang 93

Phân tích trên xuống (top-down)

Văn phạm có thể phân tích trên xuống

Cài đặt bộ phân tích cú pháp trên xuống (recursive descent parser)

Xây dựng cây cú pháp

Trang 94

Phân tích trên xuống

Mục tiêu: xây dựng cây suy dẫn trái trong

khi đọc dãy từ tố

(1+2+(3+4))+5 (1+2+(3+4))+5

S  E + S | E

E  số | (S)

Trang 96

Vấn đề ở văn phạm

Văn phạm này không thể phân tích trên

xuống nếu chỉ nhìn trước 1 kí tự

Không phải thuộc lớp văn phạm LL(1)

Trang 97

Viết lại văn phạm - LL(1)

Chuyển việc lựa chọn cho S’

S’  (+S)*

Trang 98

Phân tích trên xuống với văn phạm LL(1)

(1+2+(3+4))+5 (1+2+(3+4))+5

Trang 99

Phân tích tất định

 Lớp văn phạm LL(1):

– Với mỗi kí hiệu không kết thúc, từ tố nhìn trước sẽ xác định sản xuất phải sử dụng – Phân tích trên xuống  phân tích tất định – Cài đặt bằng bảng phân tích

Kí hiệu không kết thúc x ký hiệu kết thúc  sản xuất

Trang 100

Bảng phân tích

(1+2+(3+4))+5 (1+2+(3+4))+5

 

 

 +S S’

+ số

Trang 101

Cài đặt

Bảng phân tích được dùng trong phân tích

đệ quy xuống (recursive descent)

Cài đặt 3 thủ tục: parseS, parseS’, parseE

(S)

 số E

 

 

 +S S’

+ số

Trang 102

Phân tích đệ quy xuống

void parse_S () {

switch (token) {

case num: parse_E(); parse_S’(); return;

case ‘(’: parse_E(); parse_S’(); return;

default: throw new ParseError();

}

}

(S)

 số E

 

 

 +S S’

+ số

từ tố nhìn trước

Trang 103

Phân tích đệ quy xuống

void parse_S’() {

switch (token) {

case ‘+’: token = input.read(); parse_S(); return; case ‘)’: return;

case EOF: return;

default: throw new ParseError();

}

}

(S)

 số E

 

 

 +S S’

+ số

Trang 104

Phân tích đệ quy xuống

void parse_E() {

switch (token) {

case number: token = input.read(); return;

case ‘(‘:

token = input.read(); parse_S();

if (token != ‘)’) throw new ParseError();

token = input.read(); return;

default: throw new ParseError();

}

}

(S)

 số E

 

 

 +S S’

+ số

Trang 105

Trang 106

( +

số

?

Trang 107

xâu suy dẫn được từ γ.

 FOLLOW(X) với X là kí hiệu không kết thúc là : tập hợp các kí hiệu có thể theo sau xâu suy dẫn được từ X trong xâu vào.

X

Trang 108

 Văn phạm là LL(1) nếu không có ô nào được điền quá 1 lần

( +

số

Trang 109

Tính các ký hiệu triệt tiêu được

γ = X 1 X 2 X n triệt tiêu được nếu Xi triệt tiêu được (i = 1,2, , n)

Đệ quy:

– X  : X triệt tiêu được

– X  Y1Y2 Yn triệt tiêu được nếu Yi triệt tiêu

Trang 110

Thuật toán: Giả sử với mọi γ, FIRST(γ)

rỗng, áp dụng các luật trên liên tục để xây dựng các tập FIRST

Trang 111

Tính FOLLOW(X)

FOLLOW(S)  {$}

Nếu X  Y

– FOLLOW(Y)  FIRST()

– FOLLOW(Y)  FOLLOW(X) nếu  

Thuật toán: Giả sử với mọi X, FOLLOW(X) rỗng, áp dụng các luật trên đến khi không

có thay đổi nào

Ngày đăng: 06/07/2015, 18:50

HÌNH ẢNH LIÊN QUAN

Bảng phân tích - NHẬP MÔN CHƯƠNG TRÌNH DỊCH
Bảng ph ân tích (Trang 100)
Bảng phân tích LL(1) - NHẬP MÔN CHƯƠNG TRÌNH DỊCH
Bảng ph ân tích LL(1) (Trang 132)
Bảng hành động (action table) - NHẬP MÔN CHƯƠNG TRÌNH DỊCH
Bảng h ành động (action table) (Trang 154)
Bảng phân tích SLR - NHẬP MÔN CHƯƠNG TRÌNH DỊCH
Bảng ph ân tích SLR (Trang 160)
Bảng kí hiệu - NHẬP MÔN CHƯƠNG TRÌNH DỊCH
Bảng k í hiệu (Trang 188)

TỪ KHÓA LIÊN QUAN