Assignment 2 Phase 2 Checklist

Update 08:00 AM: về phần hiện thực self literal, các bạn có thể xen nó như một biến thuộc kiểu của class cha của method đang implementation.

__________________

Update 01:00 AM: các bạn nhớ thêm thư viện IO được đặc tả trong mục 8 đặc tả ngôn ngữ BKOOL nhá 😥

__________________

Tới hẹn lại lên, cũng không rảnh rỗi đến nỗi ăn không ngồi rồi, không có chiện gì làm, thì lôi cái này ra viết -_- , cái này mình cũng chủ yếu viết cho mình dùng, nhân tiện public cho mọi người luôn, cũng chẳng có thiệt hại gì cả.
Khi các bạn đã qua được phase 1 rồi thì chắc cũng dần làm quen được với kiểu lập trình như thế này, nên bài viết này sẽ không đi sâu vào chi tiết lắm…
Và cũng như lần trước, mình chỉ trình bày những ý quan trọng, những phần liên quan các bạn phải tự hiện thực và kiểm tra nhá.

Trích lại bài trước:

Nhưng trước hết mình xin nói một điều là bài viết này dựa trên quan điểm các nhân của mình, các bạn có thể dùng để tham khảo. Nhưng vì đây cũng chỉ là quan điểm của riêng mình, không thể tránh được thiếu sót, có gì mong các bạn đóng góp ý kiến chân thành, xin cám ơn.

4. Submission and late penalties:

➢ Phase 2: deadline November 11th, 2013 at 12:00 noon
The testcases for this phase:
● Include all tests of phase 1
● Have errors on Cannot Assign To Constant, Redeclared Variable/Constant/Attribute
/Class/Method/Parameter, Undeclared Identifier/Attribute/Method/Class, Type Mismatch in normal expression, Type Mismatch in normal statement. There is no inheritance applied in the testcases of this phase.
● There is at most 1 error in each testcase.
____
– Theo mình hiểu thì trong phase này sẽ giới hạn lại như sau:
Bao gồm tất cả testcase phase 1: các bạn vui lòng đọc lại bài viết trước!
Những lỗi phép gán vào hằng, chưa khai báo, khai báo lại, tất cả lỗi không hợp kiểu (mời bạn xem lại bài viết trước)
Hiện tại thì chưa áp dụng thừa kế vào phase 2 này, nên chưa cần so sánh kiểu class cha con.
Có nhiều nhất một lỗi trong mỗi testcase, nên không cần quan tâm đến thứ tự, độ ưu tiên của các lỗi.

Làm gì trong Phase 2?

Đầu tiên thì do 2 phần Type Mismatch mình đã viết đầy đủ bên bài viết A2P1 này, nên cũng chẳng viết lại làm gì, ngoài ra phase 2 còn yêu cầu hiện thực các phần sau:

a. Redeclared Variable/Constant/Attribute/Class/Method/Parameter:

An identifier must be declared before used. However, the declaration must be unique in its scope. Otherwise, the error messages “Redeclared <kind>: ”+<identifier> is released, where <kind> is the kind of the identifier in the second declaration.
The scope of an identifier (variable, constant, attribute, class, method, parameter) is informally described as in section 7. Note that an attribute of a class is redeclared if there is another previous attribute of the same class with the same name. A method of a class is redeclared if there is another previous method of the same class with the same prototype (i.e. name and its number of parameters).
____
Lỗi khai báo lại:
Mấy loại như attribute, class, parameter, variable hay constant thì khá đơn giản, hay có thể nói là gần như tương tự nhau.
Tuy nhiên cần chú ý ở đâu là lỗi khai báo lại phương thức (Redeclared Method):
Chỉ cần phát hiện một method trùng tên và có cùng số tham số (và tất nhiên phải cùng 1 class scope), bất chấp kiểu trả về và kiểu của tham số, thì có thể báo lỗi “Redeclared Method”
Và lưu ý quan trọng nhất là chỉ tính khai báo lại khi đang trong cùng 1 scope
Lỗi này xuất hiện ở các visit của Decl tương ứng.

b. Undeclared Identifier/Attribute/Method/Class:

