|
|
(2 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>
| |
| | |
| 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 '''id + id := id''' é ilegal. No entanto, as expressões '''id := ( id + id )''', quer '''id := ( id := id )''', ou ainda '''( id ) := ( id := ( id + id ) )''' são autorizadas.
| |
| | |
| Considere que o operador ''':=''' é menos prioritário que o operador '''+''', além de associativo à direita, enquanto o operador '+' é associativo à esquerda.
| |
| | |
| Escreva um esquema de tradução que usa um atributo herdado (e nenhum sintetizado) chamado '''lado''' associado ao símbolo '''E''', 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.
| |
| | |
| == Solution ==
| |
| | |
| [[category:Compiladores]] | |
| [[category:Ensino]]
| |