Tải bản đầy đủ (.doc) (44 trang)

Tìm hiểu về trình biên dịch và xây dựng ngôn ngữ lập trình tiếng việt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (287.84 KB, 44 trang )

Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Lời nói đầu !
Chúng ta đang sống trong thế kỷ XXI thế kỷ của CNTT, của nền kinh
tế tri thức, xu thế toàn cầu hóa và của nền văn minh tin học. Máy tính ra
đời làm thay đổi cả thế giới, nó thâm nhập vào mọi lĩnh vực của cuộc sống
và trở thành phơng tiện xử lý thông tin một cách nhanh chóng, hiệu quả.
Trong sự phát triển không ngừng của nghành tin học thì việc xây dựng các
ngôn ngữ lập trình mới là đang và ngày càng đợc khuyến khích. Điều đó đã
làm xuất hiện không ít ý tởng xây dựng các chơng trình sử dụng ngôn ngữ
lập trình viết bằng tiếng Việt của các nhà lập trình ở Việt Nam. Bởi hầu hết
các ngôn ngữ lập trình nh Pascal, C, C++, Java..v..v.. đều bằng tiếng Anh
nên đã gây nhiều khó khăn cho ngời lập trình, nhất là những ngời mà trình
độ tiếng Anh còn hạn chế. Thiết nghĩ rằng, chúng ta là những con ngời Việt
Nam thì tại sao không sử dụng ngôn ngữ Việt Nam vào việc xây dựng ngôn
ngữ lập trình? Cũng xuất phát từ nguyện vọng đó, trong đề tài này em xin
đa ra một ý tởng Xây dựng một ngôn ngữ lập trình tiếng Việt. Điều này là
có thể thực hiện đợc, thông qua cơ chế biên dịch của Trình Biên Dịch, kết
hợp với ngôn ngữ C Sharp ( hay còn gọi là C # ) là phiên bản mới nhất
trong bộ Visual Studio.Net của hãng Microsoft để viết ra một ngôn ngữ lập
trình tiếng việt. Vậy Trình Biên Dịch nghĩa là gì và C Sharp nghĩa là gì,
chúng hoạt động ra sao và có liên quan với nhau nh thế nào ? Tất cả sẽ đợc nghiên cứu trong đề tài: Tìm hiểu Về Trình Biên Dịch và
Xây Dựng Ngôn Ngữ Lập Trình Tiếng Việt . Đề tài chia
làm năm chơng:
Chơng 1: Tổng quan về trình biên dịch
Chơng này giới thiệu về Trình Biên Dịch, công nghệ Dot Net và khái
quát về chơng trình xây dựng ngôn ngữ lập trình tiếng việt.
Chơng 2: Bộ phân tích từ vựng
Chơng này trình bày các vấn đề về bộ phân tích từ vựng.


Chơng 3:Bộ phân tích cú pháp
Chơng này trình bày các vấn đề về bộ phân tích cú pháp.
Chơng 4:Bộ xử lý ngữ nghĩa
Chơng này trình bày các vấn đề về bộ xử lý ngữ nghĩa.
-2-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Chơng 5: Giới thiệu ngôn ngữ
Chơng này nêu một số vấn đề về C Sharp và ngôn ngữ Tiếng Việt.
------****-----Một chơng trình hay, hoàn hảo đáp ứng nhu cầu thực tế là mục tiêu
của tất cả những ai quan tâm đến lập trình nói chung và chơng trình này
nói riêng. Tuy nhiên do lần đầu thực hiện bằng ngôn ngữ mới, trình độ còn
hạn chế và thời gian ngắn nên chơng trình chỉ mới giới thiệu đợc ý tởng
trong phạm vi hẹpvà chắc chắn không tránh khỏi thiếu sót, em rất mong
đợc sự góp ý, giúp đỡ của các thầy cô trong khoa và các bạn . Nhân đây em
xin đợc gửi lời cảm ơn chân thành tới thầy giáo Nguyễn Công Nhật đã
nhiệt tình gúp đỡ em hoàn thành đề tài này. Trong quá trình thực hiện em
đã nhận đợc nhiều sự động viên, giúp đỡ của thầy cô và bạn bè, em xin đợc
bày tỏ lòng cảm ơn và hứa sẽ cố gắng hơn nữa để chơng trình này ngày
càng hoàn chỉnh hơn.
Vinh ngày 3 tháng 5 năm 2006
Nguyễn Thị Nha Trang
Lớp: K42E3 Tin
Khoa CNTT - Đại Học Vinh

Mục Lục

Lời nói đầu
Mục Lục
Chơng 1: Tổng quan về trình biên dịch......................................................6
1. Giới thiệu về trình biên dịch........................................................................6
1.1. Cơ chế biên dịch.............................................................................6
1.2. Cơ chế thông dịch...........................................................................7
2. Giới thiệu văn phạm Automat......................................................................7
2.1. Khái niệm văn phạm......................................................................7
2.2. Automat..........................................................................................8
3. Khái quát chơng trình.................................................................................9
Chơng 2: Bộ phân tích từ vựng..................................................................10
1. Vai trò và nhiệm vụ....................................................................................10
2. Mô hình hoạt động.....................................................................................10
3. Phát hiện và xử lý lỗi.................................................................................10
4. Biểu thức chính quy...................................................................................10
-3-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

5. Phơng pháp xây dựng DFA( Determinstic Finite Automation) trực tiếp
từ biểu thức chính quy....................................................................................11
6. Xây dựng bộ phân tích từ vựng.................................................................12
6.1. Xây dựng vùng đệm nhập............................................................12
6.2. Xây dựng bảng danh hiệu............................................................12
6.3. Sơ đồ dịch.....................................................................................13
Chơng 3: Bộ phân tích cú pháp..................................................................15
1. Giới thiệu chung về bộ phân tích cú pháp.................................................15

1.1. Vai trò và nhiệm vụ......................................................................15
1.2. Phân loại văn phạm.......................................................................15
1.3. Cây dẫn xuất.................................................................................15
1.4. Khái niệm về câu, dạng câu.........................................................15
1.5. Thiết kế văn phạm........................................................................15
1.5.1. Văn phạm đệ quy trái trực tiếp......................................15
1.5.2. Văn phạm đệ quy trái gián tiếp.....................................16
1.5.3. Văn phạm yếu tố trái......................................................17
2. Bộ phân tích cú pháp đoán nhận trớc không đệ quy........18
2.1. Nguyên tắc phân tích....................................................................18
2.2. Mô hình hoạt động.......................................................................18
2.3. Xây dựng bảng phân tích..............................................................20
2.3.1. Xác định tập First của các kí hiệu cha kết thúc............20
2.3.2. Xác định tập Follow của các kí hiệu cha kết thúc........20
2.3.3. Giải thuật xây dựng bảng phân tích...............................20
3.4. Vấn đề xử lý lỗi.................................................................21
3. Bộ phân tích cú pháp thứ tự yếu................................................................25
3.1. Nguyên tắc phân tích....................................................................25
3.2. Mô hình hoạt động.......................................................................25
3.3. Xây dựng bảng phân tích..............................................................26
3.3.1. Quan hệ thứ tự yếu.........................................................26
3.3.2. Phơng pháp xác định quan hệ thứ tự yếu cho các kýhiệu
văn phạm...........................................................................26
3.3.3. Giải thuật xây dựng bảng phân tích..............................27
4. Bộ phân tích cú pháp LR...........................................................................31
4.1. Nguyên tắc phân tích....................................................................31
4.2. Mô hình hoạt động.......................................................................31
4.3. Xây dựng bảng phân tích..............................................................35
Chơng 4. Bộ xử lý ngữ nghĩa.......................................................................43
1. Tổng quát....................................................................................................43

2. Các cấu trúc lệnh........................................................................................44
2.1. Cấu trúc rẽ nhánh..........................................................................44
2.2. Cấu trúc lệnh Switch.....................................................................45
2.3. Các cấu trúc lặp............................................................................46
2.3.1. Lệnh while......................................................................46
2.3.2. Lệnh do..while.............................................................46
2.3.3. Khối lệnh for..................................................................47
Chơng 5: Giới thiệu ngôn ngữ....................................................................48

-4-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

1. Giới thiệu ngôn ngữ C Sharp (C#).............................................................49
2. Giới thiệu ngôn ngữ lập trình tiếng việt...................................................49
2.1. Tập ký hiệu...................................................................................49
2.2. Luật danh hiệu..............................................................................49
2.3. Các toán tử....................................................................................49
2.4. Các lệnh chơng trình.....................................................................50
2.4.1. Lệnh khai báo biến.........................................................50
2.4.2. Các lệnh xử lý điều kiện rẽ nhánh.................................50
2.4.3. Các câu lệnh lặp.............................................................51
Kết luận
Tài liệu tham khảo
Chơng 1: Tổng Quan về trình biên dịch
1.


Giới Thiệu Về Trình Biên Dịch:
Chúng ta đã thờng quen thuộc với thuật ngữ thông dịch và biên dịch.
Ví dụ trong cuộc sống chúng ta thờng nghe những ngời làm thông dịch
viên tiếng Anh , tiếng Pháp v..v.. là những ngời nghe từng câu trong ngôn
ngữ khác và dịch lại từng câu cho ngời khác. ở đây trình biên dịch đóng vai
trò nh một ngời thông dịch trong việc dịch một mã văn bản chơng trình
nguồn của một ngôn ngữ lập trình ra mã máy. Cơ chế thông dịch có thể là
biên dịch hoặc thông dịch tùy theo mỗi ngôn ngữ lập trình.
1.1. Cơ chế Biên Dịch:
Mã văn bản chơng trình nguồn đợc dịch sang một dạng mã trung gian
sau đó mã trung gian sẽ đợc dịch xuống mã máy và mã máy sẽ đợc thực thi
bởi Control Process Unit (CPU). Tiêu biểu cho loại này là công nghệ Dot
Net.
Source Code
(Mã nguồn)

Front-End
(Analysis)

Immediate Code
(Mã trung gian)

JIT
(Just In - Time)

Back End
(Synthesis)
Architecture 1

Architecture 2


-5Destination Code 1
(Native Code-mã máy)

Destination Code 2
(Native Code-mã máy)


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Mô Hình Biên Dịch Của Công Nghệ Dot Net
2. Cơ chế Thông Dịch:
Mã văn bản chơng trình nguồn đợc dịch sang một dạng mã trung gian
sau đó mã trung gian sẽ đợc thực thi bởi một phần mềm. Tiêu biểu cho loại
này là công nghệ Java.
source code
(Mó ngun)

Compiler
Front
End
(Analysis)

Immediate Code
(Mó Trung Gian)

Process By JVM
(Java Virtual

Machine)

Mô Hình Biên Dịch Của Công Nghệ Java
Các chơng trình biên dịch có tiền xử lý lớn còn các chơng trình thông
dịch có tiền xử lý nhỏ hơn rất nhiều. Các chơng trình đợc biên dịch chạy
nhanh hơn so với các chơng trình đợc thông dịch vì toàn bộ chơng trình này
có thể tơng tác trực tiếp với bộ vi xử lý(CPU) và không cần chia bộ nhớ và
trình thông dịch. Các chơng trình thông dịch thì mã lệnh chơng trình sẽ đợc
thông dịch (Interpreter) bởi một phần mềm nên chiếm CPU nhiều hơn và
chạy chậm hơn.
2. Giới Thiệu Văn Phạm Automat:
2.1. Khái niệm Văn Phạm:
Văn phạm là một tập hợp các ký hiệu đợc sắp xếp theo một trình tự
nhất định có những ý nghĩa nhất định.
Một văn phạm thờng đợc bao gồm bởi các tập ký hiệu < V, T, S, P >
Trong đó:
+ V là tập các ký hiệu cha kết thúc (Variable).
+ T là tập các ký hiệu kết thúc (Terminal).
+ S là ký hiệu xuất phát của một văn phạm (Start).
+ P là tập luật sinh (Production).
áp dụng luật sinh
S
Câu của ngôn ngữ.
Dạng của luật sinh:
-6-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang


<Chuỗi ký hiệu cha kết thúc>
thúc>
Ví dụ: Ta có tập luật sinh:
P:
S
aSb
S
( là một dẫn xuất rỗng)
hoặc ta có thể viết:
S
aSb ( - hoặc)
với:
Tập ký hiệu cha kết thúc V={S}.
Tập ký hiệu kết thúc T={a,b}.
từ S aSb
=> S aaSSbb
từ S
=> S aabb
=> S an bn với n 0
Nh vậy ta có thể nói lệnh an bn đợc sinh ra bởi văn P.
2.2. Automat:
Automat là mô hình trừu tợng của máy tính số.
Các thành phần:
- Bộ phận đọc dữ liệu(Data) từ một tập tin vào (một chuỗi các ký hiệu
và không sửa đổi). đọc mỗi lần một ký hiệu.
- Vùng nhớ tạm, lu chữ các ký hiệu(nội dung có thể thay đổi đợc).
- Đơn vị điều khiển:
+ Có trạng thái nội tại thuộc tập trạng thái hữu hạn.

+Trạng thái thay đổi theo hàm chuyển trạng thái.
- Trạng thái hiện tại của đơn vị điều khiển.
- Ký hiệu hiện tại.
- Thông tin hiện tại trong vùng nhớ tạm.
- Số trạng thái <= 2* (Số biểu thức con).
- Tại một trạng thái không có nhiều cạnh ra có cùng nhãn (tức
là có cùng ký hiệu nhập).
- Chỉ có một trạng thái khởi đầu và một trạng thái kết thúc. ở
trạng thái kết thúc không có cạnh ra.
- Nếu có nhiều trạng thái khởi đầu ta thêm những cạnh truyền
rỗng tới đó sao cho chỉ có một trạng thái khởi đầu.Tơng tự nếu có
nhiều trạng thái kết thúc.
3. Khái Quát Chơng Trình:
Chơng trình đợc xây dựng hết sức đơn giản, dựa trên cơ chế trình thông
dịch .Chơng trình sẽ thông dịch ngay trên mã nguồn mà không dịch ra một
ngôn ngữ trung gian nào.

Compile and
Interpreter

Soure Code
(Mã nguồn)

-7-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang


Trình biên dịch đợc xây dựng là một trình thông dịch.Khi chơng trình
thực thi, toàn bộ văn bản chơng trình nguồn sẽ đợc nạp vào bộ nhớ.Trình
biên dịch phân biệt chữ hoa và chữ thờng.Trong quá trình biên dịch chơng
trình sẽ dừng lại ngay khi gặp lỗi.
Các thành phần chính của chơng trình:
- Bộ phân tích từ vựng
- Bộ phân tích cú pháp
- Bộ xử lý ngữ nghĩa
Các nhiệm vụ cơ bản của từng bộ phận:
- Bộ phân tích từ vựng
Nạp toàn bộ văn bản chơng trình nguồn vào bộ nhớ. Phân tích
văn bản chơng trình nguồn thành các token riêng biệt.
Báo lỗi khi gặp các ký hiệu không thuộc tập ký hiệu hoặc các
token không thỏa mãn luật danh hiệu.
- Bộ phân tích cú pháp
Dựa vào tập luật sinh cho trớc, bộ phân tích cú pháp sẽ phân
tích câu lệnh nhập xem có thỏa tập luật sinh hay không.
Báo lỗi khi câu lệnh nhập không đúng cú pháp (không thỏa
cú pháp của tập luật sinh).
- Bộ xử lý ngữ nghĩa
Đánh giá biểu thức câu lệnh nhập, xử lý ngữ nghĩa câu lệnh
nhập đúng cú pháp (cho ta biết kết quả cuối cùng của một
câu lệnh nhập).
Chơng 2: Bộ Phân Tích Từ Vựng
1. Vai trò và nhiệm vụ:
- Là pha đầu tiên của trình biên dịch. Giao tiếp trực tiếp với văn bản chơng trình nguồn.
Văn
Ch
ơngvăn bản nguồn thành các token.
- Nhiệm vụ chính

là Bản
phân
tích
Trình
Nguồn
- Bỏ qua các ký tự
khoảng
trắng, ghi chú.
(Source
Code)
- Tập hợp các thông tin từ văn bản nguồn cần cho quá trình tiếp theo.
2. Mô hình hoạt động:
Bộ Phân Tích
Từ Vựng
(Lexeme Analysis)

Yêu cầu
Token kế tiếp

Định nghĩa
token

Bộ Phân Tích
Cú Pháp
(Syntax Analysis)

-8-

Bảng Danh Hiệu
(Identify Table)



Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Mô Hình Hoạt Động Của Bộ Phân Tích Từ Vựng
3. Phát hiện và xử lý lỗi:
Có thể sử dụng các cơ chế sau:
- Báo sai và ngng chơng trình.
- Báo sai và tìm vị trí thích hợp để tiếp tục quá trình phân tích.
- Báo sai thêm sửa để tiếp tục quá trình phân tích.
4. Biểu thức chính quy:
Là tập tuần tự các định nghĩa có dạng:
di ri
- di là ký hiệu định nghĩa.
- ri là biểu thức chính quy dựa trên tập ký hiệu().
Một số ký hiệu:
- digit +
- lặp lại ít nhất một lần.
- digit ?
- không có hoặc có một lần.
- [ abc ]
- a b c
- [ a-z ]
- a b z
5. Phơng pháp xây dựng DFA(Determinstic Finite Automation) trực
tiếp từ biểu thức chính quy:
biểu thức chính quy ban đầu : r.
- Tạo biểu thức chính quy gia tố: r#.

- Xây dựng cây cú pháp với biểu thức chính quy gia tố r#.
-Nút lá a thuộc: , , #.
-Nút trung gian: |, , *.
- Đánh số cho các nút lá: #, (thể hiện cho vị trí).
- Xác định giá trị các hàm: Nullable(N) , FirstPosition(N) ,
LastPosition(N), FollowPosition(p).
- Nullable(N) trả về giá trị True nếu biểu thức chính quy tơng ứng
có nút gốc lá N có thể sinh ra chuỗi rỗng và ngợc lại trả về giá trị
False.
- FirstPos(N) là tập các vị trí có thể so trùng với ký hiệu đầu của chuỗi
đợc sinh ra bởi biểu thức chính quy tơng ứng với cây biểu thức gốc N.
- LastPos(N) là tập các vị trí có thể so trùng với ký hiệu cuối của chuỗi
đợc sinh ra bởi biểu thức chính quy tơng ứng với cây biểu thức gốc N.
- FollowPos(p) là tập các vị trí có thể so trùng với ký hiệu tong ứng với
vị trí p trong chuỗi.

-9-


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Biểu thức chính Nullable()
quy
A
True

FirstPos()


LastPos()

a
(a ở vị trí i)





False

{i}

{i}

Nullable(N1)or
Nullable(N2)

FirstPos(N1)+
FirstPos(N2)

LastPos(N1)+
LastPos(N2)

Nullable(N1)
and
Nullable(N2)

If(Nullable(N1))
FirstPos(N1)+

FirstPos(N2)
Else
FirstPos(N1)

If(Nullable(N2))
LastPos(N1)+
LastPos(N2)
Else
LastPos(N2)


N1

N2


N1
*
N

|

N2
True

FirstPos(N)

LastPos(N)

FollowPos()


FollowPos(i)=
FirstPos(N2).
với
i
LastPos(N1)
FollowPos(i)=
FirstPos(N).
với i
LastPos(N)

- Xây dựng DFA theo giải thuật:
Dstate = FirstPos(root)
While (S Dstate && unmarked(S))
{
marked(S);
for (a )
{
U=U+ FollowPos(p);
p S,p a
Dstate = Dstate + {U};
Dstate [S] [a] = U;
}
}
6. Xây dựng bộ phân tích từ vựng:
6.1. Xây dựng vùng đệm nhập:
Vùng đệm nhập là một cấu trúc dữ liệu là nơi để nạp văn bản chơng
trình nguồn vào bộ nhớ, ta có thể hiện thực Vùng Đệm Nhập nh sau:
- sử dụng biến beginning trỏ đến đầu chuỗi đang phân tích.
- khởi tạo biến forward = beginning.

- Sau mỗi lần đọc một ký hiệu tăng forward lên 1.
forward = forward +1;
- kiểm tra điều kiện đạt tới danh giới bộ đệm:
if (forward = end_of_left_buffer)
{
load_to_right_buffer;
forward = forward +1;
}
else if (forward = end_of_right_buffer)
{
load_to_left_buffer;
forward = head_left_buffer;
}
6.2. Xây dựng bảng danh hiệu:
- 10 -


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Bảng Danh Hiệu (Identify Table) là một cấu trúc dữ liệu lu trữ thông
tin liên quan đến danh hiệu nh nội dung của danh hiệu, loại danh hiệu (số
hay chuỗi), kiểu của danh hiệu( số nguyên hay số thực) v..v..
Bảng danh hiệu phải đợc tổ chức sao cho thao tác dò tìm có hiệu quả
nhanh nhất cả về mặtthời gian và mặt xử lý.Tiết kiệm vùng nhớ,dễ mở rộng
khi cần thiết.
Ta có thể tổ chức Bảng Danh Hiệu theo bảng Tuyến Tính hoặc bảng
Băm hay một dạng cấu trúc dữ liệu khác hiệu quả hơn.
Các thao tác trên Bảng Danh Hiệu:

- Dò tìm một danh hiệu (position lookup) trả về vị trí của danh hiệu đó
trong Bảng Danh Hiệu nếu tìm thấy ngợc lại nếu không tìm thấy trả về
một vị trí bất hợp lệ.
- Thêm danh hiệu vào Bảng Danh Hiệu, mở rộng Bảng Danh Hiệu nếu
đầy phần tử.
- Các thao tác liên quan đến vấn đề tầm vực : Sau khi xây dựng đợc
bảng danh hiệu thì công việc đầu tiên là phải khởi tạo bảng danh hiệu.
Lấp đầy các từ khóa theo ngôn ngữ định trớc ứng với mỗi loại từ khóa
ứng với một loại token. Ví dụ if tơng ứng với loại token IF với mỗi
danh hiệu thì loại token tơng ứng là ID.
6.3. Sơ đồ dịch ( Translation Diagram):
i
i

Trạng thái bắt đầu.
Trạng thái kết thúc ( không có cạnh ra).

- Sơ đồ chuyển trạng thái cho biết cách thức biến đổi tơng ứng với ký
hiệu nhập.
- Xây dựng dựa trên đặc tả từ vựng (định nghĩa biểu thức chính quy).
Ví dụ:
Ta định nghĩa các toán tử logic nh sau:

Relation operator

Comment

>
>=
<

<=
==
!=
!
=

Greater than
Greater or Equal
Lesser than
Lesser ỏ Equal
Equal
Not Equal
Not
Assingment

Các ký tự chữ:
Các ký tự số:
Các danh hiệu:

Letter [a-z] [A-Z].
Digit [0-9].
Identify Letter (letter Digit)*.

- 11 -


Khoá luận tốt nghiệp đại học

0


<

>

Nguyễn Thị Nha Trang

2i

Return
(<=,LE)

other

3i

Return (<, LT)

=

5i

Return (>=,
GE)

6i

Return(<, GT)

=


8i

Return (=
=,EQ)

other

9i

Return(=, AS)

1

4

=

other

=

!

letter

7

1
0


=

1i
1

Return (!=,
NE)

other

1i
2

Return (!,
NOT)

other

i
Return (id, ID)
Translation
Diagram 14
1
3
Chơng 3: Bộ Phân Tích Cú Pháp
Letter |Digit
Trong chơng này giới thiệu một số bộ phân tích cú pháp qua đó ta có
thể nhận ra điểm mạnh và điểm
yếu của từng phơng pháp, và giới thiệu phDigit
ơng pháp xây dựng từng bộ phân tích cú pháp. Bộ phân tích cú pháp đoán

nhận trớc không đệ quy. Bộ phân tích cú pháp thứ tự yếu và bộ phân tích cú
pháp LR (Bộ phân tích này đợc sử dụng để xây dựng chơng trình).
1. Giới Thiệu chung về bộ phân tích cú pháp
1.1. Vai trò và nhiệm vụ:
- 12 -


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

Là pha thứ hai giao tiếp với bộ phân tích từ vựng. Nhận chuỗi token,
kiểm chứng các token đợc sắp xếp theo đúng trật tự cú pháp đã định. Kết
hợp với quá trình xử lý ngữ nghĩa. Báo lỗi khi sai.
Kết quả quá trình phân tích là cây cú pháp.
1.2. Phân loại Văn Phạm:
Văn phạn tuyến tính:
Là văn phạm mà luật sinh có dạng:
AxB
hay A Bx
hay A x
Văn phạm phi ngữ cảnh:
Là văn phạm mà luật sinh có dạng:
AW
với W (V + T)
1.3. Cây dẫn xuất:
- Nút gốc có nhãn trùng với ký hiệu xuất phát của văn phạm.
- Nút lá có nhãn trùng với ký hiệu T + ( ký hiệu rỗng)
- Nút trung gian có nhãn trùng với ký hiệu thuộc V.
- Nếu A x1x2xn P thì nút có nhãn A sẽ có các nút con lần lợt là

x1, x2 n ( từ trái sang phải ).
1.4. Khái niệm về câu, dạng câu:
- Câu: là chuỗi các ký hiệu kết thúc (T ).
- Dạng câu: là chuỗi các ký hiệu kết thúc và cha kết thúc ( T + V).
1.5. Thiết kế văn phạm:
Cú pháp của các ngôn ngữ lập trình có thể đợc đặc tả bởi các văn
phạm phi ngữ cảnh.
1.5.1. Văn phạm đệ quy trái trực tiếp:
Văn phạm đệ quy trái trực tiếp là văn phạm có sự trùng lắp giữa giá
trị vế trái của câu dẫn xuất với giá trị đầu tiên bên phải của câu dẫn xuất.
Ví dụ:
P:
A AC | Aad | bd | . (có sự trùng lắp giá trị A)
giải thuật khử đệ quy trái trực tiếp:
for (P)
{
if (p = Aa1 | Aa2 | | Aan | b1 | b2 | | bm) then
{
replace p by
Ab1A | b2A | | bmA
A a1A | a2A | | anA
}

}

ví dụ:
- 13 -


Khoá luận tốt nghiệp đại học


Nguyễn Thị Nha Trang

ta có tập luật sinh P:
A AC | Aad | bd |
ta khử đệ quy trái trực tiếp nh sau:
P:
A bdA | A
A CA | adA |
1.5.2. Văn phạm đệ quy trái gián tiếp:
Văn phạm đệ quy trái gián tiếp là văn phạm có câu dẫn xuất mà vế
trái của câu dẫn xuất trùng với giá trị đầu tiên của vế phải câu dẫn xuất qua
nhiều câu dẫn xuất.
Ví dụ:
P: S Aa | b
(1)
A AC | Sd | (2) (có sự trùng lắp giá trị S).
Giải thuật khử đệ quy trái gián tiếp:
- Sắp xếp các ký hiệu cha kết thúc theo thứ tự A1, A2 An
for (i = 1 to n)
{
for (j = 1 to i 1)
{
if ( p: Ai Ajb)
{
Ai C1b | C2b | | Cnb
với Aj C1 | C2 | | Cn
khử đệ quy trái trực tiếp.
}
}

}
ví dụ:

Khử đệ quy trái gián tiếp
P:
S Aa | b
(1)
A AC | Sd | (2)
Thay S Aa | b vào (2) ta có:
S Aa | b
A AC | Aad | bd |
Ta tiếp tục khử đệ quy trái trực tiếp của
A AC | Aad | bd |
A bdA | A
A CA | adA |
S Aa | b
=> P: A bdA | A
A CA | adA |
- 14 -

(1)
(2)
(3)


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

1.5.3. Văn phạm yếu tố trái:

Văn phạm yếu tố trái là văn phạm có câu dẫn xuất mà có sự trùng lắp
giữa vế trái của câu dẫn xuất với giá trị cuối cùng của vế phải câu
dẫn xuất.
Ví dụ:
P: D L : T ; D | L : T;
(có sự trùng lắp D)
T i|f
L id , L | id
(có sự trùng lắp L)
- Thuật toán khử trùng lắp yếu tố trái nh sau:
Thay A aB1 | aB2 | | aBn
bởi A aA
A B1 | B2 | | Bn ( ký hiệu đầu của B1, B2, , Bn khác
nhau ).
- Ta khử trùng lắp yếu tố trái nh sau:
P:
D L : T ; D
( nhómL:T; làm thừa số chung )
D D |
T i|f
L id L
( nhóm id làm thừa số chung )
L , L |
2. Bộ Phân Tích Cú Pháp Đoán Nhận Trớc Không Đệ Quy
2.1.

Nguyên tắc phân tích:
- Yêu cầu văn phạm không đệ quy trái trực tiếp hay gián tiếp. Nếu văn
phạm đệ quy trái thì khử đệ quy trái.
Yêu cầu văn phạm không có yếu tố trái. Nếu văn phạm có yếu

tố trái thì khử yếu tố trái.
2.2. Mô hình hoạt động:
Vùng Đệm Nhập

Bộ Điều Khiển
Chơng Trình Phân
Tích Cú Pháp Đoán
Nhận Trớc

Xuất

Stack
Bảng Phân Tích M

Mô Hình Hoạt Động Của Bộ Phân Tích Cú Pháp
Đoán Nhận Trớc Không Đệ Quy
- 15 -


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

- Vùng Đệm Nhập: chứa văn bản chơng trình cần phân tích. Kết thúc
vùng đệm nhập chứa ký hiệu $ ( $ T ), ký hiệu kết thúc.
- Stack chứa dạng câu của văn phạm trong quá trình phân tích. Đáy
Stack chứa ký hiệu $.
- Bảng phân tích M là một bảng hai chiều.
M [A, a] = Luật sinh A B ( a là ký hiệu bắt đầu của câu đợc dẫn
xuất từ B. B a...)

M [A, a] = ( lỗi sai ).
A V , a T.
- Bộ Điều khiển:
Tại mỗi thời điểm bộ điều khiển dựa trên ký hiệu ở đỉnh Stack x và ký
hiệu nhập a để quyết định hành vi tơng ứng.
i. Nếu x = a = $
Báo thành công (đoán nhận đợc chuỗi nhập, chuỗi
nhập đúng cú pháp với văn phạm). kết thúc quá trình
phân tích.
ii. Nếu x = a $.
Loại x khỏi Stack. Đọc ký hiệu nhập kế tiếp.
iii. Nếu x V (x là ký hiệu cha kết thúc).
Tra trong bảng M.
nếu:
M [x, a] = x y1y2yn loại x khỏi Stack lần lợt đa vào Stack các giá trị yn, yn-1 y1.
nếu:
M [A, a] =
báo lỗi sai.
Giải thuật xử lý bộ điều khiển:
- nạp chuỗi nhập kết thúc bằng $ vào đệm nhập.
- push ($);
- push (S); // S là ký hiệu xuất phát của văn phạm.
- top_of_stack (x);
- a = GetNextToken ( );
- while ( x $ && a $ )
{
if ( x T && x = = a )
{
pop (x);
a = GetNextToken ( );

}
else if ( x V )
{
if ( M [x, a] = = x y1y2 yn )
{
pop (x);
- 16 -


Khoá luận tốt nghiệp đại học

}
else
{
}
else
{
}

}

}

Nguyễn Thị Nha Trang

for ( i=n to 1 )
{
push ( yi );
}


error ( );

error ( );

output (success) // phân tích thành công.
- kết xuất của quá trình phân tích là cây cú pháp.
2.3. Xây dựng bảng phân tích M:
Bộ phân tích cú pháp đoán nhận trớc không đệ quy cho các văn phạm
khác nhau chỉ khác nhau ở bảng phân tích.
2.3.1. Xác định tập First của các ký hiệu cha kết thúc
Giải thuật xác định tập First:
i.
ii.
iii.

First (A) = { A } nếu A T
nếu A thì
First (A) = First (A) + { }
nếu A y1y2 yn thì
First (A) = First (A) + ( First (y1) { } );
i = 1;
while ( i < n && First (yi))
{
First (A) = First (A) + ( First (yi+1) { } );
i ++;
}

2.3.2. Xác định tập Follow của các ký hiệu cha kết thúc
Giải thuật xác định tập Follow:
i. Follow (S) = { $ } nếu S là ký hiệu xuất phát của văn phạm.

ii. nếu X aAB thì Follow (A) = Follow (A) +(First(B) - { })
iii. nếu X aA hay (X aAB và First(B))
thì Follow (A) = Follow (A) + Follow(X)
2.3.3. Giải thuật xây dựng bảng M:
for ( A V , a T)
{
M [A, a] = {};

- 17 -


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

}
for ( p = A B P)
{
for ( a T && a First(B))
M [A, a] = { A B }
if ( First (B))
{
for ( b (T + { $ }) && b Follow (A))
{
M [A, b] = { A B};
}
}
}
2.3.4. Vấn đề xử lý lỗi:
Trong quá trình phân tích nếu gặp lỗi thì bỏ qua các ký hiệu kế tiếp cho

đến khi gặp ký hiệu thuộc tập ký hiệu đồng bộ thì tiếp tục quá
trình phân tích.
Ví dụ:
Xây dựng bộ phân tích cú pháp cho văn phạm sau:
P:
E
E
T
T
F
F

E + T
T
T * F
F
id
(E)

(1)
(2)
(3)
(4)
(5)
(6)

Ta thấy văn phạm đệ quy trái trực tiếp ở câu dẫn xuất (1) (3).
khử đệ quy trái trực tiếp ta đợc:
P:


E
E
E
T
T
T
F
F

TE
+TE

FT
*FT

id
(E)

- 18 -


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

áp dụng giải thuật xác định tập First cho các ký hiệu cha kết thúc ta có:
First ( x )
Id, (
*,
id, (

+,
id, (

x V
F
T
T
E
E

áp dụng giải thuật xác định tập Follow cho các ký hiệu cha kết thúc ta
có:
Follow ( x )
), $
), $
+,), $
+,), $
+,*,), $

