(→Solution) |
(→Problem (in Portuguese)) |
||
Line 8: | Line 8: | ||
O operador @ tem precedência superior aos operadores + (soma) e - (subtracção). Todos os operadores são associativos à esquerda. Podem ser utilizados parêntesis para alteração das precedências. | O operador @ tem precedência superior aos operadores + (soma) e - (subtracção). Todos os operadores são associativos à esquerda. Podem ser utilizados parêntesis para alteração das precedências. | ||
− | Exemplo: à sequência ((1@33 + 34)@20 + 70@15 + 2)@10 corresponde o valor 1.9366. | + | Exemplo: à sequência '''((1@33 + 34)@20 + 70@15 + 2)@10''' corresponde o valor 1.9366. |
# 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 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 e o grafo de dependências para a frase (15@30 + 3)@20 (valor 1.5). | + | # Identifique a árvore de sintaxe decorada e o grafo de dependências para a frase '''(15@30 + 3)@20''' (valor 1.5). |
# 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. | # 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. | ||
Pretende-se criar uma gramática atributiva que calcule no símbolo inicial o valor das expressões fornecidas. As expressões são codificadas
O operador @ tem precedência superior aos operadores + (soma) e - (subtracção). Todos os operadores são associativos à esquerda. Podem ser utilizados parêntesis para alteração das precedências.
Exemplo: à sequência ((1@33 + 34)@20 + 70@15 + 2)@10 corresponde o valor 1.9366.
Since + and - have the same precedence, they are defined in the same rule (E), and are defined so that they operate on symbols which may contain the @ operator. Since all operators are left-associative, the corresponding rules in the grammar are left-recursive.
E0 -> E1 + T { E0.val = E1.val + T.val; } E0 -> E1 - T { E0.val = E1.val + T.val; } E -> T { E.val = T.val; } T0 -> T1 @ F { T0.val = T1.val * F.val / 100; } T -> F { T.val = F.val; } F -> ( E ) { F.val = E.val; } F -> N { F.val = N.val; } N0 -> N1 DIG { N0.val = N1.val * 10 + DIG.val; } N -> DIG { N.val = DIG.val; }
The following is the annotated tree.