우리는 컴파일러를 지정할 과제가 있습니다. 우리는 이미 어휘 및 구문 분석을 만들었지 만 우리는 중간 코드 생성에 박차를 가하고 있습니다. 우리는 중간 코드 생성을 진행하기 위해 심볼 테이블을 구현해야한다는 것을 알았고 우리는 그것을 어떻게 수행하고 무엇을 포함 하는지를 모른다.기호 테이블을 만드는 방법
아래 코드가 주어지면 기호 테이블에 무엇이 들어 있습니까? (코드는 아래에 설명 된 교육 언어로 작성되었습니다.)
또한 기호 테이블에 범위를 구현할 수 있습니까?
<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
제 프로그래밍 언어가 항상 제게 큰 소리로 외치는 것이 싫지만 ... – Bobby
@Bobby, 그럼 VT50을 사용하지 않아서 다행입니다. –
[cactus stacks] (http://en.wikipedia.org/wiki/Spaghetti_stack)를 살펴보십시오. –