x V
E
E
T
T
F

áp dụng giải thuật xây dựng bảng phân tích M ta có:
aT
xV
E


id

(

)

ETE

E+TE


T
FT

T
F

*

E
TE

E
T

+

TE
T


E E



E

T

*FT

F id

$

T T



F (E)

Sau khi xây dựng đợc Bảng Phân Tích ta tiến hành phân tích câu
lệnh nhập sau:
W = id * ( id + id ) xem câu lệnh nhập này có thuộc văn phạm P
hay không nghĩa là có đúng với cú pháp văn phạm hay không.
- Nạp chuỗi cần phân tích vào vùng đệm nhập.
- Khởi tạo Stack:
- 19 -



Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

+ Push ( $ ); (đáy Stack luôn chứa giá trị $)
+ Push ( E ); (E là ký hiệu xuất phát của văn phạm)
Stack
$E
$ET
$ETF
$ETid
$ET
$ETF*
$ETF
$ET)E(
$ET)E
$ET)ET
$ET)ETF
$ET)ETid
$ET)ET
$ET)E
$ET)ET+
$ET)ET
$ET)ETF
$ET)ETid
$ET)ET
$ET)E
$ET)
$ET
$E

$

Vùng Đệm Nhập (Buffer)
Id * ( id + id ) $
Id * ( id + id ) $
Id * ( id + id ) $
Id * ( id + id ) $
* ( id + id ) $
* ( id + id ) $
( id + id ) $
( id + id ) $
id + id ) $
id + id ) $
id + id ) $
id + id ) $
+ id ) $
+ id ) $
+ id ) $
id ) $
id ) $
id ) $
)$
)$
)$
$
$
$

