|
|
(One intermediate revision 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 -> E</td>
| |
| </tr>
| |
| <tr>
| |
| <td align="right">E -> E '''+''' E | E ''':=''' E | '''(''' E ''')''' | '''id'''</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]]
| |