Práctica: Traducción de Infijo a Postfijo

Modifique el programa Jison realizado en la práctica 34.3.1 para traducir de infijo a postfijo. Añada los operadores de comparación e igualdad. Por ejemplo

Infijo Postfijo
a = 3+2*4 3 2 4 * + &a =
b = a == 11 a 11 == &b =
En estas traducciones la notación &a indica la dirección de la variable a y a indica el valor almacenado en la variable a.

Añada sentencias if ... then e if ... then ... else

Para realizar la traducción de estas sentencias añada instrucciones jmp label y jmpz label (por jump if zero) y etiquetas:

Infijo Postfijo
a = (2+5)*3;
if a == 0 then b = 5 else b = 3;
c = b + 1;
        2
        5
        +
        3
        *
        &a
        =
        a
        0
        ==
        jmpz else1
        5
        &b
        =
        jmp endif0
:else1
        3
        &b
        =
:endif0
        b
        1
        +
        &c
        =
Introduzca pruebas unitarias como las descritas en la sección 25.1 (Quick Tip: Quick and Easy JavaScript Testing with “Assert”)

[~/srcPLgrado/jisoninfix2postfix(master)]$ cat test/test.html 
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Testing Our Simple Translator</title>
    <link rel="stylesheet" href="test.css" />
    <script type="text/javascript" src="../calculator.js"></script>

  </head>
  <body>
    <h1>Testing Our Simple Translator
    </h1>
    
    <ul id="output"></ul>
    <script type="text/javascript" src="assert.js"></script>
    
    <script type="text/javascript">

      var r = calculator.parse("a = 4*8");
      assert( /4\s*8\s*[*]\s*a\s*=\s*/.exec(r), "a is 4*8");
      
      r = calculator.parse("a=4;b=a+1");
      r = r.replace(/\s+/g,'');
      var expected = "4a=a1+b=";
      assert( r == expected, "a = 4;\nb=a+1 translated");


      var r = calculator.parse("if a > 0 then b = 1 else b = 2");
      r = r.replace(/\s+/g,'');
      expected = "a 0 > jmpz else1 1 b = jmp endif0 :else1 2 b = :endif0".
                 replace(/\s+/g,'');
      assert( r == expected, "'if a > 0 then b = 1 else b = 2' translated");
    </script>
      See the NetTuts+ tutorial at <a href="http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/">Quick and Easy JavaScript Testing</a>
  </body>
</html>

Casiano Rodríguez León
2013-04-23