Attribute Grammars/Exercise 4: Expressions with bases (1)

From Wiki**3

< Attribute Grammars
Revision as of 18:43, 25 April 2010 by Root (talk | contribs) (Solution)

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 * R1.base + DIG.value; }
R -> DIG       { R.value = DIG.value; }