Các câu lệnh trong ngôn ngữ lập trình Box

Một phần của tài liệu Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi (Trang 41 - 47)

1 statement 2 ::= variableDefinition 3 | labelDefinition 4 | singleStatement 5 singleStatement 6 ::= functionCallStatement 7 | returnStatement 8 | breakStatement 9 | continueStatement 10 | loopStatement 11 | assignmentStatement 12 | blockStatement 13 | ifStatement 14 blockStatement ::= ‘{’ ( ‘;’ | statement )* ‘}’

Quy tắc statement biểu diễn một câu lệnh trong ngôn ngữ lập trình này. Một câu lệnh có thể là một câu lệnh đơn, một định nghĩa biến hoặc một định

nghĩa nhãn. Quy tắc singleStatement biểu diễn một câu lệnh đơn. Quy tắc

blockStatement biểu diễn một câu lệnh khối, nó kết hợp các câu lệnh tạo thành một khối. Một câu lệnh chỉ có thể xuất hiện trong thân của một hàm.

1 functionCallStatement ::= functionCallExpression ‘;’

Quy tắc functionCallStatement biểu diễn một câu lệnh gọi hàm. Kết quả trả về của hàm được gọi, nếu có, sẽ bị bỏ qua.

1 returnStatement ::= ‘return’ expression? ‘;’

Quy tắc returnStatement biểu diễn một câu lệnh thoát hàm và trả về kết quả. Với một hàm không trả về kết quả, câu lệnh này sẽ không nhận biểu thức truyền vào.

1 breakStatement ::= ‘break’ LabelIdentifier? ‘;’

2 continueStatement ::= ‘continue’ LabelIdentifier? ‘;’

3 loopStatement ::= ‘loop’ ( ‘;’ | singleStatement )

Quy tắcloopStatementbiểu diễn một câu lệnh lặp, các quy tắcbreakStatement

và continueStatement được sử dụng để điều khiển luồng hoạt động của vòng lặp đó. Quy tắc breakStatement biểu diễn một câu lệnh thoát khỏi vòng lặp, quy tắccontinueStatement biểu diễn một câu lệnh nhảy về đầu vòng lặp. Cả hai câu lệnh điều khiển luồng vòng lặp này đều có thể được chỉ định thêm một nhãn, khi đó, thay vì thực thi điều khiển luồng trên vòng lặp hiện tại, chúng sẽ nhảy về đầu hoặc thoát ra vòng lặp được chỉ định bởi nhãn đó. Nhãn truyền vào phải đảm bảo là của một vòng lặp mà hai câu lệnh điều khiển này nằm bên trong.

1 ifSingleCase

2 ::= ‘if’ ‘(’ expression ‘)’ ( ‘;’ | singleStatement )

3 ifStatement

4 ::= ifSingleCase

5 ( ‘else’ ifSingleCase )*

6 ( ‘else’ ( ‘;’ | singleStatement ) )?

Quy tắc ifStatement biểu diễn một câu lệnh điều kiện. Một câu lệnh điều kiện có thể có nhiều nhánh khác nhau, và chỉ tối đa một nhánh được thực thi.

Ngoại trừ nhánh cuối cùng, mỗi nhánh sẽ có một biểu thức điều kiện để kiểm tra xem nhánh đó có được thực thi hay không. Biểu thức điều kiện là một biểu thức trả về kiểu bool. Do việc kiểm tra và thực thi được thực hiện lần lượt từ trên xuống, nếu một nhánh phía trước đã được thực thi, các biểu thức điều kiện và các câu lệnh của các nhánh sau đó sẽ bị bỏ qua. Nhánh vô điều kiện cuối cùng, nếu có, sẽ chỉ được thực thi khi tất cả các điều kiện phía trước đều sai. Quy tắc ifSingleCase là một quy tắc bổ trợ cho quy tắc biểu diễn câu lệnh điều kiện. 1 assignmentOperator 2 ::= ‘=’ | ‘:=’ 3 | ‘*=’ | ‘/=’ | ‘%=’ 4 | ‘+=’ | ‘-=’ 5 | ‘<<=’ | ‘>>=’ 6 | ‘&=’ | ‘^=’ | ‘|=’ 7 | ‘&&=’ | ‘^^=’ | ‘||=’ 8 assignmentStatement

9 ::= assignableExpression assignmentOperator expression ‘;’

Quy tắcassignmentStatement biểu diễn một câu lệnh gán. Có nhiều dạng câu lệnh gán khác nhau với các chức năng khác nhau. Câu lệnh gán cơ bản ‘=’

gán giá trị của biểu thức vế phải cho biến ở vế trái. Câu lệnh gán sao chép ‘:=’

