Attribute Grammars/Exercise 12: Operadores Lógicos: Difference between revisions
From Wiki**3
< Attribute Grammars
(Created page with "== Problema == == Gramática Atributiva == == Árvore Sintáctica Decorada e Grafo de Dependências == == Especificação YACC == category:Compiladores category:Ensi...") |
|||
Line 1: | Line 1: | ||
== Problema == | == Problema == | ||
Pretende-se construir uma gramática atributiva (em C++) que avalie expressões lógicas. As expressões podem ser constituídas por literais '''p''' ou '''q''', ou por aplicações dos operadores lógicos: '''@''' (conjunção lógica – operador binário), '''/''' (disjunção lógica inclusiva – operador binário), '''#''' (negação lógica – operador unário). Assuma que os terminais '''p''' e '''q''' têm definido o atributo booleano '''val''' (respectivamente, igual ao valor C++ '''true''', para ''verdadeiro''; e '''false''', para ''falso''). O operador unário tem precedência superior aos binários e '''@''' tem precedência superior a '''/'''. É possível usar parênteses (curvos) para alterar as precedências. | |||
# Identifique a gramática atributiva correspondente ao problema. Descreva o significado e o tipo de cada atributo. Que tipo de gramática obteve? | |||
# Identifique a árvore de sintaxe decorada (apresentando o valor lógico da expressão no nó raiz da árvore) e o grafo de dependências para a expressão '''#(p@q)@(p/q)''' | |||
# Escreva uma especificação YACC que implemente a gramática descrita em 1. Codifique toda a especificação (incluindo as zonas de declarações e de regras) e todas as funções auxiliares. '''Não utilizar variáveis globais.''' | |||
== Gramática Atributiva == | == Gramática Atributiva == |
Revision as of 18:03, 22 June 2015
Problema
Pretende-se construir uma gramática atributiva (em C++) que avalie expressões lógicas. As expressões podem ser constituídas por literais p ou q, ou por aplicações dos operadores lógicos: @ (conjunção lógica – operador binário), / (disjunção lógica inclusiva – operador binário), # (negação lógica – operador unário). Assuma que os terminais p e q têm definido o atributo booleano val (respectivamente, igual ao valor C++ true, para verdadeiro; e false, para falso). O operador unário tem precedência superior aos binários e @ tem precedência superior a /. É possível usar parênteses (curvos) para alterar as precedências.
- Identifique a gramática atributiva correspondente ao problema. Descreva o significado e o tipo de cada atributo. Que tipo de gramática obteve?
- Identifique a árvore de sintaxe decorada (apresentando o valor lógico da expressão no nó raiz da árvore) e o grafo de dependências para a expressão #(p@q)@(p/q)
- Escreva uma especificação YACC que implemente a gramática descrita em 1. Codifique toda a especificação (incluindo as zonas de declarações e de regras) e todas as funções auxiliares. Não utilizar variáveis globais.