Dẫn Xuất
E TE

T FT
F id
Reduce
T FT
Reduce
F (E)
Reduce
E TE
T FT
F id
Reduce
T
E+TE
Reduce
T FT
F id
Reduce
T
E
Reduce
T
E
Success

Từ bảng phân tích ta xây dựng đợc cây cú pháp nh sau:

Error: Reference source not found
Sơ Đồ Cây Cú Pháp

- 20 -



Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

3. Bộ Phân Tích Cú Pháp Thứ Tự Yếu
3.1.

Nguyên tắc phân tích:
Đây là dạng phân tích cú pháp từ dới lên. Xuất phát từ câu nhập, áp
dụng lần lợt các luật sinh để thu giảm câu nhập về ký hiệu xuất phát của
văn phạm có nghĩa là quá trình phân tích bắt đầu từ các nút lá của cây dẫn
xuất đi dần lên đến nút gốc (từ dới lên). Quá trình thu giảm đợc thực hiện
theo cách thức:
- Quét chuỗi nhập từ trái sang phải. Xác định chuỗi con trùng với vế
phải của tập một luật sinh.
- Thay chuỗi con tìm đợc bởi ký hiệu vế trái của luật sinh tơng ứng.
3.2. Mô Hình Hoạt Động:
Error: Reference source not found
Mô Hình Bộ Phân Tích Cú Pháp Thứ Tự Yếu
- Stack nhập (vùng đệm nhập): chứa chuỗi nhập, ký hiệu tận cùng là $.
- Stack trạng thái: chứa các ký hiệu văn phạm đáy stack là ký hiệu $
(khởi đấu stack trạng thái là rỗng chỉ chứa ký hiệu $).
- Tập luật sinh: chứa các luật sinh của văn phạm.
- Bảng phân tích: cho biết hành vi tơng ứng khi biết ký hiệu trên đỉnh
stack trạng thái và ký hiệu trên đỉnh stack nhập:
M [A, a] = action
Action có thể là Shift hoặc Reduce.
A: là ký hiệu trên đỉnh Stack trạng thái.