được sử dụng để sao chép nông một mảng hoặc một bản ghi. Các câu lệnh gán có chứa toán tử được thực thi với biểu thức ở vế trái và biểu thức ở vế phải, sau đó gán giá trị nhận được cho biến ở vế trái. Ví dụ, lệnh x *= y sẽ tương đương với x = x * y.

1 compilationUnit ::= ( ‘;’ | globalDefinition )* EOF

Quy tắc compilationUnit biểu diễn toàn bộ tập tin mã nguồn. Một tập tin mã nguồn bao gồm một danh sách những khai báo toàn cục cho đến hết tập tin.

Tiểu kết Chương 3

Chương 3 của luận văn đã trình bày về yêu cầu và mô tả của ngôn ngữ được đề xuất, bao gồm mô tả về các thành phần cơ bản, các kiểu dữ liệu, các biểu thức, các định nghĩa và các câu lệnh trong ngôn ngữ mới. Trong chương tiếp theo, luận văn sẽ xây dựng một trình biên dịch thử nghiệm cho ngôn ngữ được đề xuất.

Chương 4

Công cụ và thử nghiệm

Ở chương này, luận văn sẽ trình bày về kiến trúc và cài đặt của trình biên dịch cho ngôn ngữ mới, triển khai các mô tả ngôn ngữ đã nêu ở Chương 3. Cùng với đó, chương này đưa ra những so sánh của ngôn ngữ mới với các ngôn ngữ lập trình thông dụng khác để chỉ ra ưu điểm và nhược điểm của ngôn ngữ mới trong mục tiêu giải quyết bài toán ban đầu.

4.1 Cài đặt trình biên dịch

Để thử nghiệm về tính khả dụng của ngôn ngữ lập trình mới cho mục đích mô tả và cài đặt các thuật toán sử dụng trong tập tin lưu trữ, cần phải xem xét về mức độ phù hợp của ngôn ngữ mới cho mục đích đề ra. Điều này được thực hiện thông qua việc cài đặt một trình biên dịch có khả năng dịch ngôn ngữ được đề xuất sang một ngôn ngữ bậc cao khác, từ đấy có thể so sánh và làm nổi bật các ưu và nhược điểm của ngôn ngữ mới trong quá trình cài đặt các thuật toán xử lý dữ liệu thường gặp trong tập tin lưu trữ như nén hay mã hóa.

Trong luận văn này, một trình biên dịch thử nghiệm đã được xây dựng sử dụng ngôn ngữ Java và chạy trên nền tảng Java Core phiên bản 11. Trình biên dịch mới nhận ngôn ngữ đầu vào là ngôn ngữ lập trình đề xuất và tiến hành phân tích từ vựng, cú pháp và ngữ nghĩa của mã nguồn đầu vào, sau đó xuất ra một mã nguồn chương trình Java tương ứng. Một giao diện dòng lệnh đơn giản cũng được tạo ra giúp quá trình sử dụng và thử nghiệm công cụ được thuận tiện

hơn. Ví dụ về cách sử dụng giao diện dòng lệnh này được thể hiện trong Hình 4.1.

Để tạo bộ phân tích ngữ pháp cho ngôn ngữ, thư viện ANTLR1 phiên bản 4 đã được sử dụng nhờ vào khả năng tạo trình phân tích ngữ pháp mạnh mẽ và linh hoạt. Mô tả về ngữ pháp của ngôn ngữ được viết bằng ngôn ngữ mô tả cú pháp riêng của ANTLR, ngôn ngữ này được thiết kế dựa trên EBNF và bổ sung thêm các tính năng hữu dụng khác nhằm làm cho ngôn ngữ này thuận tiện hơn. Ví dụ về một đoạn mã nguồn mô tả cú pháp của các định nghĩa được trích dẫn từ mã nguồn của trình biên dịch đã được xây dựng có thể được quan sát ở Mã nguồn 4.1. Mã nguồn của toàn bộ trình biên dịch có thể được xem tại

https://github.com/thanhminhmr/box-lang.

Hình 4.1: Giao diện dòng lệnh của trình biên dịch

Mã nguồn 4.1: Mã nguồn ANTLR mô tả cú pháp định nghĩa của Box

1 memberDefinition: type MemberIdentifier; 2 3 tupleDefinition: 4 TupleIdentifier ’(’ ( 5 memberDefinition (’,’ memberDefinition)* 6 )? ’)’ ’;’; 7 8 variableDefinition:

9 type VariableIdentifier (’=’ expression)? ’;’; 10

11 parameterDefinition: type ParameterIdentifier; 12 13 functionDefinition: 14 type FunctionIdentifier ’(’ ( 15 parameterDefinition (’,’ parameterDefinition)* 16 )? ’)’ blockStatement; 17 18 globalDefinition: 19 tupleDefinition 20 | variableDefinition 21 | functionDefinition; 22

23 labelDefinition: LabelIdentifier loopStatement;

Một phần của tài liệu Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi (Trang 41 - 47)