Attribute Grammars/Exercise 3: Expressions: Difference between revisions
From Wiki**3
< Attribute Grammars
No edit summary |
No edit summary |
||
Line 13: | Line 13: | ||
</tr> | </tr> | ||
</table> | </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 == | == Solution == |
Revision as of 15:08, 10 April 2018
Problem (in Portuguese)
A gramática seguinte admite atribuições dentro de expressões.
S | -> | E |
E | -> | E + E | E := E | ( E ) | id |
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.