Difference between revisions of "Attribute Grammars/Exercise 3: Expressions"

From Wiki**3

< Attribute Grammars
(Problem (in Portuguese))
Line 3: Line 3:
 
<table border="0" cellpadding="3">
 
<table border="0" cellpadding="3">
 
<tr>
 
<tr>
<td align="right">S</td>
+
<td align="right">S -&gt; E</td>
<td align="left">-&gt;</td>
 
<td align="left">E</td>
 
 
</tr>
 
</tr>
 
<tr>
 
<tr>
<td align="right">E</td>
+
<td align="right">E -&gt; E '''+''' E | E ''':=''' E | '''(''' E ''')''' | '''id'''</td>
<td align="left">-&gt;</td>
 
<td align="left">E       <strong>+</strong> E | E       <strong>:=</strong> E |       <strong>(</strong> E       <strong>)</strong> |       <strong>id</strong></td>
 
 
</tr>
 
</tr>
 
</table>
 
</table>

Revision as of 17:09, 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.

Solution