((((4+2)*3)+1)*2)*2

add r0 4 0
add r1 1 0
mul r2 r0 r1
add r3 2 0
add r4 1 0
mul r5 r3 r4
add r6 0 0
add r7 r5 r6
add r8 r2 r7
add r9 3 0
add r10 1 0
mul r11 r9 r10
mul r12 r8 r11
add r13 0 0
add r14 r12 r13
add r15 1 0
mul r16 r14 r15
add r17 1 0
add r18 1 0
mul r19 r17 r18
add r20 0 0
add r21 r19 r20
add r22 r16 r21
add r23 2 0
add r24 1 0
mul r25 r23 r24
mul r26 r22 r25
add r27 0 0
add r28 r26 r27
add r29 2 0
add r30 1 0
mul r31 r29 r30
mul r32 r28 r31
add r33 0 0
add r34 r32 r33
4
1
4
2
1
2
0
2
6
3
1
3
18
0
18
1
18
1
1
1
0
1
19
2
1
2
38
0
38
2
1
2
76
0
76
4 + 0
1 + 0
(4 + 0)*(1 + 0)
2 + 0
1 + 0
(2 + 0)*(1 + 0)
0 + 0
(2 + 0)*(1 + 0) + 0 + 0
(4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0
3 + 0
1 + 0
(3 + 0)*(1 + 0)
((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0))
0 + 0
((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0
1 + 0
(((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0)
1 + 0
1 + 0
(1 + 0)*(1 + 0)
0 + 0
(1 + 0)*(1 + 0) + 0 + 0
(((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0
2 + 0
1 + 0
(2 + 0)*(1 + 0)
((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0))
0 + 0
((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0
2 + 0
1 + 0
(2 + 0)*(1 + 0)
(((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0)*((2 + 0)*(1 + 0))
0 + 0
(((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0
undefined

  <script>
  /*
  Ohne Beseitigung der Linksrekursion:
  expr ::= expr '+' term | term
  term ::= term '*' fact | fact
  fact ::= const | '(' expr ')'
  
  Mit Beseitunggung der Linksrekursion
  
  expr ::= term expr2
  expr2 ::= '+' term expr2 | e
  term ::= fact term2
  term2 ::= '*' fact term2 | e
  fact ::= const | '(' expr ')'
  */
  
  var lexstream = "((((4+2)*3)+1)*2)*2";
  var lexstreami = 0;
  var regcount = 0;
  var compileroutput = "";
  var compileroutputlines = new Array ();
  var code = new Array (new Array ());
  var regs = new Array ();
  var stregs = new Array ();
  
  window.document.write (lexstream + "

");
  expr ();
  
  window.document.write (compileroutput);
  vm ();
  
  var n = reversecompiler ();
  
  for (i = 0;  i < n;  i++)
    window.document.write (stregs [i] + "
");
  
  function lexer () {
    var x;
    if (lexstream.charAt (lexstreami) == ' ') {
        while (lexstream.charAt (lexstreami) == ' ')
            lexstreami++;
    }
    if (lexstream.charAt (lexstreami) == '*') {
        lexstreami++;
        return '*';
    }
    else if (lexstream.charAt (lexstreami) == '+') {
        lexstreami++;
        return '+';
    }
    else if (lexstream.charAt (lexstreami) == '(') {
        lexstreami++;
        return '(';
    }
    else if (lexstream.charAt (lexstreami) == ')') {
        lexstreami++;
        return ')';
    }
    else if ((lexstream.charAt (lexstreami) >= '0') && (lexstream.charAt (lexstreami) <= '9')) {
        x = lexstream.charAt (lexstreami);
        lexstreami++;
        return x;
    }
  }
    
  function vm () {
    var i, j;
    var a, b, c;
    
    compileroutputlines = compileroutput.split ("
");
    
    for (i = 0;  i < compileroutputlines.length;  i++) {
        code [i] = compileroutputlines [i].split (" ");
    }
        
    for (i = 0;  i < compileroutputlines.length;  i++) {
        if (code[i][0].localeCompare ("add") == 0) {
            if (code[i][2].substring(0,1).localeCompare ("r") == 0)
                a = regs [parseInt(code[i][2].substring(1))];
            else 
                a = parseInt (code[i][2]);
            if (code[i][3].substring(0,1).localeCompare ("r") == 0)
                b = regs [parseInt(code[i][3].substring(1))];
            else 
                b = parseInt (code[i][3]);
            c = a + b;
            regs [parseInt(code[i][1].substring(1))] = c;
        }
        else if (code[i][0].localeCompare ("mul") == 0) {
            if (code[i][2].substring(0,1).localeCompare ("r") == 0)
                a = regs [parseInt(code[i][2].substring(1))];
            else 
                a = parseInt (code[i][2]);
            if (code[i][3].substring(0,1).localeCompare ("r") == 0)
                b = regs [parseInt(code[i][3].substring(1))];
            else 
                b = parseInt (code[i][3]);
            c = a * b;
            regs [parseInt(code[i][1].substring(1))] = c;
        }
    }
    }
   
  function reversecompiler () {
    var i, j;
    var a, b, c;
    
    compileroutputlines = compileroutput.split ("
");
    
    for (i = 0;  i < compileroutputlines.length;  i++) {
        code [i] = compileroutputlines [i].split (" ");
    }
        
    for (i = 0;  i < compileroutputlines.length;  i++) {
        if (code[i][0].localeCompare ("add") == 0) {
            if (code[i][2].substring(0,1).localeCompare ("r") == 0)
                a = stregs [parseInt(code[i][2].substring(1))];
            else 
                a = parseInt (code[i][2]);
            if (code[i][3].substring(0,1).localeCompare ("r") == 0)
                b = stregs [parseInt(code[i][3].substring(1))];
            else 
                b = parseInt (code[i][3]);
            stregs [parseInt(code[i][1].substring(1))] = a.toString() + " + " + b.toString();
        }
       
       
       else if (code[i][0].localeCompare ("mul") == 0) {
            if (code[i][2].substring(0,1).localeCompare ("r") == 0)
                a = stregs [parseInt(code[i][2].substring(1))];
            else 
                a = parseInt (code[i][2]);
            if (code[i][3].substring(0,1).localeCompare ("r") == 0)
                b = stregs [parseInt(code[i][3].substring(1))];
            else 
                b = parseInt (code[i][3]);
            stregs [parseInt(code[i][1].substring(1))] = "(" + a + ")*(" + b + ")";
        }
    }
    
    for (i = 0;  i < regs.length;  i++) {
        window.document.write (regs [i] + "
");
    }
    return compileroutputlines.length;
    
    
  }
  
  function expr () {
    var a, b;
    a = term ();
    b = expr2 ();
    compileroutput = compileroutput + "add r" + regcount.toString () +  " " + a + " " + b + "
";
    return "r" + (regcount++).toString ();
  }
  function expr2 () {
    var a, b;
    if (lexer () == '+') {
        a = term ();
        b = expr2 ();
        compileroutput = compileroutput + "add r" + regcount.toString () + " " + a + " " + b + "
";
        return "r" + (regcount++).toString ();
    }
    else {
        lexstreami--;
        compileroutput = compileroutput + "add r" + regcount.toString () + " 0 0 
";
        return "r" + (regcount++).toString ();
    }
        
        
  }
  function term () {
    var a, b;
    a = fact ();
    b = term2 ();
    compileroutput = compileroutput + "mul r" + regcount.toString () +  " " + a + " " + b + "
";
    return "r" + (regcount++).toString ();
  }
  function term2 () {
    var a, b;
    if (lexer () == '*') {
        a = fact ();
        b = term2 ();
        compileroutput = compileroutput + "mul r" + regcount.toString () +  " " + a + " " + b + "
";
        return "r" + (regcount++).toString ();
    }
    else {
        lexstreami--;
        compileroutput = compileroutput + "add r" + regcount.toString () + " 1 0 
";
        return "r" + (regcount++).toString ();    
    }
  }
  function fact () {
    var a;
    var ch;
    if ((ch = lexer ()) == '(') {
        a = expr ();
        if ((ch = lexer ()) != ')') {
            error ();
        }
        return a;
    }
    else if ((ch >= '0') && (ch <= '9')) {
        compileroutput = compileroutput + "add r" + regcount.toString () + " " + ch +  " 0 
";
        return "r" + (regcount++).toString ();        
    }
    else
        error ();
  }
  function error () {
    alert ("error");
    exit (2);
  }
    var x = document.getElementById ("myscript");
  var content = myscript.innerHTML;
  content = content.replace ("<", "<");
  content = content.replace (">", ">");
  content = content.replace(/(?:\r\n|\r|\n)/g, '
');
  content = content.replace(/ /g, " "); 
  window.document.write (content);
  
  ((((4+2)*3)+1)*2)*2

add r0 4 0 
add r1 1 0 
mul r2 r0 r1
add r3 2 0 
add r4 1 0 
mul r5 r3 r4
add r6 0 0 
add r7 r5 r6
add r8 r2 r7
add r9 3 0 
add r10 1 0 
mul r11 r9 r10
mul r12 r8 r11
add r13 0 0 
add r14 r12 r13
add r15 1 0 
mul r16 r14 r15
add r17 1 0 
add r18 1 0 
mul r19 r17 r18
add r20 0 0 
add r21 r19 r20
add r22 r16 r21
add r23 2 0 
add r24 1 0 
mul r25 r23 r24
mul r26 r22 r25
add r27 0 0 
add r28 r26 r27
add r29 2 0 
add r30 1 0 
mul r31 r29 r30
mul r32 r28 r31
add r33 0 0 
add r34 r32 r33
4
1
4
2
1
2
0
2
6
3
1
3
18
0
18
1
18
1
1
1
0
1
19
2
1
2
38
0
38
2
1
2
76
0
76
4 + 0
1 + 0
(4 + 0)*(1 + 0)
2 + 0
1 + 0
(2 + 0)*(1 + 0)
0 + 0
(2 + 0)*(1 + 0) + 0 + 0
(4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0
3 + 0
1 + 0
(3 + 0)*(1 + 0)
((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0))
0 + 0
((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0
1 + 0
(((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0)
1 + 0
1 + 0
(1 + 0)*(1 + 0)
0 + 0
(1 + 0)*(1 + 0) + 0 + 0
(((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0
2 + 0
1 + 0
(2 + 0)*(1 + 0)
((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0))
0 + 0
((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0
2 + 0
1 + 0
(2 + 0)*(1 + 0)
(((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0)*((2 + 0)*(1 + 0))
0 + 0
(((((4 + 0)*(1 + 0) + (2 + 0)*(1 + 0) + 0 + 0)*((3 + 0)*(1 + 0)) + 0 + 0)*(1 + 0) + (1 + 0)*(1 + 0) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0)*((2 + 0)*(1 + 0)) + 0 + 0
undefined