A V+T+ { $}
a: là ký hiệu nhập kế tiếp.
- Đơn vị điều khiển:
tuỳ thuộc ký hiệu trên đỉnh stack trạng thái A và ký hiệu trên đỉnh
stack nhập a mà đơn vị điều khiển quyết định hành vi Shift hay Reduce dựa
theo bảng phân tích M
M [A, a] = Shift : Đẩy a sang stack trạng thái. Có nghĩa là lấy a khỏi
stack nhập đa a sang stack trạng thái.
M [A, a] = Reduce: Xác định luật sinh có vế phải trùng dạng câu ở
phía đỉnhu Stack trạng thái. Thay dạng câu tơng ứng bởi ký hiệu vế trái của
luật sinh.
M [A, a] = {} (rỗng) Báo lỗi sai.
Hành vi Shift giúp hoàn chỉnh vế phải của một luật sinh.
Hành vi Reduce , khi một luật sinh đợc hoàn chỉnh thì thay vế phải bởi
vế trái.
Nếu đạt đến điều kiện stack trạng thái chỉ có một ký hiệu là ký hiệu
xuất phát của văn phạm và ký hiệu đáy stack nhập là $ thì quá trình phân
tích thành công có nghĩa là chuỗi nhập đúng với văn phạm của ngôn ngữ
hay câu lệnh nhập viết đúng cú pháp.
3.3. Xây dựng bảng phân tích :
3.3.1. Quan hệ thứ tự yếu:
Ta nói hai ký hiệu X, Y có quan hệ thứ tự yếu trong các trờng hợp sau
đây:
-X=Y
nếu Z aXYb.
-Xnếu Z aXAb và Y First(A)
- 21 -



