Engenharia de Linguagens

Engenharia de Linguagens (2010/11)

Engenharia Gramatical

Exercícios e Exemplos para as aulas

Exemplo 1:

Para apoio a um projecto de Genealogia pretende-se que crie uma linguagem simples que permita descrever Famílias. Cada Família será formada pela identificação dos Progenitores (nome próprio e apelido, separados) e pela lista dos filhos (apenas nome próprio).

Em fases posteriores pretende-se que a sua linguagem permita distinguir entre os Progenitores, a Mãe e o Pai, e depois a Data do casamento (para que o registo genealógico possa também suportar um projecto de investigação em Demografia Histórica).

Após ler o enunciado acima, pede-se que:

  • a) Escreva então uma Gramática Independente de Contexto, GIC, que especifique a Linguagem pretendida (note que o estilo da linguagem (mais ou menos verbosa) e o seu desenho são da sua responsabilidade). Essa GIC deve ir sendo sucessivamente transformada para mostrar diferentes formas de definir a mesma linguagem e ainda para fazer a evolução da linguagem inicial, conforme acima pedido.

  • b) Transforme a GIC numa Gramática Tradutora (GT) para calcular o número de filhos por casal, apresentando esse valor emparelhado com a data do casamento.

  • c) Transforme a GIC numa Gramática Tradutora (GT) para gerar instruções SQL que carreguem para a Tabela "Pessoas" de uma base de dados a informação de cada membro do agregado familiar: Chave, NomeProprio, Apelido, Género (se conhecido); Note que a Chave deve ser gerada pelo seu Processador e que o Apelido dos Filhos deve ser inferido também por esse Processador a partir dos Apelidos dos Progenitores.

  • d) Reescreva as GTs anteriores mas agora usando Gramáticas de Atributos (GA).

Exemplo 2:

Considere a linguagem de programação Lisp na qual um programa é uma Symbolic-Expression (SExp). Sabe-se que uma SExp é um valor atómico (palavra ou numero) ou é uma lista e que cada elemento da lista é uma SExp.

A GIC abaixo define formalmente a linguagem Lisp, de acordo com a descrição acima:

      T = { num, pal, "(", ")" }
      N = { Lisp, SExp, SExplist }
      S = Lisp
      P = {
            p1: Lisp     --> SExp     
            p2: SExp     --> num
            p3: SExp     --> pal
            p4: SExp     --> "(" SExplist ")"
            p5: SExplist --> SExp SExplist
            p6: SExplist --> &
          }

Pede-se então que escreva uma Gramática de Atributos, GA, para

  • a) calcular o nível de aninhamento de cada lista (comece em 1 para a lista principal).

  • b) construir uma lista com todos os "operadores" presentes (considera-se "operador" o 1ºelemento de cada lista).

  • c) verificar se todos os "operadores" usados pertencem ao conjunto de operadores válidos de acordo com uma "biblioteca" fornecida no inicio.

  • d) verificar se o numero de argumentos ("operandos") com que cada operador é invocado condiz com a cardinalidade associada aos operadores válidos na referida "biblioteca".

  • e) substituir todos os "identificadores" usados como operandos pelo valor que lhes é associado nas operações "let".

  • f) gerar código post-fix para o programa ser executado por uma máquina-de-stack (que primeiro carrega os "operandos" e depois os transforma pelos "operadores", substituindo-os pelo resultado).

Exemplo 3:

Considere a linguagem para descrever uma Factura. Sabe-se que uma Factura é composta por um cabeçalho e um corpo, e este é composto por um ou mais movimentos.

A GIC abaixo define formalmente uma primeira versão da linguagem Factura, de acordo com a descrição acima:

      T = { id, str, num}
      N = { Factura, Cabec, Corpo, IdFact, IdE, IdR, ...... }
      S = Factura  
      P = {
            p1:  Factura  --> Cabec Corpo
            p2:  Cabec    --> IdFact IdE IdR
            p3:  IdFact   --> NumFact
            p4:  NumFact  --> id
            p5:  IdE      --> Nome NIF Morada NIB
            p6:  IdR      --> Nome NIF Morada
            p7:  Nome     --> str
            p8:  NIF      --> str
            p9:  Morada   --> str
            p10: NIB      --> str
            p11: Corpo    --> ...
          }

Pede-se então que escreva uma Gramática de Atributos, GA, para

  • a) calcular o total por linha e total geral.

  • b) estender a linguagem original para permitir mais do que uma factura (calculando os mesmos totais).

  • c) modificar a linguagem de modo a suportar inicialmente a descrição do stock (referência, descrição, preço unitário e quantidade em stock); neste caso, cada linha só terá a referência e a quantidade vendida.

  • d) estender a semântica da nova linguagem de modo a também actualizar o stock.

Questões colocadas nas aulas

Q1:

  • (2010-10-18) ...

Fichas Práticas para Avaliação (a resolver fora das aulas)

F1 (2010-11-08): Concluir as alíneas a) b) c) d) do Exercico 2 e entregar devidamente documentado.

F2 (2010-12-06): Resolva o Exemplo 3 devidamente documentado para efeitos de avaliação.

F3 (2011-02-21): Resolva o Exemplo da Calculadora com declarações devidamente documentado para efeitos de avaliação.

F4 (2011-03-01): Resolva o Exercício do LogoLISS devidamente documentado para efeitos de avaliação

F5 (2011-03-21): Faça um estudo sobre métricas e avaliação de qualidade em linguagens de Modelação / Especificação.

Notas e Links úteis

(2011-04-04) Monografias feitas pelos grupos de trabalho sobre Qualidade e Métricas:

(2010-11-08) Novas Scripts (funcionam em sistemas Unix) para agilizar a compilação em Silver:

  • O primeiro script, parse, deve ser colocado na directoria da gramática e permite testar o compilador correspondente a essa gramática com um ou vários ficheiros de input; para executar usar o seguinte comando:
    parse input1 [input2 ...]
  • O segundo, cpgr, deve ser colocado na pasta grammars e duplica uma gramática para outra pasta garantindo a compilação; para executar usar o seguinte comando:
    cpgr pastaOrigem pastaDestino


r13 - 04 Apr 2011 - 22:44:05 - PedroRangelHenriques
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM