Difference between revisions of "Attribute Grammars/Exercise 4: Expressions with bases (1)"

From Wiki**3

< Attribute Grammars
(Solution)
Line 17: Line 17:
 
  N -> R<sub>1</sub> '''#''' R<sub>2</sub>  { <font color="brown">R<sub>1</sub>.base = 10; R<sub>2</sub>.base = R<sub>1</sub>.value;</font> <font color="blue">N.value = R<sub>2</sub>.value;</font> }
 
  N -> R<sub>1</sub> '''#''' R<sub>2</sub>  { <font color="brown">R<sub>1</sub>.base = 10; R<sub>2</sub>.base = R<sub>1</sub>.value;</font> <font color="blue">N.value = R<sub>2</sub>.value;</font> }
 
  N -> R        { <font color="brown">R.base = 10;</font> <font color="blue">N.value = R.value;</font> }
 
  N -> R        { <font color="brown">R.base = 10;</font> <font color="blue">N.value = R.value;</font> }
  R<sub>0</sub> -> R<sub>1</sub> DIG  { <font color="brown">R<sub>1</sub>.base = R<sub>0</sub>.base;</font> <font color="blue">R<sub>0</sub>.value = R<sub>1</sub>.value * R<sub>1</sub>.base + DIG.value;</font> }
+
  R<sub>0</sub> -> R<sub>1</sub> DIG  { <font color="brown">R<sub>1</sub>.base = R<sub>0</sub>.base;</font> <font color="blue">R<sub>0</sub>.value = R<sub>1</sub>.value * R<sub>0</sub>.base + DIG.value;</font> }
 
  R -> '''DIG'''      { <font color="blue">R.value = DIG.value;</font> }
 
  R -> '''DIG'''      { <font color="blue">R.value = DIG.value;</font> }
  
 
[[category:Compilers]]
 
[[category:Compilers]]
 
[[category:Teaching]]
 
[[category:Teaching]]

Revision as of 19:24, 25 April 2010

Problem (in Portuguese)

Pretende-se criar uma gramática atributiva que some uma sequência de inteiros separados por +. Os inteiros podem estar codificados sob o formato decimal (sequência de dígitos entre 0 e 9, representados pelo elemento lexical DIG), ou em qualquer base entre 2 e 36 (sequências de dígitos de 0 a 9 e, acima de 10, também contendo as letras de A a Z que forem necessárias para representar todos os valores da base). Quando a base não é decimal, a representação do inteiro é precedida pelo valor decimal da base e pelo símbolo #.

O exemplo seguinte tem como resultado 241+33=274.

2 4 1 + 1 7 # 1 G

Crie a gramática para realizar a função descrita e construa a árvore semântica anotada para a entrada acima.

Solution

The grammar uses only one set of rules for all bases (the default is 10, as shown in the second production for N). The inherited attribute base contains the base value, while the synthesized attribute value contains the actual number value.

E0 -> E1 + N   { E0.value = E1.value + N.value; }
E -> N         { E.value = N.value; }
N -> R1 # R2   { R1.base = 10; R2.base = R1.value; N.value = R2.value; }
N -> R         { R.base = 10; N.value = R.value; }
R0 -> R1 DIG   { R1.base = R0.base; R0.value = R1.value * R0.base + DIG.value; }
R -> DIG       { R.value = DIG.value; }