Professional Documents
Culture Documents
Thực hiện:
Lê Nguyên Dũng
Email:
dungcoivb@gmail.com
Dù đã có nhiều cố gắng, nhưng đề tài này không tránh được nhiều thiếu xót, tôi mong nhận
được sự phê bình và góp ý của quý thầy cô.
Trang 1
Mục lục
Chương 1: Kiến trúc hệ thống web server ............................................................................................ 3
1.1 Các thành phần......................................................................................................................... 3
1.2 Tương tác giữa PedaServer và hệ thống thực ............................................................................ 3
1.3 Tương tác giữa nội bộ giữa các thành phần ............................................................................... 4
Chương 2: Server Core - Quản lý tương tác kết nối............................................................................. 7
2.1 Kết nối client-server ................................................................................................................. 7
2.2 Giao thức HTTP....................................................................................................................... 7
2.3 Tùy chọn cổng làm việc của server ........................................................................................... 9
2.4 Bảng ánh xạ URL..................................................................................................................... 9
2.5 Bảng phân quyền.................................................................................................................... 10
Chương 3: Minimum Scripting - Ngôn ngữ kịch bản xử lý tại server ............................................... 12
3.1 Các thao tác xây dựng ngôn ngữ lập trình ............................................................................... 12
3.2 Đặc tả cú pháp ngôn ngữ lập trình .......................................................................................... 13
3.3 Phân tích cấu trúc ngôn ngữ ................................................................................................... 15
3.4 Kiến trúc máy ảo .................................................................................................................... 22
Chương 4: Thành phần plugin ............................................................................................................ 28
4.1 Giới thiệu............................................................................................................................... 28
4.2 Quản lý plugin ....................................................................................................................... 28
Chương 5: Ứng dụng minh họa........................................................................................................... 30
5.1 Giới thiệu............................................................................................................................... 30
5.2 Mô hình ................................................................................................................................. 30
5.3 Minh họa................................................................................................................................ 32
Chương 6: Kết luận ............................................................................................................................. 34
6.1 Ưu điểm................................................................................................................................. 34
6.2 Khuyết điểm .......................................................................................................................... 34
6.3 Hướng phát triển .................................................................................................................... 34
Chương 7: Phụ lục ............................................................................................................................... 35
7.1 Các thuật ngữ sử dụng ............................................................................................................ 35
7.2 Đặc tả cấu trúc ngôn ngữ Minimum Scripting......................................................................... 35
7.3 Các opcode của máy ảo .......................................................................................................... 39
Tài liệu tham khảo ............................................................................................................................... 41
Trang 2
Chương 1: Kiến trúc hệ thống web server
1.1 Các thành phần
- Web server được xây dựng từ các thành phần chính như sau:
o Server Core: Phần tương tác kết nối, quản lý các kết nối, truyền nhận giữa server và
các client.
o Minimum Scripting Engine: Phần xử lý ngôn ngữ kịch bản tại server. Đây là một
ngôn ngữ lập trình mới được xây dựng cho PedaServer, cú pháp của Minimum
Scripting dễ học, dễ viết, tuy nhiên chỉ nằm ở mức cơ bản.
o SQLite: Phần xử lý tương tác với cơ sở dữ liệu. SQLite là một hệ quản trị cơ sở dữ
liệu tương tự MySQL hay SQL Server hay Oracle… tuy nhiên nhỏ gọn và chức năng
hạn chế hơn nhiều. Tuy nhiên với nhu cầu của một web server nhỏ, không cần quá
nhiều xử lý về mặt cơ sở dữ liệu thì SQLite là đủ đáp ứng nhu cầu.
o Plugin: Nền tảng bổ sung chức năng. Thành phần này là mã thực thi thuần độc lập
với nền tảng PedaServer hiện tại, thành phần này không thuộc server core mà chỉ là
một module ở ngoài độc lập hoàn toàn. Server core chỉ gọi lên khi khởi động và gọi
hàm nhất định khi request tới có chứa cấu trúc là module này yêu cầu. Server core có
quyền quyết định thành phần này có làm được gọi hay không, còn sau khi đã được
gọi thì thành phần này làm việc với quyền ngang bằng server core.
Trang 3
Server Files/Folder
PedaServer
Server core
Trang 4
o Yêu cầu một chức năng nhúng: Server Core sẽ chuyển yêu cầu này đến plugin xử
lý với module tương ứng. Server Core ghi nhận kết quả trả về và trả về client.
- Tương tác giữa SQLite và Scripting Engine: Với mỗi thao tác tương tác từ Scripting
Engine gọi hàm của SQLite sẽ phải thông qua việc kiểm duyệt của bảng phân quyền
thuộc Server Core. Trong thực thế xây dựng thì Scripting Engine sẽ không gọi trực tiếp
hàm tương tác mà thay vào đó nó sẽ gọi hàm thuộc một lớp mang tên PedaSQL, lớp này
kiểm tra tương tác đó đến từ scripting thuộc thư mục nào và đối chiếu với bảng phân
quyền để xem scripting đó có quyền tương tác với SQLite hay không, nếu có thì lớp này
sẽ tiến hành truy vấn tới SQLite.
Trang 5
Client
Server core
SecurityTable
Parameter
Result Result
Trang 6
Chương 2: Server Core - Quản lý tương tác kết nối
2.1 Kết nối client-server
- Khi khởi động, phần mềm web server trên máy server sẽ là một tiến trình. Tiến trình này
lắng nghe tại một cổng, khi có yêu cầu kết nối (Từ client), tiến trình web server sẽ quyết
định có kết nối hay không, nếu có thì tiến hành tạo một thread mới với một socket tương
ứng với kết nối.
- Một server quản lý cùng lúc nhiều kết nối với các máy client. Mọi quá trình làm việc như
nhận, gửi dữ liệu giữa server với máy trạm sẽ sử dụng socket tương ứng đang kết nối
giữa 2 máy.
Process
Thread 1
Thread 2
Thread 3
Thread 4
Client Server
Trang 7
Process
Request Thread i
Response
Client Server
Hình: Truyền nhận dữ liệu giữa client-server theo giao thức HTTP
- Ví dụ:
Gói tin Request GET khi truy cập vào địa chỉ http://fit.hcmup.edu.vn bằng FireFox
GET / HTTP/1.1
Host: fit.hcmup.edu.vn
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=
0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
If-Modified-Since: Mon, 06 Sep 2010 03:23:50 GMT
If-None-Match: "774c7-8f-48f8ecf20bd80"-gzip
Cache-Control: max-age=0
Trang 8
o Dữ liệu thực sự: Trang HTML.
- Ví dụ:
Gói tin tin Response khi truy cập vào địa chỉ http://fit.hcmup.edu.vn bằng FireFox
HTTP/1.1 200 OK
Date: Wed, 02 Mar 2011 11:42:36 GMT
Server: Apache/2.2.13 (Win32) mod_ssl/2.2.13 OpenSSL/0.9.8k
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: lang=deleted; expires=Tue, 02-Mar-2010 11:42:35
GMT; path=/
Set-Cookie: jfcookie=deleted; expires=Tue, 02-Mar-2010
11:42:35 GMT; path=/
Set-Cookie: jfcookie[lang]=deleted; expires=Tue, 02-Mar-2010
11:42:35 GMT; path=/
Set-Cookie: portal_site=61; expires=Wed, 02-Mar-2011 21:42:36
GMT
Content-Encoding: gzip
X-Content-Encoded-By: Joomla! 1.5
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Last-Modified: Wed, 02 Mar 2011 11:42:36 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-
check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=97
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
<title>Khoa Công Nghệ Thông Tin-Trường ĐHSP TP.HCM</title>
<frameset>
<frame src="http://portal.hcmup.edu.vn/?site=61">
</frameset>
Trang 9
- Ánh xạ URL là việc khi server nhận được request một URL nào đó và nếu nó thuộc
nguồn của một ánh xạ thì sẽ được chuyển đến (Redirect) tới một URL đích.
- Nền tảng PedaServer hỗ trợ chức năng ánh xạ URL qua một địa chỉ khác cùng tên miền
mà PedaServer đang sử dụng. Để cấu hình chức năng này người dùng cần cấu hình trong
tập tin config.xml.
/add /sample/site/index.min
/sql /sample/sql.min
Trang 10
Hình: Phân quyền được duyệt thư mục
Trang 11
Chương 3: Minimum Scripting - Ngôn ngữ kịch bản
xử lý tại server
3.1 Các thao tác xây dựng ngôn ngữ lập trình
- Phân tích từ vựng của ngôn ngữ.
- Phân tích cú pháp: Từ các bộ từ vựng ở bước trên và cú pháp ta khai báo bằng ngôn ngữ
đặc tả chúng ta sẽ phân tích được ngữ nghĩa của đoạn mã đầu vào. Kết quả trả về sẽ là
một cây ngữ nghĩa, với mỗi nút tương ứng với một cú pháp nào đó mà chúng ta đã xây
dựng.
- Phân tích ngữ nghĩa: Từ cây cú pháp đã có, chúng ta tiến hành kiểm tra tính logic của
cây.
- Biên/Thông dịch: Dựa vào cái cây ở trên mà biên dịch hoặc thông dịch ra dạng mã trung
gian.
- Trình nạp: Đưa lên dữ liệu sau khi biên/thông dịch lên bộ nhớ thực theo cấu trúc quy ước
từ trước của máy ảo.
- Thực thi: Bước thực thi vùng mã sau khi đã tiến hành bước bộ nạp.
Mã đầu vào
Phân tích
ngữ pháp Phân tích từ vựng
Thông dịch
Máy ảo
Bộ nạp lên bộ nhớ
Trang 12
- Để đơn giản hóa quá trình xây dựng ngôn ngữ lập trình, tôi sử dụng một số công cụ trong
một số công đoạn xây dựng ngôn ngữ lập trình:
o flex: Lexical Analysis + Tokens.
o Bison: Syntactic Analysis
Ký tự
Bộ chữ *
Bộ tên +
( Biểu thức ) ?
Trang 13
“…” Đưa vào một giá trị chuỗi “string” string
Tên kiểu
Tên luật Dòng mới : Dòng mới
Tên luật
;
| Dòng mới
Dòng mới
- Cú pháp ngôn ngữ được viết bằng nhiều luật khác nhau. Có thể coi cú pháp của một ngôn
ngữ là một cây, trên cây đó luôn có một nút đỉnh, mỗi luật hay Kiểu dữ liệu là một nút
trên cây.
- Mỗi luật có thể có nhiều cách thể hiện khác nhau, tuy nhiên phải đảm bảo không trùng
lặp và sai logic trong cây.
- Mỗi luật có thể cấu thành từ nhiều luật khác, thậm chí là chính nó (Đệ qui).
- Ví dụ :
o Luật để thực hiện các phép toán cơ bản với số nguyên:
add_expression
: add_expression “+” mul_expression
| add_expression “-“ mul_expression
| mul_expression
;
mul_expression
: mul_expression “*” INTEGER
| mul_expression “/” INTEGER
Trang 14
| mul_expression “%” INTEGER
| INTEGER
;
o Đặc tả IF then
optional_else_statement
: “else” statement
|
;
if_statement
: “if” “(“ expression “)” statement optional_else_statement
;
o Đặc tả FOR
for_statement
: “for” “(“ expression “;” expression “;” expression “)” statement
;
Trang 15
print “print” Đây là ví dụ
Trang 16
- Ví dụ:
o Đặc tả:
Kiểu dữ liệu:
LETTER [a-zA-Z_]
INTEGER {DIGIT}+
Luật:
add_exp
: add_exp “+” mul_exp
| add_exp “-“ mul_exp
| mul_exp
;
mul_exp
: mul_exp “*” INTEGER
| mul_exp “/” INTEGER
| mul_exp “%” INTEGER
| INTEGER
;
o Đoạn mã:
3+4*5
add_exp
+
add_exp mul_exp
INTEGER INTEGER 5
3 4
Trang 17
STRING \"[^\"]*\"
Luật:
add_exp
: add_exp “+” mul_exp
| add_exp “-“ mul_exp
| mul_exp
;
mul_exp
: mul_exp “*” val_exp
| mul_exp “/” val_exp
| mul_exp “%” val_exp
| val_exp
;
val_exp
: STRING
| INTEGER
;
o Đoạn mã:
3+4*”wrong”
o Phân tích ngữ nghĩa:
Cú pháp không có gì sai tuy nhiên về mặt ngữ nghĩa, một chuỗi
(STRING) không thể thực hiện phép tính (mul_exp hay add_exp)
với một số nguyên (INTEGER).
Chúng ta có thể quan sát cây ngữ cú pháp để nhận ra điều trên.
add_exp
+
add_exp mul_exp
3 4
Trang 18
3.3.3 Quản lý bảng ký hiệu
- Phần này sử dụng từ định danh để nói đến các tên biến.
- Một nhiệm vụ quan trọng của trình biên dịch là ghi lại các định danh được sử dụng trong
chương trình nguồn và thu thập các thông tin về các thuộc tính khác nhau của mỗi định
danh. Những thuộc tính này có thể cung cấp thông tin về vị trí lưu trữ được cấp phát cho
một định danh, kiểu và tầm vực của định danh, và nếu định danh là tên của một thủ tục
thì thuộc tính là các thông tin về số lượng và kiểu của các đối số, phương pháp truyền đối
số và kiểu trả về của thủ tục nếu có.
- Bảng ký hiệu (Symbol table) là một cấu trúc dữ liệu mà mỗi phần tử là một mẩu tin dùng
để lưu trữ một định danh, bao gồm các trường lưu giữ ký hiệu và các thuộc tính của nó.
Cấu trúc này cho phép tìm kiếm, truy xuất tên định danh một cách nhanh chóng.
- Trong quá trình phân tích từ vựng, danh biểu được tìm thấy và nó được đưa vào bảng ký
hiệu nhưng nói chung các thuộc tính của nó có thể chưa xác định được trong giai đoạn
này.
- Ví dụ:
o Đoạn mã:
strTest = "1234";
intTest = 1234;
if (strTest == intTest)
{
print "Hello !”;
}
else
print “Oh my code :( !”;
o Bảng định danh sau bước phân tích cú pháp:
Bảng ký hiệu Kiểu
strTest Chưa rõ
intTest Chưa rõ
“1234” STRING
1234 INTEGER
“Hello !” STRING
“Oh my code :( !” STRING
- Rõ ràng thuộc tính kiểu của 2 biến strTest và intTest chưa thể xác định khi các định
danh được xác định và đưa vào bảng ký hiệu. Các giai đoạn sau đó như phân tích ngữ
nghĩa và thông dịch mới đưa thêm các thông tin này vào và sử dụng chúng. Nói
chung giai đoạn thông tin thường đưa các thông tin chi tiết về vị trí lưu trữ dành cho
định danh và sẽ sử dụng chúng khi cần thiết.
o 2 nhánh của cây cú pháp:
Trang 19
assign_exp
IDENT STR
STR
strTest “1234”
assign_exp
IDENT INTEGER
INTEGER
strTest 1234
- Từ bước phân tích ngữ nghĩa ta có thể nhận ra thuộc tính của định danh.
Bảng ký hiệu Kiểu
strTest STRING
intTest INTEGER
- Một số thuộc tính, giá trị chỉ xuất hiện trong quá trình thực thi mã.
Trang 20
strTest = "1234";
intTest = 1234;
if (strTest == intTest)
{
print "Hello !”;
}
else
print “Oh my code :( !”;
o Cây ngữ pháp (Có giản lượt cho gọn):
program
= = if_statement
== print print
o Bảng ký hiệu:
Con trỏ Giá trị Kiểu
1. strTest
2. “1234” STRING
3. intTest
4. 1234 INTEGER
5. “Hello !” STRING
6. “Oh my code :( !” STRING
o Mã kết quả thông dịch:
IP Opcode Giá trị
1. OP_PUSH 2
2. OP_GETTOP 1
3. OP_PUSH 4
4. OP_GETTOP 3
5. OP_PUSH 1
Trang 21
6. OP_PUSH 3
7. OP_EQUAL
8. OP_JMPF
9. OP_PUSH 5
10. OP_PRINT
11. OP_JMP 14
12. OP_PUSH 6
13. OP_PRINT
14. OP_NOP
3.4 Kiến trúc máy ảo
3.4.2 Các thành phần của máy ảo
Push Pop
Trang 22
STRING Kiểu chuỗi
ARRAY Kiểu mảng
SQL Kiểu biến SQL mang con trỏ kết nối hiện tại
SQL_RET Kiểu biến SQL trả về sau khi truy vấn
SQL_ARRAY Kiểu biến SQL lấy cụ thể mảng giá trị sau truy vấn
1 Giá trị 1
Con trỏ ảo
- Các thao tác với giá trị đều thông qua các con trỏ ảo trong bảng ký hiệu.
Trang 23
o Quá trình thực thi mã: Tương tác với ngăn xếp và bảng ký hiệu
o Ví dụ:
o Đoạn mã:
intTest = 12+34;
arrStr["One"] = 56;
Trang 24
Opcode1
Opcode2 Opcode
Giá trị
Opcode3
OP_PUSH 1
1 INT 3
OP_PUSH 2
2 INT 5
OP_ADD
o Thực thi:
1 INT 3
1 OP_PUSH(1) Push(1)
1 INT 3
2 2 INT 5 OP_PUSH(2) Push(2)
i = Pop()
k INT 8 j = Pop()
3 OP_ADD val(k) = val(i) + val(j)
//Lấy giá trị biến từ con trỏ
Push(k)
o Ví dụ 2:
o Đoạn mã:
strTest = "1234";
intTest = 1234;
Trang 25
if (getnumber(strTest) == intTest)
{
print "Hello !”;
}
else
print “Oh my code :( !”;
o Bảng ký hiệu:
Con trỏ Giá trị Kiểu
1. strTest
2. “1234” STRING
3. intTest
4. 1234 INTEGER
5. “Hello !” STRING
6. “Oh my code :( !” STRING
Trang 26
Bảng ký hiệu
Con
STT IP Stack Định Opcode
trỏ Kiểu Giá trị Thao tác
danh
ảo
1 1 OP_PUSH (2) Push(2)
OP_GETTOP (1) i = Pop()
2 2 2
val(1) = val(i)
3 3 1 strTest STRING “1234” OP_PUSH (4) Push(4)
i = Pop()
4 4 4 OP_GETTOP (3)
val(3) = val(i)
5 5 3 intTest INTEGER 1234 OP_PUSH (1) Push(1)
i = Pop()
n = New()
6 6 1 OP_GETNUM
val(n) = number(val(i))
Push(n)
7 7 7 7 const01 INTEGER 1234 OP_PUSH (3) Push (3)
i = Pop()
j = Pop()
3 if (val(i) == val(j)
8 8 OP_EQUAL
7 Push (1)
else
Push (-1)
9 9 1 OP_JMPF (12)
10 10 OP_PUSH (5) Push (5)
i = Pop()
11 11 5 OP_PRINT
Print val(i)
12 12 OP_JMP (14)
13 14 OP_NOP
o Kết quả xuất ra:
Hello !
Trang 27
Chương 4: Thành phần plugin
4.1 Giới thiệu
- Plugin là thành phần nhúng bổ sung chức năng cho ứng dụng ban đầu.
- Ở PedaServer, cho phép sử dụng các plugin để bổ sung thêm tính năng xử lý ở các URL
quy định từ phía người quản trị.
- Mỗi plugin là một thành phần hoàn toàn riêng biệt lẫn nhau và lẫn server core. Các plugin
chỉ liên kết với server core bằng các hàm gọi. Plugin được khởi động khi server khởi
động, kết thúc phiên làm việc khi server dừng làm việc.
- Một plugin của PedaServer là một Thư viện liên kết động (Các tập tin có đuôi .dll) gồm
có 3 hàm:
o Init: Khởi tạo dữ liệu ban đầu.
o RunIt: Với mỗi truy vấn tới, hàm này sẽ được gọi để xử lý sau đó trả về giá trị
tương ứng với truy vấn đó.
o Clean: Giải phóng bộ nhớ.
- Server Core sẽ quản lý các plugin bằng một danh sách chứa con trỏ điều khiển các
plugin. Khi PedaServer khởi động, chương trình sẽ tìm kiếm tất cả các plugin trong bảng
cấu hình sau đó sẽ đưa lần lượt từng module này lên bộ nhớ và gọi hàm Init để khởi tạo
một phiên làm việc cho từng plugin.
- Khi một request từ tới server, server core sẽ kiểm tra xem trong danh sách các plugin có
đối tượng nào cần sử dụng URL request hay không, nếu có thì sẽ trả về plugin tương ứng.
Việc làm này tương tự với việc ánh xạ URL.
/add Add
/dic Dictionary
t
Tập URL Tập plugin
l l
Hình: Ánh xạ URL vào plugin
Trang 28
Client
Result
Trang 29
Chương 5: Ứng dụng minh họa
5.1 Giới thiệu
- Ứng dụng từ điển online: PedaDict.
- Nền tảng sử dụng: Plugin – PedaServer.
- Chức năng: Từ điển Anh-Việt, Việt-Anh nhỏ gọn và linh hoạt.
- Cơ sở dữ liệu nền tảng: Là cơ sở dữ liệu từ điển được chia sẻ tại
http://www.tudientiengviet.net . Tuy nhiên cấu trúc có thay đổi để có thể sử dụng băm để
cải thiện tốc độ tra từ.
- Ứng dụng:
o Khai triển tại máy cá nhân: Do ứng dụng đòi hỏi cấu hình rất thấp nên có thể dễ dàng
cài đặt trên máy tính cá nhân.
o Dùng trong mạng nội bộ: Do thế mạnh là giao diện trên nền web nên các máy khác
cùng mạng có thể dễ dàng truy cập và sử dụng từ điển này khi có một máy bất kỳ
trong mạng có cài đặt ứng dụng.
o Từ điển online: Chỉ cần một máy chủ có kết nối Internet và cấu hình có thể khai triển
ứng dụng thành một từ điển online dễ dàng.
5.2 Mô hình
- Ứng dụng gồm 2 phần:
o Phần client: Giao diện tương tác và truy vấn lên server. Phần client sử dụng Ajax
trong các thao các tra từ.
o Phần server: Module Dict được viết thành một class với 3 hàm cơ bản để Server
Core gọi:
Init: Khởi tạo module. Kiểm tra xem các tập tin dữ liệu từ điển có tồn tại,
đúng cấu trúc không. Nếu đúng sẽ mở cơ sở dữ liệu từ điển và đưa lên một
struct khai báo sẵn.
RunIt: Gọi khi request tới. Xử lý request, tra từ trên struct đã lưu trữ trên
bộ nhớ. Nếu có sẽ trả về kết quả là nghĩa của từ.
~Dict: Hủy lớp. Giải phóng bộ nhớ các struct đã lưu trữ.
- Trong Server Core có viết thêm vài lệnh để khi truy vấn có dạng /q=… thì request sẽ gọi
hàm RunIt từ module Dict và truyền vào truy vấn. Sau đó Dict sẽ trả về kết quả cho
Server Core để response cho client.
- Trong tập tin config.xml có thêm một số dòng để cấu hình:
Cấu hình quyền truy cập vào thư mục chứa PedaDict
<permission path="/Dict">
<access>true</access>
<directory>true</directory>
<scripting>false</scripting>
<sql>false</sql>
</permission>
Trang 30
</mapping>
Trang 31
5.3 Minh họa
Gợi ý
Nghĩa
Trang 32
Hình: Tính năng Select&See
Trang 33
Chương 6: Kết luận
6.1 Ưu điểm
- Nhỏ gọn, hoạt động tiết kiệm tài nguyên hệ thống.
- Cơ chế phân quyền theo thư mục giúp đảm mức độ bảo mật cho hệ thống.
- Scripting Engine với máy ảo giúp cơ chế làm việc an toàn và hiệu quả.
- Plugin giúp dễ dàng phát triển ứng dụng web service với tốc độ xử lý nhanh và tối ưu bộ
nhớ mà không tốn nhiều tài nguyên hệ thống.
- Cấu hình dễ dàng với tập tin config.xml.
- Hoạt động ổn định (Trừ Scripting Engine đôi lúc còn lỗi).
Trang 34
Chương 7: Phụ lục
7.1 Các thuật ngữ sử dụng
LETTER [a-zA-Z_]
DIGIT [0-9]
IDENT {LETTER}({LETTER}|{DIGIT})*
STR \"[^\"]*\"
INTEGER {DIGIT}{DIGIT}*
Trang 35
FLOAT {DIGIT}+\.{DIGIT}*
WSPACE [ \t]+
Trang 36
. {return ERROR_TOKEN;}
program
: statement_list {tree = $1;}
;
statement_list
: statement_list statement {$$ = new TreeNode (STMT_LIST, $1, $2);}
| /* empty */ {$$ = new TreeNode (EMPTY_STMT);}
;
statement
: END_STMT {$$ = new TreeNode (EMPTY_STMT);}
| expression END_STMT {$$ = new TreeNode (EXPR_STMT, $1);}
| PRINT expression END_STMT {$$ = new TreeNode (PRINT_STMT, $2);}
| INPUT identifier END_STMT
{$$ = new TreeNode (INPUT_STMT); $$->symbol = $2;}
| if_statement {$$ = $1;}
| while_statement {$$ = $1;}
| for_statement {$$ = $1;}
| procedure_expression {$$ = $1;}
| compound_statement {$$ = $1;}
| error END_STMT {$$ = new TreeNode (ERROR_STMT);}
;
if_statement
: IF OPEN_PAR expression CLOSE_PAR statement optional_else_statement
{
if ($6 != NULL)
$$ = new TreeNode (IFTHENELSE_STMT, $3, $5, $6);
else
$$ = new TreeNode (IFTHEN_STMT, $3, $5);
}
;
optional_else_statement
: ELSE statement {$$ = $2;}
| /* empty */ {$$ = NULL;}
;
while_statement
: WHILE OPEN_PAR expression CLOSE_PAR statement
{$$ = new TreeNode (WHILE_STMT, $3, $5);}
;
for_statement
: FOR OPEN_PAR expression END_STMT expression END_STMT expression CLOSE_PAR statement
{$$ = new TreeNode (FOR_STMT, $3, $5, $7, $9);}
;
compound_statement
: BEGIN_CS statement_list END_CS
{$$ = $2;}
;
expression
: equal_expression {$$ = $1;}
Trang 37
| declaration {$$ = $1;}
;
equal_expression
: expression EQUAL assign_expression
{$$ = new TreeNode (COND_EQUAL, $1, $3);}
| expression L_OP assign_expression
{$$ = new TreeNode (COND_L, $1, $3);}
| expression G_OP assign_expression
{$$ = new TreeNode (COND_G, $1, $3);}
| expression LE_OP assign_expression
{$$ = new TreeNode (COND_LE, $1, $3);}
| expression GE_OP assign_expression
{$$ = new TreeNode (COND_GE, $1, $3);}
| expression NOT_EQUAL assign_expression
{$$ = new TreeNode (COND_NOT_EQUAL, $1, $3);}
| assign_expression
{$$ = $1;}
;
assign_expression
: identifier ASSIGN assign_expression
{$$ = new TreeNode (ASSIGN_EXPR, $3); $$->symbol = $1;}
| identifier OPEN_ARRAY value_expression CLOSE_ARRAY ASSIGN assign_expression
{$$ = new TreeNode (ASSIGN_ARRAY, $3, $6); $$->symbol = $1;}
| add_expression
{$$ = $1;}
;
declaration
: TYPE_INTEGER identifier
{$$ = new TreeNode (DECL_TYPE_INTEGER); $$->symbol = $2;}
| TYPE_FLOAT identifier
{$$ = new TreeNode (DECL_TYPE_FLOAT); $$->symbol = $2;}
| TYPE_STRING identifier
{$$ = new TreeNode (DECL_TYPE_STRING); $$->symbol = $2;}
;
constant_expression
: integer
{$$ = new TreeNode (INT_EXPR); $$->symbol = $1;}
| float
{$$ = new TreeNode (FLOAT_EXPR); $$->symbol = $1;}
| string
{$$ = new TreeNode (STR_EXPR); $$->symbol = $1;}
;
add_expression
: add_expression ADD mul_expression
{$$ = new TreeNode (OPERATION_ADD, $1, $3);}
| add_expression SUB mul_expression
{$$ = new TreeNode (OPERATION_SUB, $1, $3);}
| mul_expression
{$$ = $1;}
;
mul_expression
: mul_expression MUL value_expression
{$$ = new TreeNode (OPERATION_MUL, $1, $3);}
| mul_expression DIV value_expression
{$$ = new TreeNode (OPERATION_DIV, $1, $3);}
Trang 38
| mul_expression MOD value_expression
{$$ = new TreeNode (OPERATION_MOD, $1, $3);}
| value_expression
{$$ = $1;}
;
value_expression
: identifier
{$$ = new TreeNode (IDENT_EXPR); $$->symbol = $1;}
| identifier OPEN_ARRAY value_expression CLOSE_ARRAY
{$$ = new TreeNode (ARRAY_EXPR, $3); $$->symbol = $1;}
| constant_expression
{$$ = new TreeNode (CONST_EXPR); $$ = $1;}
| OPEN_PAR add_expression CLOSE_PAR
{$$ = $2;}
| function_expression
{$$ = $1;}
;
function_expression
: FUNC_RANDOM OPEN_PAR CLOSE_PAR
{$$ = new TreeNode (FUNC_RANDOM_STMT);}
| FUNC_GET OPEN_PAR add_expression CLOSE_PAR
{$$ = new TreeNode (FUNC_GET_STMT, $3);}
| FUNC_STRING OPEN_PAR add_expression CLOSE_PAR
{$$ = new TreeNode (FUNC_STRING_STMT, $3);}
| FUNC_NUMBER OPEN_PAR add_expression CLOSE_PAR
{$$ = new TreeNode (FUNC_NUMBER_STMT, $3);}
| IS_NULL OPEN_PAR identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_IS_NULL_STMT); $$->symbol = $3;}
| FUNC_SQL_CONNECT OPEN_PAR add_expression COMMA add_expression CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_CONNECT_STMT, $3, $5);}
| FUNC_SQL_CREATE_DB OPEN_PAR add_expression COMMA identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_CREATE_DB_STMT, $3); $$->symbol = $5;}
| FUNC_SQL_FETCH_ARRAY OPEN_PAR identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_FETCH_ARRAY_STMT); $$->symbol = $3;}
| FUNC_SQL_QUERY OPEN_PAR add_expression COMMA identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_QUERY_STMT, $3); $$->symbol = $5;}
;
procedure_expression
: FUNC_SQL_SELECT_DB OPEN_PAR add_expression COMMA identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_SELECT_DB_STMT, $3); $$->symbol = $5;}
| FUNC_SQL_CLOSE OPEN_PAR identifier CLOSE_PAR
{$$ = new TreeNode (FUNC_SQL_CLOSE_STMT); $$->symbol = $3;}
;
Trang 39
OP_COND_EQUAL, So sánh bằng
OP_COND_NOT_EQUAL So sánh không bằng
OP_COND_L So sánh nhỏ hơn
OP_COND_G So sánh lớn hơn
OP_COND_LE So sánh nhỏ hơn hoặc bằng
OP_COND_GE So sánh lớn hơn hoặc bằng
OP_ADD Thực hiện phép tính cộng
OP_SUB Thực hiện phép tính trừ
OP_MUL Thực hiện phép tính nhân
OP_DIV Thực hiện phép tính chia
OP_MOD Thực hiện phép tính lấy dư
OP_GET Lấy giá trị truyền vào qua URL (Thao tác Get)
OP_STR Đưa giá trị về kiểu chuỗi
OP_NUM Đưa giá trị về kiểu số
OP_GETTOP_ARR Đưa giá trị vào một phần tử trong bảng
OP_SQL_CONNECT Kết nối với SQL
OP_SQL_CREATE_DB Tạo một cơ sở dữ liệu mới
OP_SQL_SELECT_DB Chọn cơ sở dữ liệu để thao tác
OP_SQL_QUERY Thực hiện truy vấn
OP_SQL_FETCH_ARRAY Truy cập đến bộ phần tử trong mảng
OP_SQL_CLOSE Đóng kết nối SQL
OP_IS_NULL Kiểm tra biến có là rỗng không
OP_RAND Tạo giá trị ngẫu nhiên
JUMPTARGET Khai báo địa chỉ để nhảy tới (Thực ra chỉ là một OP_NOP)
Trang 40
Tài liệu tham khảo
1. Jan Niestadt. Implementing A Scripting Engine. 1999.
2. Sekio. SupraWWW. 2007.
3. D. Richard Hipp. SQLite. 2011.
4. Lee Thomason. TinyXML. 2010.
5. W3Schools. PHP MySQL Introduction. 2011.
6. Devin Cook. GOLD Meta-Language Overview. 2011
7. Wikipedia.com.
8. Thạc sĩ Lê Ngọc Sơn, Đại học Công nghiệp TP. Hồ Chí Minh. Giáo trình trình biên dịch.
Trang 41