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:
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