Inicio de los Tipos Básicos

Al comienzo y al final del análisis del programa fuente se inician mediante la llamada a reset_file_scope_vars los tipos básicos INT, CHAR y VOID. Este último se utilizará en las expresiones de tipo para representar la ausencia de tipo.

pl@nereida:~/doc/casiano/PLBOOK/PLBOOK/code/Simple-Types/lib/Simple$ \
                     sed -ne '/^program:/,/^;/p' Types.eyp | cat -n
 1  program:
 2        {
 3          reset_file_scope_vars();
 4        }
 5      definition<%name PROGRAM +>.program
 6        {
 7          $program->{symboltable} = { %st };  # creates a copy of the s.t.
 8          $program->{depth} = 0;
 9          $program->{line}  = 1;
10          $program->{types} = { %type };
11          $program->{lines} = $tokenend;
12
13          my ($nondec, $declared) = $ids->end_scope($program->{symboltable}, $program, 'type');
14
15          if (@$nondec) {
16            warn "Identifier ".$_->key." not declared at line ".$_->line."\n" for @$nondec;
17            die "\n";
18          }
19
20          # Type checking: add a direct pointer to the data-structure
21          # describing the type
22          $_->{t} = $type{$_->{type}} for @$declared;
23
24          my $out_of_loops = $loops->end_scope($program);
25          if (@$out_of_loops) {
26            warn "Error: ".ref($_)." outside of loop at line $_->{line}\n" for @$out_of_loops;
27            die "\n";
28          }
29
30          # Check that are not dangling breaks
31          reset_file_scope_vars();
32
33          $program;
34        }
35  ;

Se procede a establecer el atributo t como enlace directo a la expresión de tipo. Lo mismo se hace en las funciones y en los bloques.

Sigue el código de reset_file_scope_vars:

pl@nereida:~/doc/casiano/PLBOOK/PLBOOK/code/Simple-Types/lib/Simple$ \
                  sed -ne '/^sub re.*vars/,/^}/p' Types.eyp | cat -n
 1  sub reset_file_scope_vars {
 2    %st = (); # reset symbol table
 3    ($tokenbegin, $tokenend) = (1, 1);
 4    %type = ( INT  => Parse::Eyapp::Node->hnew('INT'),
 5              CHAR => Parse::Eyapp::Node->hnew('CHAR'),
 6              VOID => Parse::Eyapp::Node->hnew('VOID'),
 7            );
 8    $depth = 0;
 9    $ids = Parse::Eyapp::Scope->new(
10             SCOPE_NAME => 'block',
11             ENTRY_NAME => 'info',
12             SCOPE_DEPTH => 'depth',
13    );
14    $loops = Parse::Eyapp::Scope->new(
15             SCOPE_NAME => 'exits',
16    );
17    $ids->begin_scope();
18    $loops->begin_scope(); # just for checking
19  }

Casiano Rodríguez León
2009-12-09