Khoá luận tốt nghiệp đại học

-X>Y

nếu Z aABb

Nguyễn Thị Nha Trang

và A CX và B Yb

giả sử X là ký hiệu trên đỉnh stack trạng thái Y là ký hiệu trên đỉnh
stack nhập:
- X = Y có nghĩa là có tồn tại luật sinh có vế phải là aXYb và thực
hiện hành vi Shift Y sang stack trạng thái để hoàn chỉnh dần vế phải của
luật sinh.
- X < Y có nghĩa là có tồn tại luật sinh có vế phải là aXAb và thực
hiện hành vi Shift Y sang stack trạng thái để hoàn chỉnh dần vế phải của
luật sinh. ( X Y thực hiện hành vi Shift).
- X > Y có nghĩa là có tồn tại luật sinh có vế phải là aABb và lúc
này phía đỉnh stack trạng thái đã có đầy đủ vế phải của một luật sinh có ký
hiệu vế trái là A và lúc này thực hiện hành vi thu giảm ( Reduce ) về A.
3.3.2. Phơng pháp xác định quan hệ thứ tự yếu
áp dụng các luật sau đây cho đến khi xác định hết các quan hệ giữa các
ký hiệu:
a1:
a1.a:
a1.b:
a2:

$ S

XY

a3:
a3.a:
a3.b:

