((((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