Actualización:

Problemas resueltos:

- Declaraciones globales y dentro de estructuras: Antes declarar algo dentro de
una estructura no se permitia si el nombre ya había sido declarado en el scope
global. Ya se puede, :).

- Redeclaraciones de funciones, ya se verifica y se avisa cuando ocurre.

- No reconocer a los tipos UNION como un tipo con una tabla de símbolos
asociada.

- Verificación de argumentos en la llamada a funciones y los parámetros
esperados.

Problemas que aparecieron:

- Al momento de generar el temporal de código intermedio para atributos anidados
de una estructura, revisa la tabla de símbolos global y no la asociada a la
estructura padre.

Ejemplo:

declare {
    union R {
        integer a,
        record U {
            integer b;
        }
        U array c[5];
    }
    R union d;
}

...

d.c[1].b := 1
  ^
Aquí dice que el tipo de c (que es 'record U') no ha sido declarado en el
contexto actual. Lo que es falso porque es parte de la declaración de la
estructura padre R.

Estuve revisando la pila de ejecución para ver dónde da el error y va así:

Línea GuavaParser.yy:1320 en la regla expID '.' identificador lcorchetesExp
Aplicación de función revision_scope_id
|
Línea GuavaDriver.cc:807
Aplicación de función newtemp
|
Línea GuavaDriver.cc:515
Aplicación de función obtener_tipo <<<<<<<<<< AQUÍ DA EL ERROR

[Si te fijas, obtener tipo busca en la tabla de símbolos global y no la
asociada a la estructura padre de -en nuestro ejemplo- U, que es R.]

-Maik.