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

From Wiki**3

< Attribute Grammars
(New page: <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...)
 
(Problem (in Portuguese))
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
== Problem (in Portuguese) ==
 
<p><span lang="pt">A gram&aacute;tica seguinte admite atribui&ccedil;&otilde;es dentro de express&otilde;es.</span></p>
 
<p><span lang="pt">A gram&aacute;tica seguinte admite atribui&ccedil;&otilde;es dentro de express&otilde;es.</span></p>
<table border="0" cellpadding="3">
+
S E
<tr>
+
E E + E | E := E | ( E ) | id
<td align="right">S</td>
+
 
<td align="left">-&gt;</td>
+
Quando uma express&atilde;o est&aacute; a ser analisada &eacute; necess&aacute;rio diferenciar os casos onde a express&atilde;o est&aacute; &agrave; direita, daqueles onde a express&atilde;o est&aacute; &agrave; esquerda, do sinal de atribui&ccedil;&atilde;o. Note que n&atilde;o &eacute; poss&iacute;vel atribuir um valor a uma express&atilde;o. Por exemplo a express&atilde;o '''id + id := id''' &eacute; ilegal. No entanto, as express&otilde;es '''id := ( id + id )''', quer    '''id := ( id := id )''', ou ainda '''( id ) := ( id := ( id + id ) )''' s&atilde;o autorizadas.
<td align="left">E</td>
+
 
</tr>
+
Considere que o operador ''':=''' &eacute; menos priorit&aacute;rio que o operador '''+''', al&eacute;m de associativo &agrave; direita, enquanto o operador '+' &eacute; associativo &agrave; esquerda.
<tr>
+
 
<td align="right">E</td>
+
Escreva um esquema de tradu&ccedil;&atilde;o que usa um atributo herdado (e nenhum sintetizado) chamado '''lado''' associado ao s&iacute;mbolo '''E''', e que determina se a express&atilde;o corrente est&aacute; &agrave; direita ou &agrave; esquerda da atribui&ccedil;&atilde;o. O c&oacute;digo associado &agrave; gram&aacute;tica emitir&aacute; uma mensagem de erro caso a express&atilde;o seja ilegal.
<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>
 
</table>
 
<p><span lang="pt">Quando uma express&atilde;o est&aacute; a ser analisada &eacute; necess&aacute;rio diferenciar os casos onde a express&atilde;o est&aacute; &agrave; direita, daqueles onde a express&atilde;o est&aacute; &agrave; esquerda, do sinal de atribui&ccedil;&atilde;o. Note que n&atilde;o &eacute; poss&iacute;vel atribuir um valor a uma express&atilde;o. Por exemplo a express&atilde;o   <strong>id + id := id</strong> &eacute; ilegal. No entanto, as express&otilde;es   <strong>id := ( id + id )</strong>, quer    <strong>id := ( id := id )</strong>, ou ainda   <strong>( id ) := ( id := ( id + id ) )</strong> s&atilde;o autorizadas.</span></p>
 
<p><span lang="pt">Considere que o operador ':=' &eacute; menos priorit&aacute;rio que o operador '+', al&eacute;m de associativo &agrave; direita, enquanto o operador '+' &eacute; associativo &agrave; esquerda.</span></p>
 
<p><span lang="pt">Escreva um esquema de tradu&ccedil;&atilde;o que usa um atributo herdado ( e nenhum sintetizado ) chamado   <tt>lado</tt> associado ao s&iacute;mbolo   <tt>E</tt>, e que determina se a express&atilde;o corrente est&aacute; &agrave; direita ou &agrave; esquerda da atribui&ccedil;&atilde;o. O c&oacute;digo associado &agrave; gram&aacute;tica emitir&aacute; uma mensagem de erro caso a express&atilde;o seja ilegal.</span></p>
 
  
 
== Solution ==
 
== Solution ==
  
[[category:Compilers]]
+
S -> E { E.lado = 'D'; }
[[category:Teaching]]
+
E<sub>1</sub> -> E<sub>2</sub> + E<sub>3</sub>  { if (E<sub>1</sub>.lado == 'E') error(); else { E<sub>2</sub>.lado = 'D'; E<sub>3</sub>.lado = 'D'; } }
 +
E<sub>1</sub> -> E<sub>2</sub> := E<sub>3</sub> { if (E<sub>1</sub>.lado == 'E') error(); else { E<sub>2</sub>.lado = 'E'; E<sub>3</sub>.lado = 'D'; } }
 +
E<sub>1</sub> -> ( E<sub>2</sub> ) { E<sub>2</sub>.lado = E<sub>1</sub>.lado; }
 +
E -> id { /* nothing to do */ }
 +
 
 +
[[category:Compiladores]]
 +
[[category:Ensino]]

Latest revision as of 11:59, 2 May 2024

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

S -> E { E.lado = 'D'; }
E1 -> E2 + E3  { if (E1.lado == 'E') error(); else { E2.lado = 'D'; E3.lado = 'D'; } }
E1 -> E2 := E3 { if (E1.lado == 'E') error(); else { E2.lado = 'E'; E3.lado = 'D'; } }
E1 -> ( E2 ) { E2.lado = E1.lado; }
E -> id { /* nothing to do */ }