Professional Documents
Culture Documents
IT4079 Four
IT4079 Four
1. Giới thiệu
2. Bảng ký hiệu
5. Xử lý sai sót
2/20/24 2
1. Giới thiệu
Ví dụ 1
Cho văn phạm G = (VT, VN, P, S)
P: { <Câu> ® <Chủ ngữ> <Vị ngữ>
<Chủ ngữ> ® <Danh ngữ>|<Danh từ>
<Chủ ngữ> ® <Danh ngữ>|<Danh từ>
<Danh ngữ>® <Danh từ> <Tính từ>
<Vị ngữ> ®<Động từ>|<Động từ><Bổ ngữ>
<Bổ ngữ> ® <Danh ngữ>
<Danh từ> ® « Bò »| « Cỏ »|
<Tính từ> ®« Vàng »| « Non »
<Động từ> ® « gặm» }
2/20/24 3
1. Giới thiệu
Ví dụ 1
L(G) =
« Bò vàng gặm cỏ non » Các câu đều
đúng ngữ pháp,
« Bò vàng gặm cỏ vàng »
nhưng không
« Bò non gặm cỏ non » phải câu nào
« Bò vàng gặm bò non » cũng đúng ngữ
« Cỏ non gặm bò vàng » nghĩa (có ý
nghĩa)
…..
2/20/24 4
1. Giới thiệu
Ví dụ 2
<Statement>
Þ <Variable> := <Expression>
Program Toto; Þ <Variableidentifier>:=<Expression>
Const N = 0; Þ N:= <Expression>
Begin Þ N:=<Term>
Þ N:=<Factor>
N :=10;
Þ N:=<Unsignedconstant>
End. Þ N:=<unsignedinteger>
Þ N:=10
Hoàn toàn đúng cú pháp của KPL
2/20/24 5
1. Giới thiệu
Nhận xét
2/20/24 6
1. Giới thiệu
Bảng ký hiệu
2/20/24 7
1. Giới thiệu
1. Giới thiệu
2. Bảng ký hiệu
5. Xử lý sai sót
2/20/24 9
2. Bảng ký hiệu
Mục đích
• Bảng dữ liệu mà các pha
Phân tích của CTD đều s/dụng
từ vựng • Dùng chứa thông tin về
các danh biểu (tên) xuất
Phân tích hiện trong chương trình
Bảng cú pháp nguồn
ký • Mỗi phần tử ứng với một
hiệu Phân tích tên, gồm 2 trường
ngữ nghĩa – Trường tên
• Khóa của bảng
– Trường thuộc tính
Sinh mã • Thuộc tính của tên
–Biến (kiểu), hằng (giá trị)..
2/20/24 10
2. Bảng ký hiệu
Mục đích
Khi gặp một danh biểu trong chương trình
• Gặp trong giai đoạn khai báo
– Đưa tên và các thông tin tương ứng vào bảng
– Ví dụ: Const Max = 10;
• Đưa Max vào bảng, với kiểu là constant, giá trị là 10;
• Gặp trong câu lệnh
– Đọc thông tin ra để sử dụng
• Phân tích ngữ nghĩa: Sử dụng đúng mục đích không?
– Ví dụ: Max := 20; ¬ Sai mục đích
• Sinh mã: Kích thước bộ nhớ cấp phát cho tên
– Ví dụ: int ®2 bytes, float ® 4 byte
2/20/24 11
2. Bảng ký hiệu
2/20/24 13
2. Bảng ký hiệu
cp n
2/20/24 20
2. Bảng ký hiệu
Phạm vi®Ví dụ
1) Program sort; //Chương trình Quicksort
2) Const Max = 100;
3) Var Arr: array[0..Max] of integer;
4) Procedure readarray;
5) Var i: integer;
6) Begin …… end {readarray};
7) Procedure exchange(i, j: integer);
8) Begin {exchange} end;
9) Procedure quicksort(m, n: integer);
10) Var k, v: integer;
11) Function partition(y,z: integer): integer;
12) Begin ……exchange(i,j) end; {partition}
13) Begin … end; {quicksort}
14)Begin … end; {sort}
2/20/24 21
2. Bảng ký hiệu
Dùng Stack
Vị trí thêm vào
j Variable
i Variable
Khi gặp danh biểu
Partition subProc
2/20/24 23
2. Bảng ký hiệu
Ví dụ đơn giản
• Dùng stack làm bảng ký hiệu
• Dùng giá trị Tx cho biết vị trí của đỉnh stack
– Tx là tham trị của compileBlock()//compileBlock(int Tx)
• Giá trị của Tx không thay đổi trong compileBlock()
– Khi phân tích Block, thủ tục compileBlock() có thể gọi
đến chính nó, Tx sẽ được kế thừa
• Khi đoán nhận thủ tục con, Tx sẽ tăng dần lên khi gặp các danh
biểu của chương trình con
• Khi đoán nhận xong - thoát ra khỏi compileBlock(), Tx khôi phục
lại giá trị cũ (giá trị trước khi goi)
– Nhưng khai báo bên trong một khối sẽ bị xóa đi
– Ban đầu, danh sách rỗng ® compileBlock(0)
2/20/24 24
2. Bảng ký hiệu
Ví dụ đơn giản
Const M=10;
Var X, Y: integer;
Procedure A; X Variable
Var X, Z: Integer;
Procedure AA; AA subProc
Var X: integer;
Z Variable
Begin
Z= X+Y*M X Variable
End;
A subProc
Begin
End; Y constant
Procedure B;
Var X, Y; X constant
Begin M Constant
End;
Begin Đáy Stack
End.
2/20/24 25
2. Bảng ký hiệu
Ví dụ đơn giản
Cần các thủ tục
• Procedure Enter(char * Id, Object Type);
– Đưa một danh biểu vào bảng ký hiệu
• Giá trị của danh biểu
• Kiểu danh biểu (constant, type, variable, procedure, function)
void compileBlock( ){
…..
if(Token==VAR){
Token = getToken();
compileDeclareVariable ();
while(Token == COMMA) {
Token = getToken();
compileDeclareVariable ();
};
}
….
}
2/20/24 27
2. Bảng ký hiệu
void compileStatement(){
int p;
if(Token == IDENT){
p = Location(Id);
if(p < 0) Error(52); //Ten chua khai bao
if(getKind(p) != Variable)
Error( );//Ve trai phai la mot bien
Token = getToken();
if(Token == LBRACK){
……..
}
}
2/20/24 29
Chương 4: Phân tích ngữ nghĩa
1. Giới thiệu
2. Bảng ký hiệu
5. Xử lý sai sót
2/20/24 30
3. Chương trình dịch định hướng cú pháp
2/20/24 34
3. Chương trình dịch định hướng cú pháp
Id1
2/20/24 36
3. Chương trình dịch định hướng cú pháp
2/20/24 38
3. Chương trình dịch định hướng cú pháp
2/20/24 40
3. Chương trình dịch định hướng cú pháp
Ví dụ
X: float; P®D;S
Y: Int; D ® D; D | id : T | proc id ; D1 ; S
Proc A;
- Xây dựng cây phân tích
X:int;
N : float; có chú giải cho chương
Proc B;
trình hình bên.
X:int;
SB - Xây dựng bảng ký hiệu,
SA có chỉ rõ vị trí các biến
S
2/20/24 45
Chương 4: Phân tích ngữ nghĩa
1. Giới thiệu
2. Bảng ký hiệu
5. Xử lý sai sót
2/20/24 46
4. Kiểm tra kiểu
2/20/24 47
4. Kiểm tra kiểu
• Tích Descarter:
– Nếu T1 và T2 là các biểu thức kiểu thì tích
Descarter T1× T2 là biểu thức kiểu
2/20/24 49
4. Kiểm tra kiểu
2/20/24 50
4. Kiểm tra kiểu
2/20/24 51
4. Kiểm tra kiểu
Hệ thống kiểu
• Tập các luật để ấn định các biểu thức kiểu
vào các phần khác nhau của chương trình
2/20/24 52
4. Kiểm tra kiểu
2/20/24 53
4. Kiểm tra kiểu
N : integer;
Ch : Char; P
N Mod Ch
D ; E
D ; D E Mod E
Id : T Id : T N Ch
N Integer Ch Char
2/20/24 54
4. Kiểm tra kiểu
D ; E
D ; D
SymTab
Id : T Id : T Name ObjType Type
N Var Int
Ch Ch Var Char
N Integer Char
addType(Id.entry,
T.Type=Integer
Enter(Id, ObjectType) T.type)
2/20/24 56
4. Kiểm tra kiểu
Hàm lookup(idx) trả về kiểu trong bảng ký hiệu tại vị trí idx
2/20/24 57
4. Kiểm tra kiểu
; E
D
E Mod E
SymTab
Name ObjType Type N Ch
N Var Int E.Type = Integer
E.Type = lookup(Id.Entry)
E.Type = Char
Ch Var Char E.Type = If E1.Type=int AND E2.Type=int Then Int
Else Type_Error
2/20/24 58
4. Kiểm tra kiểu
D ; D addType(Id.entry, T.type)
Id : T Id : T.type= arr(10, T1.Type)
SymTab Arr [ Num ] of T.type= arr(20,int)
A
Nam Obj Type
e Type
10 Arr [ Num ] of T
N Var Int
E [ E ] 100
SymTab
Nam Obj Type
e Type E [ E ] 10 E.type= int
N Var Int
A 5
A Var Arr (10,Arr(20,int)) E.type= int
2/20/24 60
4. Kiểm tra kiểu
2/20/24 61
4. Kiểm tra kiểu
N Integer A Arr[] of T N
E Mod E
SymTab char
Na Obj Type E [ E ] Num
me Type
N Var Int Id Num 10
E.type=
A Var Arr (10,Char) array(10,char) E.type= char
A 5
2/20/24 62
4. Kiểm tra kiểu
Chuyển kiểu
float x; int n;
x + n ® Quy đổi về một kiểu
2/20/24 66
Chương 4: Phân tích ngữ nghĩa
1. Giới thiệu
2. Bảng ký hiệu
5. Xử lý sai sót
2/20/24 67
5. Xử lý sai sót
Giới thiệu
Phân tích cú pháp nếu gặp lỗi
• Gọi tới thủ tục Error(…) để báo lỗi
– Thông báo kiểu của lỗi và vị trí của lỗi
• Sau khi báo lỗi ngừng quá trình dịch lại
– Bởi văn bản nguồn không khớp với dự đoán ®
Chương trình dịch không biết đi theo hướng nào
• VD: gặp statement (X):=10; sẽ không biết đi nhánh nào
– Chương trình dịch có n lỗi ® cần n+1 lần dịch
• Tốn kém
• Cần điều chỉnh để CTD có thể hồi phục sau khi gặp lỗi
2/20/24 68
5. Xử lý sai sót
Phương pháp
• Vượt bỏ một đoạn trên văn bản nguồn cho tới
khi tìm được một từ tố cho phép nắm bắt lại
được cấu trúc chương trình và có thể tiếp tục
làm việc theo dự kiến
• Các từ tố cho phép nắm bắt được cấu trúc là
các ký hiệu ngừng. Có thể là
– Các từ tố theo sau cấu trúc đang phân tích
• Khi gặp, cho biết cấu trúc đã bị bỏ qua
• Là FOLLOW() của cấu trúc
– Các từ tố trong cấu trúc hiện tại, ít khi bị bỏ xót
• Được goi là Các ký hiệu chốt
• Thường là từ khóa của cấu trúc hiện tại
2/20/24 69
5. Xử lý sai sót
Phương pháp®Ví dụ
2/20/24 70
5. Xử lý sai sót
Phương pháp®Ví dụ
2/20/24 71
5. Xử lý sai sót
Statement
;
2/20/24 73
5. Xử lý sai sót