|
|
(3 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| == Problem (in Portuguese) ==
| | #REDIRECT [[ist:Attribute Grammars/Exercise 3: Expressions]] |
| <p><span lang="pt">A gramática seguinte admite atribuições dentro de expressões.</span></p>
| |
| <table border="0" cellpadding="3">
| |
| <tr>
| |
| <td align="right">S</td>
| |
| <td align="left">-></td>
| |
| <td align="left">E</td>
| |
| </tr>
| |
| <tr>
| |
| <td align="right">E</td>
| |
| <td align="left">-></td>
| |
| <td align="left">E <strong>+</strong> E | E <strong>:=</strong> E | <strong>(</strong> E <strong>)</strong> | <strong>id</strong></td>
| |
| </tr>
| |
| </table>
| |
| <p><span lang="pt">Quando uma expressão está a ser analisada é necessário diferenciar os casos onde a expressão está à direita, daqueles onde a expressão está à esquerda, do sinal de atribuição. Note que não é possível atribuir um valor a uma expressão. Por exemplo a expressão <strong>id + id := id</strong> é ilegal. No entanto, as expressões <strong>id := ( id + id )</strong>, quer <strong>id := ( id := id )</strong>, ou ainda <strong>( id ) := ( id := ( id + id ) )</strong> são autorizadas.</span></p>
| |
| <p><span lang="pt">Considere que o operador ':=' é menos prioritário que o operador '+', além de associativo à direita, enquanto o operador '+' é associativo à esquerda.</span></p>
| |
| <p><span lang="pt">Escreva um esquema de tradução que usa um atributo herdado ( e nenhum sintetizado ) chamado <tt>lado</tt> associado ao símbolo <tt>E</tt>, e que determina se a expressão corrente está à direita ou à esquerda da atribuição. O código associado à gramática emitirá uma mensagem de erro caso a expressão seja ilegal.</span></p>
| |
| | |
| == Solution ==
| |
| | |
| [[category:Compiladores]] | |
| [[category:Ensino]]
| |