S >$

a4
a4.a:
a4.b:

(S là ký hiệu xuất phát của văn phạm).
nếu Z aXYb.
X Y
X Z1Z2Zn

=> X Z1

( S là ký hiệu xuất phát của văn phạm).
X Y
X Z1Z2Zn

=> Zn > Y

X > Y
Y Z1Z2Zn

=> X > Z1


X > Y
X Z1Z2Zn

=> Zn > Y

3.3.3. Giải thuật xây dựng Bảng Phân Tích M:
- khởi tạo bảng hai chiều M là rỗng.
- for (A V + T + { $} )
{
for ( a T + {$} )
{
if ( A a )
{
M [A, a] = M [A, a] + {$} ;
}
- 22 -


Khoá luận tốt nghiệp đại học

}

}

Nguyễn Thị Nha Trang

if ( A > a )
{
M [A, a] = M [A, a] + {Reduce} ;
}


Việc xác định dạng câu phía đỉnh stack trùng với vế phải của một luật
sinh (trong hành vi thu giảm) thờng rất phức tạp.
- trờng hợp có nhiều luật sinh có cùng vế phải thì không xác định đợc luật sinh sử dụng (trong hành vi thu giảm).
- trờng hợp phần tử trong Bảng phân tích chứa nhiều hành vi thì
không xác định đợc nên chọn hành vi nào.
Ví dụ:
Xây dựng bộ phân tích cú pháp cho văn phạm sau:
P:
A
E
E
T
T
F
F

