2011-12-16 2 views
6

우리는 컴파일러를 지정할 과제가 있습니다. 우리는 이미 어휘 및 구문 분석을 만들었지 만 우리는 중간 코드 생성에 박차를 가하고 있습니다. 우리는 중간 코드 생성을 진행하기 위해 심볼 테이블을 구현해야한다는 것을 알았고 우리는 그것을 어떻게 수행하고 무엇을 포함 하는지를 모른다.기호 테이블을 만드는 방법

아래 코드가 주어지면 기호 테이블에 무엇이 들어 있습니까? (코드는 아래에 설명 된 교육 언어로 작성되었습니다.)

또한 기호 테이블에 범위를 구현할 수 있습니까?

<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

제 프로그래밍 언어가 항상 제게 큰 소리로 외치는 것이 싫지만 ... – Bobby

+0

@Bobby, 그럼 VT50을 사용하지 않아서 다행입니다. –

+0

[cactus stacks] (http://en.wikipedia.org/wiki/Spaghetti_stack)를 살펴보십시오. –

답변

6

는 심볼 테이블 등 (등 로컬 변수/변수/기능/클래스)의 심볼 유형으로 그 식별자에 대한 정보 (전형적으로 범위 이름 접두어) 식별자 매핑 , 데이터 유형, 동일한 스코프의 다른 식별자와 관련된 순서, 소스 코드 행 등을 포함 할 수 있습니다. 심볼 테이블은 추상 구문 트리를 가로 지르고, 현재 어떤 범위에 있는지 추적하고 정보를 추가하여 생성 할 수 있습니다 변수 선언을 누를 때마다 기호 테이블에. 당신의 예에서, 심볼 테이블의 한 부분이 (기호 유형, 데이터 형식, 위치, 소스 코드 라인에 매핑)과 같습니다

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} 

지금, 당신은 모든 변수 참조를 해결할 수 있습니다. 예를 들어 표현식 A := A + 1에서 현재 범위가 MULTIPLY.Aop 인 경우 symnbol 테이블에서 AINT 유형의 입출력 매개 변수이며이 매개 변수가 첫 번째 매개 변수임을 알 수 있습니다 (이 정보는 변수를로드/저장할 수 있도록 스택 주소 오프셋을 생성합니다.