2011-12-16 34 views
6

Chúng tôi có nhiệm vụ thực hiện một trình biên dịch. Chúng tôi đã thực hiện phân tích từ vựng và cú pháp nhưng chúng tôi bị kẹt ở thế hệ mã trung gian. Chúng tôi nhận ra rằng chúng tôi phải thực hiện một bảng biểu tượng để tiến hành tạo mã trung gian và chúng tôi không biết, làm thế nào để làm điều đó và những gì nó chứa.Cách tạo một bảng biểu tượng

Với mã bên dưới, bảng biểu tượng nên chứa gì? (Mã được viết bằng ngôn ngữ giáo dục được mô tả bên dưới)

Ngoài ra, làm cách nào chúng ta có thể triển khai phạm vi trong bảng biểu tượng?

<PROGRAM> ::= PROGRAM ID <BLOCK> ENDPROGRAM 
<BLOCK> ::= {<DECLARATIONS> <SUBPROGRAMS> <SEQUENCE>} 
<DECLARATIONS> ::= ε | DECLARE <VARLIST> ENDDECLARE 
<VARLIST> ::= ε | ID (, ID)* 
<SUBPROGRAMS> ::= (<PROCORFUNC>) * 
<PROCORFUNC> ::= PROCEDURE ID <PROCORFUNCBODY> ENDPROCEDURE | 
FUNCTION ID <PROCORFUNCBODY> ENDFUNCTION 
<PROCORFUNCBODY> ::= <FORMALPARS> <BLOCK> 
<FORMALPARS> ::= ε | (<FORMALPARLIST>) 
<FORMALPARLIST> ::= <FORMALPARITEM> (, <FORMALPARITEM>)* 
<FORMALPARITEM> ::= IN ID | INOUT ID 
<SEQUENCE> ::= <STATEMENT> (; <STATEMENT>)* 
<STATEMENT> ::= ε | <ASSIGNMENT-STAT> | 
<IF-STAT> | 
<WHILE-STAT> | 
<FOR-STAT> | 
<EXIT-STAT> | 
<CALL-STAT> | 
<RETURN-STAT> 
<ASSIGNMENT-STAT> ::= ID := <EXPRESSION> 
<IF-STAT> ::= IF <CONDITION> THEN <SEQUENCE> <ELSEPART> ENDIF 
<ELSEPART> ::= ε | ELSE <SEQUENCE> 
<WHILE-STAT> ::= DO {<SEQUENCE>} WHILE (<CONDITION>) 
<FOR-STAT> ::= (<ASSIGNMENT-STAT>; <CONDITION>;<ASSIGNMENT-STAT>;) 
{<SEQUENCE>} 
<EXIT-STAT> ::= EXIT 
<CALL-STAT> ::= CALL ID <ACTUALPARS> 
<ACTUALPARS> ::= (<ACTUALPARLIST>) | ε 
<ACTUALPARLIST> ::= <ACTUALPARITEM> (, <ACTUALPARITEM>)* 
<ACTUALPARITEM> ::= IN <EXPRESSION> | INOUT ID 
<RETURN-STAT> ::= RETURN <EXPRESSION> 
<CONDITION> ::= <BOOLTERM> (OR <BOOLTERM>)* 
<BOOLTERM> ::= <BOOLFACTOR> (AND <BOOLFACTOR>)* 
<BOOLFACTOR> ::= NOT [<CONDITION>] | [<CONDITION>] | 
<EXPRESSION> <RELATIONAL-OPER> <EXPRESSION> | 
TRUE | FALSE 
<EXPRESSION> ::= <OPTIONAL-SIGN> <TERM> (<ADD-OPER> <TERM>)* 
<TERM> ::= <FACTOR> (<MUL-OPER> <FACTOR>)* 
<FACTOR> ::= CONSTANT | (<EXPRESSION>) | ID <IDTAIL> 
<IDTAIL> ::= ε | <ACTUALPARS> 
<RELATIONAL-OPER> ::= = | < (ε | = | >) | > (ε | =) 
<ADD-OPER> ::= + | - 
<MUL-OPER> ::= * |/
<OPTIONAL-SIGN> ::= ε | <ADD-OPER> 
PROGRAM MULTIPLY 
    { 
    DECLARE 
    A, B, C 
    ENDDECLARE 
    PROCEDURE Aop(INOUT A) 
    { 
     A=A+1; 
    } 
    ENDPROCEDURE 
    FUNCTION Bop(IN B){ 
     IF [NOT[[TRUE AND FALSE]OR[TRUE]]] THEN B := 100/2; 
     ELSE B := 100; 
     ENDIF; 
     RETURN B; 
     } 
    ENDFUNCTION 
    CALL Aop(INOUT A); 
    CALL Bop(IN B); 
    A := 40; 
    C := A * B; 
    } 
ENDPROGRAM 
+1

Tôi ghét nó nếu ngôn ngữ lập trình của tôi luôn luôn hét lên với tôi ... – Bobby

+0

@Bobby, sau đó bạn may mắn bạn đã không sử dụng 'VT50'. –

+0

Hãy xem [cactus stacks] (http://en.wikipedia.org/wiki/Spaghetti_stack) –

Trả lời

6

Một bảng biểu tượng bản đồ định danh (thường bắt đầu bằng một tên phạm vi) để thông tin về nhận dạng đó, chẳng hạn như loại biểu tượng của nó (địa phương biến/thông số/chức năng/lớp vv) , kiểu dữ liệu, thứ tự của nó liên quan đến các định danh khác trong cùng phạm vi, dòng mã nguồn của nó, vv Bảng biểu tượng có thể được tạo bằng cách duyệt qua cây cú pháp trừu tượng, bằng cách luôn theo dõi phạm vi bạn đang ở và thêm thông tin vào bảng biểu tượng bất cứ khi nào bạn nhấn vào một khai báo biến. Trong ví dụ của bạn, một phần của bảng biểu tượng có thể trông như thế này (bản đồ để loại biểu tượng, kiểu dữ liệu, vị trí và dòng mã nguồn):

MULTIPLY.A -> {"LOCAL", "INT", 0, 4} 
MULTIPLY.B -> {"LOCAL", "INT", 1, 4} 
MULTIPLY.C -> {"LOCAL", "INT", 2, 4} 
MULTIPLY.Aop -> {"FUNCTION", "INT", 3, 4} 
MULTIPLY.Aop.A -> {"INOUTPARAM", "INT", 0, 6} 

Bây giờ, bạn có thể giải quyết tất cả các tài liệu tham khảo khác nhau. Ví dụ, trong biểu thức A := A + 1, nếu bạn biết phạm vi hiện tại của mình là MULTIPLY.Aop, bảng symnbol sẽ cho bạn biết rằng A là thông số đầu vào/đầu ra kiểu INT và đó là thông số đầu tiên (thông tin này sẽ cho phép bạn tạo ra một offset địa chỉ stack để bạn có thể tải/lưu trữ biến).

Các vấn đề liên quan