id = E
E+T
T
T*F
F
id
(E)

áp dụng phơng pháp xác định quan hệ thứ tự yếu ta có:
a1.a:

$ A
a1.b:

id =
= E
E +
+ T
T *
* F
( E
E )
a2:
$ id.
= T , = F , = id , = (
+ F , + id , + (
* id , * (
( T , ( F , ( id , ( (
a3a:
A >$
- 23 -


Khoá luận tốt nghiệp đại học

- a3b:

Nguyễn Thị Nha Trang

T > +
F > *
T > )

a4b:


E > $ , T > $ , F > $ , id > $ , ) > $
F > + , id > + , ) > +
id > * , ) > *
F > ) , id > ) , ) > )
áp dụng giải thuật xây dựng bảng phân tích ta có Bảng Phân Tích sau:

Stacknhập
stack
trạng thái
A
E
T
F
Id
=
+
*
(
)
$

id

=

Shift

+


*

Shift
Reduce
Reduce
Reduce

(

Shift
Reduce
Reduce

Shift
Shift
Shift
Shift

)

$

Shift
Reduce
Reduce
Reduce

Success
Reduce
Reduce

Reduce
Reduce

Reduce

Reduce

Shift
Shift
Shift
Shift
Reduce

Reduce

Shift

sử dụng bảng phân tích ta phân tích chuỗi nhập sau: id = id * (id + id)
- Khởi tạo stack trạng thái với ký hiệu đầu tiên tại phần tử 0 là $.
- Nạp chuỗi nhập vào stack nhập với ký hiệu kết thúc là $.
Stack Trạng Thái
$
$id
$id=
$id=id
$id=F
$id=T
$id=T*
$id=T* (
$id=T* (id

$id=T* (F
$id=T* (T
$id=T* (E
$id=T* (E+
$id=T* (E+id
$id=T* (E+F
$id=T* (E+T
$id=T* (E

Stack Nhập
id = id * ( id + id ) $
= id * ( id + id ) $
id * ( id + id ) $
* ( id + id ) $
* ( id + id ) $
* ( id + id ) $
( id + id ) $
id + id ) $
+ id ) $
+ id ) $
+ id ) $
+ id ) $
id ) $
)$
)$
)$
)$

