Chương 3: Các công cụ hỗ trợ xây dựng chương trình dịch bộ sinh trình phân tích từ vựng FLEX, bộ sinh trình phân tích cú pháp BISON.. Việc phân cấp ngôn ngữ lập trình được dựa trên cơ s
Trang 1Nghiên cứu tổng quan về chương trình dịch
Trần Thị Hoa
Trường Đại học Khoa học Tự nhiên Khoa Toán – Cơ – Tin học Luận văn ThS ngành: Đảm bảo toán học cho máy tính và hệ thống tính toán
Mã số: 60 46 35 Người hướng dẫn: TS Nguyễn Thị Minh Huyền
Năm bảo vệ: 2012
Abstract Chương 1: Giới thiệu về chương trình dịch Chương 2: Phân tích từ vựng,
cú pháp và ngữ nghĩa (ngôn ngữ và văn phạm hình thức; phân tích từ vựng; phân tích cú pháp; phân tích ngữ nghĩa) Chương 3: Các công cụ hỗ trợ xây dựng chương trình dịch (bộ sinh trình phân tích từ vựng FLEX, bộ sinh trình phân tích cú pháp
BISON) Chương 4: Xây dựng chương trình dịch cho ngôn ngữ Minipas
Keywords Ngôn ngữ lập trình; Ngôn ngữ máy tính; Chương trình dịch; Toán tin;
Hệ thống tính toán
Content
MỞ ĐẦU
Từ ngàn xưa con người muốn giao tiếp với nhau phải dùng ngôn ngữ, vậy người giao tiếp với máy tính tất nhiên cũng phải thông qua ngôn ngữ Con người muốn máy tính thực hiện công việc, thì phải viết các yêu cầu đưa cho máy bằng ngôn ngữ máy có thể hiểu được
Việc viết các yêu cầu gọi là lập trình Ngôn ngữ dùng để lập trình được gọi là ngôn ngữ lập trình
Việc viết chương trình sẽ dễ dàng và tự nhiên hơn nếu ngôn ngữ lập trình gần với cách diễn đạt của vấn đề cần giải quyết Có nghĩa là, ngôn ngữ phải chứa đựng các cấu trúc thuật ngữ - phần tử dùng để miêu tả vấn đề, và không phụ thuộc vào máy tính cụ thể Những
ngôn ngữ lập trình có tính chất như trên được gọi là ngôn ngữ bậc cao Việc phân cấp ngôn
ngữ lập trình được dựa trên cơ sở của tính độc lập với máy tính ngày càng cao của các ngôn ngữ, bao gồm:
1 – Ngôn ngữ máy (machine language)
2 – Hợp ngữ (assembly language)
3 – Ngôn ngữ bậc cao (high level language)
Để giải quyết một vấn đề nào đó bằng tin học, lập trình viên phải tạo ra các chương trình nguồn bằng một ngôn ngữ bậc cao – ngôn ngữ gần với ngôn ngữ nói Nhưng máy tính
Trang 2chỉ hiểu, chỉ chấp nhận ngôn ngữ bậc thấp, riêng của mình, đó là chuỗi các số 0 và 1, tuy nhiên chuỗi số đó lại không gần gũi với con người chút nào
Bởi vì máy tính chỉ có thể hiểu ngôn ngữ máy cho nên một chương trình viết trong ngôn ngữ bậc cao cuối cùng rồi cũng được dịch sang ngôn ngữ máy Do đó cần phải có một
công cụ để thực hiện việc chuyển đổi này, công cụ đó được gọi là chương trình dịch Để đáp
ứng các nhu cầu về phần mềm ngày càng gia tăng cả về số lượng và chất lượng, các thiết kế ngôn ngữ lập trình có nhiều thay đổi dẫn đến các ngôn ngữ lập trình trở nên phức tạp hơn Vì thế việc thiết kế chương trình dịch cũng tiếp tục thay đổi Thiết kế và cài đặt chương trình dịch luôn là một chủ đề nghiên cứu và phát triển thiết thực
Do đó mục tiêu chính của đề tài là tìm hiểu về các bước để thiết kế một chương trình dịch và xây dựng một chương trình dịch cho một ngôn ngữ cụ thể tự định nghĩa Việc xây dựng thành công một chương trình dịch hoàn chỉnh là rất phức tạp, tốn nhiều thời gian và cần nhiều kiến thức
Luận văn được trình bày thành bốn chương:
+ Chương I: Giới thiệu về chương trình dịch
+ Chương II: Phân tích từ vựng, cú pháp và phân tích ngữ nghĩa
+ Chương III: Các công cụ hỗ trợ xây dựng chương trình dịch
+Chương IV: Xây dựng chương trình dịch cho ngôn ngữ Minipas.Trong quá trình nghiên cứu tác giả khó tránh khỏi những sai sót, rất mong nhận được nhiều ý kiến đóng góp
từ các thầy giáo, cô giáo và các bạn đọc để luận văn được hoàn thiện hơn
Chương 1 - GIỚI THIỆU VỀ CHƯƠNG TRÌNH DỊCH
Chương này trình bày kiến thức tổng quan về chương trình dịch, được trích từ tài liệu tham khảo [2, 4, 5]
1.1 Chương trình dịch
Chương trình dịch, còn gọi là phần mềm biên dịch, là một chương trình máy tính làm
công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (ngôn ngữ nguồn hay mã nguồn), thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ mới (gọi là ngôn ngữ đích hay mã đích) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn
ngữ máy
1.2 Các bước thiết kế chương trình dịch
Chương trình nguồn trong ngôn ngữ lập trình chính là chuỗi các ký tự Chương trình dịch có nhiệm vụ chuyển chuỗi ký tự này sang chuỗi ký tự khác Quá trình này bao gồm các
quá trình nhỏ hơn và được đặt tên như sau:
1.2.1 Phân tích từ vựng
Là công việc đọc chương trình nguồn từ trái sang phải (hay được gọi là quá trình quét nguyên liệu) để tách ra thành các thẻ từ (token) Nói cách khác, quá trình phân tích từ vựng là
quá trình dịch mà đầu nhập của nó là chuỗi các ký tự, tượng trưng cho chương trình nguồn, đầu ra là các token Dạng đầu ra này lại là đầu nhập của quá trình phân tích cú pháp về sau
1.2.2 Tổ chức bảng ký hiệu
Bảng ký hiệu 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 token được bộ phân tích từ vựng nhận biết và các thông tin của token đó, bao gồm các
Trang 3trườ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 chúng ta tìm ra nhanh chóng mẫu tin của mỗi token và cũng có thể lưu trữ và truy xuất token một cách nhanh
chóng
1.2.3 Phân tích cú pháp
Các token được xuất ra từ quá trình phân tích từ vựng có dạng (loại token, thuộc tính),
sẽ là chuỗi nhập vào của bộ phân tích cú pháp Trong quá trình phân tích cú pháp, các token
sẽ được kiểm tra xem có thể được biểu diễn bằng cấu trúc cú pháp của ngôn ngữ lập trình cho trước hay không?
1.2.4 Phân tích ngữ nghĩa
Bộ phân tích ngữ nghĩa sẽ kiểm tra lỗi ngữ nghĩa của chương trình nguồn và thu nhận các thông tin về kiểu cho giai đoạn sau Giai đoạn này sử dụng cây cú pháp được xác định trong giai đoạn phân tích cú pháp với mỗi nút trên cây cú pháp kết hợp với một tập thuộc tính
để xác định toán tử và toán hạng của các biểu thức và câu lệnh
1.2.5 Sinh mã trung gian
Sau giai đoạn phân tích cú pháp và phân tích ngữ nghĩa, một số chương trình dịch sẽ tạo ra một dạng biểu diễn trung gian của chương trình nguồn
1.2.6 Tối ưu mã
Giai đoạn tối ưu mã cố gắng cải thiện mã trung gian bằng cách thu giảm một số bước trong mã trung gian để có thể có mã máy thực hiện nhanh hơn
1.2.7 Sinh mã đích
Giai đoạn cuối của chương trình dịch là sinh mã đích Mã đích có thể là mã máy hay
mã hợp ngữ Các vị trí vùng nhớ được chọn lựa cho mỗi biến được chương trình sử dụng Sau
đó, các chỉ thị trung gian sẽ được dịch lần lượt thành chuỗi các chỉ thị mã máy
1.2.8 Phát hiện và thông báo lỗi
Mỗi giai đoạn của quá trình dịch đều có thể gặp lỗi Tuy nhiên sau khi phát hiện ra lỗi, mỗi giai đoạn phải có cách xử lý lỗi để có thể tiếp tục dịch chương trình, và như thế cho phép phát hiện thêm nhiều lỗi khác trong chương trình nguồn Một chương trình dịch cứ phải dừng lại khi phát hiện lỗi sẽ không được cho là hữu ích
Chương 2 - PHÂN TÍCH TỪ VỰNG , CÚ PHÁP VÀ NGỮ NGHĨA
Như Chương 1 đã trình bày, quá trình xây dựng một chương trình dịch gồm tám bước Trong chương này sẽ đề cập chuyên sâu các bước phân tích từ vựng, phân tích cú pháp
và phân tích ngữ nghĩa Trước khi đi vào tìm hiểu ba bước trên là nhắc lại kiến thức về ngôn ngữ và văn phạm được tham khảo từ [1]
2.1 Ngôn ngữ và văn phạm hình thức
2.1.1 Bảng chữ cái
Là một tập hữu hạn các ký hiệu, tập này thường được ký hiệu bằng
2.1.2 Chuỗi (từ)
Trang 4Cho là bảng chữ cái, một chuỗi (hay một từ) w trên là một dãy hữu hạn các ký hiệu thuộc được xếp liền kề nhau Độ dài chuỗi w là số các ký hiệu hợp thành w và được
ký hiệu là w Chuỗi rỗng ký hiệu là , là chuỗi có độ dài bằng không
Tập tất cả các chuỗi trên kể cả chuỗi rỗng được ký hiệu là *
Tập tất cả các chuỗi trên không kể chuỗi rỗng được ký hiệu là
2.1.3 Ngôn ngữ
Ta gọi ngôn ngữ là một tập hợp các chuỗi trên một bảng chữ cái nào đó Chẳng hạn
và là các ngôn ngữ trên mọi bộ chữ Tập tất cả các chuỗi trên một bảng chữ cái
ký hiệu là * cũng là một ngôn ngữ Mỗi ngôn ngữ trên bảng chữ cái là một tập con của *
2.1.4 Văn phạm hình thức
Định nghĩa văn phạm: Một văn phạm G(N,,P,S) là một bộ bốn, trong đó:
• N: là tập hữu hạn các ký hiệu chưa kết thúc hay các biến,
• : là tập hữu hạn các ký hiệu kết thúc,
• P: là tập luật sinh của văn phạm,
• SN: là ký hiệu bắt đầu của văn phạm
Ngôn ngữ sinh bởi văn phạm: Với văn phạm G có ký hiệu bắt đầu S Ta dùng quan hệ để định nghĩa L (G) là ngôn ngữ được sinh ra bởi G Chuỗi trong L (G) có thể chỉ chứa một ký hiệu kết thúc của G Chuỗi các ký hiệu kết thúc w thuộc L (G) nếu và chỉ nếu S* w, chuỗi w được gọi là một câu của G
2.1.5 Phân loại văn phạm
Dựa vào dạng của các luật sinh trong P để chia ra thành các lớp văn phạm sau:
1 Văn phạm chính quy
2 Văn phạm phi ngữ cảnh
3 Văn phạm cảm ngữ cảnh
4 Văn phạm tổng quát Trong luận văn, sẽ chỉ đề cập đến hai lớp văn phạm là văn phạm chính quy được sử dụng trong bước phân tích từ vựng và văn phạm phi ngữ cảnh được sử dụng trong bước phân tích cú pháp
2.1.5.1 Văn phạm chính quy
Một văn phạm G(N,,P,S) được gọi là tuyến tính phải nếu tất cả các luật sinh có dạng: X xB hoặc X x, trong đó: X,BN và x*
Một văn phạm G(N,,P,S) được gọi là tuyến tính trái nếu tất cả các luật sinh có dạng:X Bx hoặc X x, trong đó: X,BN và x*
Một văn phạm được gọi là văn phạm chính quy nếu nó là văn phạm hoặc tuyến tính
trái hoặc tuyến tính phải
2.1.5.2 Văn phạm phi ngữ cảnh
Trang 5Văn phạm G(N,,P,S) được gọi là văn phạm phi ngữ cảnh nếu tất cả các luật sinh trong tập Pcó dạng: Ax, trong đó AN và x(N)*
2.2 Phân tích từ vựng
2.2.1 Vai trò của bộ phân tích từ vựng
Phân tích từ vựng là giai đoạn đầu tiên của mọi chương trình dịch Nhiệm vụ chủ yếu của nó là đọc chuỗi ký tự nhập vào rồi nhóm các ký tự thành các thẻ từ hay được gọi là token
2.3 Phân tích cú pháp
2.3.1 Vai trò của bộ phân tích cú pháp
Bộ phân tích cú pháp nhận chuỗi các token được xuất ra từ bộ phân tích từ vựng và xác nhận rằng chuỗi này có thể được sinh ra từ văn phạm của ngôn ngữ nguồn hay không bằng cách tạo ra cây cú pháp cho chuỗi
Mỗi ngôn ngữ lập trình đều có các quy tắc diễn tả cấu trúc cú pháp của các chương trình định dạng đúng Các cấu trúc cú pháp này được mô tả bởi một văn phạm phi ngữ cảnh
Các chiến lƣợc phân tích cú pháp
Có hai chiến lược để thực hiện việc phân tích cú pháp:
Chiến lược phân tích cú pháp từ trên xuống (top – down),
Chiến lược phân tích cú pháp từ dưới lên (bottom – up)
2.3.1.1 Chiến lƣợc phân tích từ trên xuống
Cho một văn phạm phi ngữ cảnh G(N,,P,S) và một câu cần phân tích w Ta
xuất phát từ điểm khởi đầu, nghĩa là từ S, áp dụng các suy dẫn trái, tiến từ trái qua phải thử tạo ra câu đưa vào phân tích w
Một trong số các thuật toán sử dụng chiến lược phân tích từ trên xuống là thuật toán phân tích cú pháp Earley1
2.3.1.1.1 Giới thiệu thuật toán Earley
Earley là một thuật toán thuộc loại phân tích cú pháp từ trên xuống và xây dựng các dẫn xuất trái nhất của chuỗi ký tự nhập Khi sử dụng thuật toán Earley chúng ta không phải đưa văn phạm về một dạng chuẩn nào cả
2.3.1.1.2 Thuật toán phân tích cú pháp Earley
Input: Văn phạm phi ngữ cảnh G(N,,P,S), chuỗi wa1a2 a n thuộc *
Output: Danh sách các tập Earley: I0,I1, ,I n
Thuật toán:
Đầu tiên chúng ta xây dựng tập I như sau: 0
(1) Nếu S là một luật sinh trong P thì ta cho S,0 vào trong I0, sau đó thực hiện bước (2) và (3) cho đến khi nào không thể thêm mục mới vào trong I được nữa 0
1 http://en.wikipedia.org/wiki/Earley_parser
Trang 6(2) Nếu B,0 thuộc I (chú ý: 0 có thể là ) thì đưa vào trong tậpI mục 0
AB,0 cho tất cả các mục có dạng AB,0 có trong I 0
(3) Nếu AB,0 là một mục trong tậpI thì ta đưa vào 0 I các mục 0 B,0
cho tất cả các luật sinh có dạng B trong P
Bây giờ chúng ta xây dựng tậpI j sau khi đã có các tập I0,I1, ,I j1
(4) Bước quét (Scan): Với mỗi mục trong I j1có dạng Ba,i (với aa j) thì cho mục Ba,i vào trong I j Thực hiện bước (5) và (6) cho đến khi không còn mục mới được thêm vào
(5) Bước hoàn thành (Complete): Nếu A,i là một mục trong I , kiểm tra xem j
trong tập I i các mục có dạng BA,k, với mỗi mục tìm được như vậy ta cho vào trong I j mụcBA,k
(6) Bước dự báo (Predict): Nếu AB,i là một mục trong I j, tìm trong P tất cả các luật sinh có dạng B thì ta thêm mục B,j vào I j
Kết thúc thuật toán khi jn
2.3.1.1.3 Độ phức tạp thời gian theo chiều dài chuỗi nhập
Thuật toán có độ phức tạp là 0( 3
n )
2.3.1.2 Chiến lược phân tích dưới lên
Quá trình ngược lại với phân tích từ trên xuống, xuất phát từ chính câu cần phân tích
w , bằng cách áp dụng thu gọn các suy dẫn phải, tiến hành từ trái qua phải để đi tới ký hiệu
đầu của văn phạm
Một trong số các thuật toán sử dụng chiến lược phân tích từ trên xuống là thuật toán phân tích cú pháp CYK2 Đây là một thuật toán phân tích cú pháp trên văn phạm phi ngữ cảnh tổng quát Thuật toán mang tên của ba người tìm ra nó, đó là J Cocke, D H Younger và
T Kasami
2.3.1.2.1 Ý tưởng thuật toán
Ý tưởng chính của thuật toán như sau:
Giả sử có một văn phạm phi ngữ cảnh G(N,,P,S) ở dạng chuẩn Chomsky3 và một chuỗi nhập wa1a2 a n
2
http://en.wikipedia.org/wiki/CYK_algorithm
Trang 7 Thuật toán CYK sẽ đi xây dựng một bảng phân tích cú phápij (có hình một tam giác), mỗi phần tử ijvới 1invà 1 jni1 có các giá trị là một tập con của N
Một kí hiệu không kết thúc A thuộc ij nếu và chỉ nếu A* a i a i1 a ij1
Chuỗi nhậpw thuộc ngôn ngữ L (G) nếu St1n
2.3.1.2.2 Thuật toán phân tích cú pháp CYK
Thuật toán CYK
(2) i1:= {A | Aa là một luật sinh và a là ký hiệu thứ i trong x }
(4) FOR i:1 TO n j1 DO
BEGIN
(5) ij =
(6) FOR k:1 TO j1 DO
(7) ij:= ij {A|ABC là một luật sinh, B ik và C ik,jk} END
2.4 Phân tích ngữ nghĩa
Khi viết một chương trình bằng một ngôn ngữ lập trình nào đó, ngoài việc quan tâm đến cấu trúc cú pháp của chương trình, ta còn phải chú ý đến ý nghĩa của chương trình Tức
là chương trình dịch phải kiểm tra về ngữ nghĩa hay xử lý ngữ nghĩa của chương trình nguồn
Để biểu diễn ngữ nghĩa, ta bổ sung thông tin ngữ nghĩa trực tiếp vào văn phạm và biểu diễn bằng lược đồ dịch
2.4.1 Định nghĩa ngữ nghĩa trực tiếp trong văn phạm
Để bổ sung ngữ nghĩa vào văn phạm ta dùng một văn phạm phi ngữ cảnh, trong đó mỗi ký hiệu văn phạm kết hợp với một tập các thuộc tính Mỗi luật sinh kết hợp với một tập các luật ngữ nghĩa Việc đánh giá các luật ngữ nghĩa được sử dụng để thực hiện một công việc nào đó như tạo ra mã trung gian, lưu thông tin vào bảng ký hiệu, xuất các thông báo lỗi
Thuộc tính của văn phạm là phần dữ liệu được liên kết với những ký hiệu kết thúc hoặc ký hiệu không kết thúc Thuộc tính có thể lưu bất cứ thông tin nào như số, chuỗi, con trỏ, hoặc một cấu trúc nào đó do người dùng tự định nghĩa
2.4.2 Lƣợc đồ dịch
Là một văn phạm phi ngữ cảnh trong đó các thuộc tính được kết hợp với các ký hiệu văn phạm và các hành vi ngữ nghĩa nằm trong cặp dấu { } được chèn vào bên phải của luật sinh
Trang 8Chương 3 - CÁC CÔNG CỤ HỖ TRỢ XÂY DỰNG CHƯƠNG TRÌNH DỊCH
3.1 Giới thiệu
Trên thực tế, đã có rất nhiều công cụ có khả năng sinh ra bộ phân tích từ vựng và bộ phân tích cú pháp Một trong những bộ cổ điển nhất là lex và yacc – được phát minh tại Bell Lab trong thập niên 1970
Yacc [6] (Yet Another Compiler Compiler) – công trình của Stephen
C Johnson được ra đời sớm hơn, có nhiệm vụ sinh ra trình phân tích cú pháp
Trong khi đó Mike Lesk và Eric Schmidt đã thiết kế và phát triển Lex [6]– bộ sinh trình phân tích từ vựng – để hỗ trợ yacc trong việc xác định các token từ chuỗi nhập
Flex4 và Bison5 chính là phiên bản cải tiến của lex và yacc, có khả năng phân tích trên
bộ văn phạm rộng hơn, quản lý bộ nhớ tốt hơn và được sử dụng trên nhiều nền tảng
3.2 Bộ sinh trình phân tích từ vựng Flex
3.2.1 Cấu trúc
Flex nhận đầu vào là một tệp bao gồm các đặc tả của các token Cấu trúc của một chương trình được viết bằng ngôn ngữ Flex gồm ba phần:
Phần khai báo
%%
Phần quy tắc dịch
%%
Các hàm hỗ trợ
3.2.2 Quy trình vận hành
Việc tạo ra bộ phân tích từ vựng được thực hiện trong ba bước Bước đầu là tạo ra chương trình flex.l trong ngôn ngữ Flex Sau đó chương trình flex.l sẽ được chương trình dịch Flex xử lý tạo sản phẩm đầu ra là flex-yy.c, được xây dựng từ các biểu thức chính quy của flex.l cùng các thủ tục chuẩn Flex dùng bảng để nhận dạng trị từ vựng Các hành vi có liên quan đến các biểu thức chính quy trong flex.l là các chương trình con trong ngôn ngữ C
và chúng được chuyển thẳng sang chương trình flex-yy.c Cuối cùng lex-yy.c sẽ được chương trình dịch C dịch và sinh ra chương trình đối tượng a.out Nó chính là bộ phân tích từ vựng,
có khả năng chuyển các dòng nhập thành các token của ngôn ngữ, được xác định bởi các biểu thức chính quy, đã được đặc tả trong ngôn ngữ Flex
4
http://flex.sourceforge.net
Trang 93.3 Bộ sinh trình phân tích cú pháp Bison
3.3.1 Cấu trúc
Tương tự như Flex, Bison nhận đầu vào là một tệp bao gồm các đặc tả của một ngôn ngữ Từ đó, Bison biên dịch ra bộ phân tích cú pháp bằng mã C để chạy cùng với chương trình Cấu trúc của tệp đặc tả ngôn ngữ gồm ba phần:
Phần khai báo
% %
Phần luật dịch
%%
Các thủ tục
3.3.2 Quy trình vận hành
Một chương trình dịch có thể được xây dựng nhờ Bison bằng phương thức được minh họa trong hình 3.2 trên Trước tiên, cần chuẩn bị một tập tin, chẳng hạn là translate.y, chứa một đặc tả Bison của chương trình dịch Lệnh bison translate.y sẽ biến đổi tập tin
translate.y thành một chương trình C có tên là y.tab.C Bằng cách dịch y.tab.C cùng với thư viện ly nhờ lệnh cc y.tab.C - ly chúng ta thu được một chương trình đối tượng a.out thực hiện quá trình dịch được đặc tả bởi chương trình Bison ban đầu Nếu cần thêm các thủ tục khác, chúng có thể được biên dịch hoặc được tải vào y.tab.C giống như mọi chương trình C khác
Chương 4 - XÂY DỰNG CHƯƠNG TRÌNH DỊCH CHO NGÔN NGỮ MINIPAS
Trong chương này, luận văn sẽ định nghĩa một ngôn ngữ tựa Pascal có tên gọi là Minipas và sau đó sử dụng các công cụ đã được giới thiệu trong chương ba để xây dựng bộ phân tích từ vựng và bộ phân tích cú pháp cho ngôn ngữ Minipas
4.1 Yêu cầu
Minipas được xây dựng dựa trên ngôn ngữ Pascal Mặc dù còn đơn giản hơn Pascal rất nhiều nhưng Minipas đáp ứng được các yêu cầu sau:
- Đơn giản, gọn nhẹ, dễ học
- Đủ dùng để diễn tả một số thuật toán đơn giản cho người mới làm quen với ngôn ngữ lập trình
4.2 Ngôn ngữ Minipas
4.2.1 Giới thiệu sơ lược
Ngôn ngữ xây dựng được đặt tên là Minipas có một số đặc điểm:
- Có năm kiểu dữ liệu đơn giản: nguyên (integer), thực (double), logic (bool), kí tự (char), chuỗi ký tự (string) Hỗ trợ các phép toán số học - logic cơ bản trên ba kiểu đầu tiên
Kiểu char chỉ hỗ trợ phép gán và so sánh
- Có kiểu cấu trúc là kiểu mảng một chiều với chỉ số nguyên, kiểu phần tử là kiểu đơn giản
- Có ba cấu trúc điều khiển: tuần tự, rẽ nhánh (if… then… else) và vòng lặp
(for…to…do, while do)
Trang 10- Có kiểu chương trình con là hàm Chương trình con có thể có tối đa là ba tham số
- Có hai lệnh nhập dữ liệu từ bàn phím và xuất dữ liệu ra màn hình
- Cho phép hai dạng chú thích: chú thích khối và chú thích trên dòng
- Ngôn ngữ Minipas có phân biệt chữ hoa và chữ thường
Ngôn ngữ Minipas như vậy là tương đối đủ cho người mới bắt đầu làm quen với việc
học lập trình Một số chi tiết phức tạp của ngôn ngữ Pascal (con trỏ, kiểu dữ liệu cấu trúc,
unit, đồ hoạ, tham biến ) đã được lược bỏ giúp Minipas đơn giản hơn
4.3 Xây dựng chương trình dịch cho Minipas
4.3.1 Xây dựng trình phân tích từ vựng cho Minipas
Bảng sau liệt kê danh sách các token của ngôn ngữ Minipas và biểu thức chính quy xác định các token đó: