Semântica


Considere a gramática seguinte, onde os operadores  WRITE(não associativo),  '='(associativo à direita) e '+'(associativo à esquerda) têm prioridades crescentes:

 

 

prog -> decls exprs  '.'
decls -> ø
  | decls decl  ';'
decl -> INT  ID
  | STR  ID init
init -> ø
  | '='  STRING
exprs -> expr
  | exprs  ',' expr
expr -> INTEGER
  | ID
  | ID  '=' expr
  | expr  '+' expr
  | WRITE expr
  | INT ID

Nota: ø representra a produção nula.

  1. Efectue as verificações semânticas necessárias, utilizando as rotinas de manipulação de identificadores disponibilizadas nos ficheiros  tabid.h e  tabid.c
  2. Construa a árvore sintáctica, utilizando as rotinas disponibilizadas nos ficheiros  node.h e  node.c.
  3. Gere um programa em  C equivalente, a partir da árvore sintáctica.
  • Considere em  C uma variável declarada estática a partir de função:
  1. Indique justificadamente qual a área de dados a que pertence.
  2. Comente justificadamente se o valor desta variável pode ser modificado de outra função.
  3. Caso a função que contém a variável estática seja invocada recursivamente justifique quantas instâncias da variável existem e se os seus valores são iguais ou distintos.
  4. Indique justificadamente se uma função pode devolver o endereço de uma variável declarada estática, sem criar  dangling references.
  • Os ficheiros de declaração em  C incluem a declaração de estruturas, entre outros. Indique a necessidade de utilizar em  C uma  Makefile para garantir que todos os ficheiros fonte estão compilados com a mesma versão da estrutura.
  • Discuta as diferenças entre as cadeias de caracteres  x e  y na declaração  char *x="uma string", y[]="outra string";
  • Indique justificadamente se a linguagem  C possui algum tipo de polimorfismo. Em caso afirmativo, apresente exemplos.
  • Numa linguagem com espaços de nomes distintos para constantes, variáveis e funções indique as alterações a fazer à tabela de símbolos e às funções que a manipulam.