The error message “Undeclared Identifier: ”+<identifier> is released when there is an identifier is used but its declaration cannot be found. The identifier can be a variable, constant or parameter. “Undeclared Class: ”+<class name> is released in similar situation for a class usage.
“Undeclared Attribute: ”+<attribute name> is released when there is an access to an attribute of a class but there is no declaration of the attribute of the class. “Undeclared Method: ”+<method name> is released in similar situation for a method invoking.
Note that BKOOL is an OO language so all members of a class may be inherited by its subclasses.
____
Lỗi chưa khai báo mà đem đi dùng:
Tương tự khi khai báo lại, lỗi khai báo lại của Identifier/Attribute/Class khá là đơn giản,
Phần cần chú ý nhất ở đây là “Undeclared Method”, lỗi này xuất hiện khi gọi một hàm (trong Call, CallExpr, NewExpr) mà không tìm thấy hàm cùng tên và cùng số tham số.
Nếu tìm thấy một hàm cùng tên, cùng cả số tham số, nhưng kiểu của tham số hình thức và tham số truyền vào không tương thích thì sẽ gây ra lỗi TypeMismatch chứ không phải Undeclared Method!
Lưu ý: vì BKOOL là ngôn ngữ hướng đối tượng, nên tất cả member của class đều được thừa kế bởi class con của nó! (chưa cần quan tâm điều này ở phase 2 vì phase 2 chưa xét tới tính thừa kế)
Gợi ý:

  • Undeclared Identifier: xuất hiện khi sử dụng Id chưa được khai báo, nên sẽ viết vào trong visit của Id
  • Undeclared Class: xuất hiện khi sử dụng Class chưa được khai báo, các visit có thể phát sinh ra lỗi này: thừa kế class cha trong ClassDecl (có thể chưa cần quan tâm), class cha của MethodImpDecl, trong ClassType
  • Undeclared Attribute: xuất hiện trong visit của FieldAccess
  • Undeclared Method: xuất hiện trong NewExpr (tại vì Constructor cũng có thể xem như một Method, nhưng chỉ dùng trong NewExpr), CallStmt và CallExpr

c. Cannot Assign To Constant:

The left-hand side (LHS) of an assignment statement operator cannot be declared as a constant, otherwise, the error message “Cannot Assign To Constant: ” + <statement> is released.
An assignment operator may appear in an assignment or a for statement. If the error happens in an assignment statement, the assignment statement is passed in the error message. In the case of a for statement, just the assignment part in this statement is printed out in the error message.
____
Thật là đơn giản, nếu vế trái là Id thì Id đó mà là kiểu Constant, hoặc nếu vế trái là fieldAccess thì kiểu của field phải khác immutable attribute

Bonus:

  • để so sánh tương thích kiểu trong parameter của method, các bạn nên tham khảo hàm list1.correspond(list2)(cmpFunc)
  • các bạn nào bị bế tắc chổ so sánh return type, mình có một mẹo nho nhỏ (mình không làm theo cách này) các bạn có thể lưu returnType lại dưới dạng một biết tên là “return” (vì return là từ khoá, nên chắc chắn không có biến nào tên “return” cả 😀 ) trong môi trường cục bộ, rồi lúc return có thể kiểm tra kiểu của return expr với “biến” “return” này
  • các bạn nên thay đổi cấu trúc của symbol và symbolTable lại cho hợp lý.
  • variable hay mutable attribute đều visit giống nhau, nhưng chỉ có điều một cái là ở trong class, một cái ở ngoài class, các bạn có thể đặt biến kiểm tra thích hợp để hiện thực điều này. tương tự đối với constant hay immutable attribute.
  • chú ý phần method implementation declare, scope của nó được tính bắt đầu từ lúc khai báo parameter cho đến hết body, chứ không phải bắt đầu từ body, có nghĩa là biến được khai báo trong body không được trùng tên với parameter đã được khai báo
  • khi vào block nhớ vào scope mới

-anKra-

Advertisements

2 thoughts on “Assignment 2 Phase 2 Checklist

  1. K. Thịnh says:

    Hey,
    Vậy là trong phase 2 này, làm phần hướng dẫn trên + phần bị gạch ở hướng dẫn phase 1 hả?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s