- 24 -


Hành Vi (action)
Shift
Shift
Shift
Reduce
Reduce
Shift
Shift
Shift
Reduce
Reduce
Reduce
Shift
Shift
Reduce
Reduce
Reduce
Shift

Dẫn Xuất

F id
T F

F id
T F
E T
F id
T F
E E+T



Khoá luận tốt nghiệp đại học
$id=T* (E)
$id=T*F
$id=T
$id=E
$A

Nguyễn Thị Nha Trang

$
$
$
$
$

Reduce
Reduce
Reduce
Reduce
Success

Từ Bảng Phân Tích Ta có cây cú pháp nh sau:
Error: Reference source not found
Sơ Đồ Cây Cú Pháp

- 25 -

F

T
E
A

(E)
T* F
T
id = E


Khoá luận tốt nghiệp đại học

Nguyễn Thị Nha Trang

4. Bộ Phân Tích Cú Pháp LR
Hai chơng trớc chúng ta đã tìm hiểu quá trình xử lý của hai bộ phân
tích cú pháp là bộ phân tích cú pháp đoán nhận trớc không đệ quy và bộ
phân tích cú pháp thứ tự yếu và mỗi bộ đều có những điểm yếu ví dụ nh bộ
phân tích cú pháp đoán nhận trớc không đệ quy chỉ thích hợp với loại văn
phạm nhỏ, ít đệ quy, nếu đệ quy nhiều lần thì ta phải khử đệ quy rất phức
tạp. ở bộ phân tích cú pháp thứ tự yếu thì nếu trong một ô phân tích chứa
nhiều hành động thì ta không biết nên chọn hành động nào Trong chơng
này chúng ta sẽ tìm hiểu một bộ phân tích hiệu quả hơn và đây cũng là bộ
phân tích cú pháp đợc sử dụng để xây dựng chơng trình.
4.1. Nguyên tắc phân tích:
Tơng tự Bộ Phân Tích Cú Pháp Thứ Tự Yếu. Đây là dạng phân tích cú
pháp từ dới lên. Xuất phát từ câu nhập, áp dụng lần lợt các luật sinh để thu
giảm câu nhập về ký hiệu xuất phát của văn phạm có nghĩa là quá trình
phân tích bắt đầu từ các nút lá của cây dẫn xuất đi dần lên đến nút gốc (từ
dới lên). Quá trình thu giảm đợc thực hiện theo cách thức:

- Quét chuỗi nhập từ trái sang phải. Xác định chuỗi con trùng với vế
phải của tập một luật sinh.
- Thay chuỗi con tìm đợc bởi ký hiệu vế trái của luật sinh tơng ứng.
4.2.

Mô Hình Hoạt Động :
Stack trạng thái

Stack nhập(đệm nhập)

Đơn vị điều khiển Bộ
Phân Tích Cú Pháp
LR

Tập
Luật
Sinh

Bảng Phân Tích

Mô Hình Bộ Phân Tích Cú Pháp LR
- Stack nhập (vùng đệm nhập): Chứa chuỗi nhập, ký hiệu tận cùng là $.
- Stack trạng thái: Chứa các ký hiệu văn phạm và ký hiệu trạng thái.
Stack trạng thái chứa ký hiệu khởi đầu là mã trạng thái 0.
S0 X1

S1 X2

S2 Xn Sn


Trạng thái khởi đầu ( 0 ).

Đỉnh của stack (Top of stack).

So - Trạng thái khởi đầu ( zero ).
Si - Ký hiệu trạng thái.
Xi - Ký hiệu văn phạm.
ở đỉnh stack luôn luôn là ký hiệu trạng thái.
- 26 -


×