Compiladores
(Aula do dia 30/08/2000)

Escolher uma das maneiras abaixo de se criar um
rvore de execuo para o exemplo:

v <= 5 + 3 + a #

a)
b)

3)

Obs.: Devemos tratar precedncia de operadores.

2) Termo
A avaliao de qualquer programa (corpo) ou funo primitiva
retornar um termo. Um termo  composto de um campo valor e
um campo tipo, que indica o tipo do valor. Os tipos so:
B - boolean
E - erro
I - integer
S - string

Um termo pode ser Verdadeiro ou falso, mas s ser falso
quando o tipo for B e o valor for F (falso).


3) Trabalho

O compilador inicialmente ir carregar a tabela de funes
primitivas e mostrar um menu com as opes abaixo,
onde as em negrito so as obrigatrias e as demais so opcionais:

Traduza_Arq - pede o nome do arquivo que contm o programa
   que ser avaliado e o traduz. Os programas tero extenso l2k.
Traduza_Tec - recebe do teclado o programa a ser avaliado e o traduz.
Executa_Prog - pede o nome do programa a ser executado e o executa.
Mostre Programas - Lista os programas carregados na memria.
Elimina Programa - pede qual programa a ser eliminado e o elimina.

4) Procedimentos:

Proc ExecutaProg (prog: Tprog; VAR termo: Ttermo)
VAR   ArvExec: TarvExec;
Res: boolean;
BEGIN
   ConsultaCorpo(prog,ArvExec,res);
   IF res
     THEN ExecCorpo(ArvExec,termo)
END;

 Proc ExecutaCorpo (ArvExec: TArvExec; VAR termo: Ttermo)
 BEGIN
      IF ArvExec^.tipo=F
       THEN ExecPrim(ArvExec^.esq, ArvExec^.Dir,termo)
       ELSE
            IF ArvExec^.tipo = OpE
            THEN
            BEGIN
               ExecCorpo(ArvExec^.Esq,termo);
               IF ((termo^.tipo = B) AND (termo^.valor = F)) OR (termo^.tipo=E)
               THEN
               ELSE execCorpo(ArvExec^.Dir,termo)
               END;
             ELSE
            ExecCorpo(ArvExec^.Esq,termo1);
            ExecCorpo(ArvExec^.Dir,termo2);
            ExecOpr(ArvExec^.tipo,termo1,termo2,termo);
   END;

END;

Obs.: O tipo em ArvExec  pode ser:
F - Folha
& - OperE
+ - OperA
- - OperS
*  - OperM
