Expression 1:
Lambda-Ausdruck a: (+ x y)
  <script>
  /*
  
  Expr ::= term | expr | fact
  expr ::= ( '+' Expr Expr )
  term ::= ( '*' Expr Expr )
  fact ::= const
  
  */
  
  
  var lexstream = document.getElementById ("expr1").value;;
  var lexstreami = 0;
  var compileroutput = "";
  var lambdas;
  var lexstreamistack = new Array ();
  var lexstreamistackptr = 0;
var globalschemexprc;

      lambdas = new Array ();
    lambdas [0] = "(+ x y)";
  
  window.document.write ("Lambda-Ausdruck a: " + lambdas [0]);  
  function run () {
    lexstream = document.getElementById ("expr1").value;;
    lexstreami = 0;
    compileroutput = "";
    lexstreamistackptr = 0;
    lexstreamistack = new Array ();
    lambdas = new Array ();
    lambdas [0] = "(+ x y)";

        
    lexstream = lexstream.replace(/[\n\r\t]/g,' ');
    
    
    pushLexstreami (lexstreami);
    lambdaterms ();
}
  
  function lexer (lexstream) {
    var x;
    var lexstreami = popLexstreami ();
    if (lexstream.charAt (lexstreami) == ' ') {
        while (lexstream.charAt (lexstreami) == ' ')
            lexstreami++;
    }
    if (lexstream.charAt (lexstreami) == '*') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '*';
    }
    else if (lexstream.charAt (lexstreami) == '+') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '+';
    }
    else if (lexstream.charAt (lexstreami) == '&') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '&';
    }
    else if (lexstream.charAt (lexstreami) == '|') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '|';
    }
    else if (lexstream.charAt (lexstreami) == '!') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '!';
    }

    else if (lexstream.charAt (lexstreami) == '(') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '(';
    }
    else if (lexstream.charAt (lexstreami) == ')') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return ')';
    }
    else if (lexstream.charAt (lexstreami) == ',') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return ',';
    }
    else if (lexstream.substring (lexstreami, "<=".length+lexstreami).localeCompare ("<=") == 0) {
        x = "<=";
        lexstreami += "<=".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, ">=".length+lexstreami).localeCompare (">=") == 0) {
        x = ">=";
        lexstreami += ">=".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, "!=".length+lexstreami).localeCompare ("!=") == 0) {
        x = "!=";
        lexstreami += "!=".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, "==".length+lexstreami).localeCompare ("==") == 0) {
        x = "==";
        lexstreami += "==".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.charAt (lexstreami) == '<') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '<';
    }
    else if (lexstream.charAt (lexstreami) == '>') {
        lexstreami++;
        pushLexstreami (lexstreami);
        return '>';
    }

    else if (lexstream.substring (lexstreami, "lambda".length+lexstreami).localeCompare ("lambda") == 0) {
        x = "lambda";
        lexstreami += "lambda".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, "define".length+lexstreami).localeCompare ("define") == 0) {
        x = "define";
        lexstreami += "define".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, "if".length+lexstreami).localeCompare ("if") == 0) {
        x = "if";
        lexstreami += "if".length;
        pushLexstreami (lexstreami);
        return x;
    }
    else if (lexstream.substring (lexstreami, "else".length+lexstreami).localeCompare ("else") == 0) {
        x = "else";
        lexstreami += "else".length;
        pushLexstreami (lexstreami);
        return x;
    }

    else if ((lexstream.charAt (lexstreami) >= '0') && (lexstream.charAt (lexstreami) <= '9')) {
        x = lexstream.charAt (lexstreami);
        lexstreami++;
        pushLexstreami (lexstreami);
        return x;
    }
    else if ((lexstream.charAt (lexstreami) >= 'a') && (lexstream.charAt (lexstreami) <= 'z')) {
        x = lexstream.charAt (lexstreami);
        lexstreami++;
        pushLexstreami (lexstreami);
        return x;
    }

  }
  
  function lambdaterms () {
    var l;
    var str;
    var pos;
    lexstreami = popLexstreami ();
    pushLexstreami (lexstreami);
    pos = lexstreami;
    if (lexer (lexstream).localeCompare ("(") == 0) {
        str = lexer (lexstream);
        if (str.localeCompare ("define") == 0) {
            l = lexer (lexstream)
            if ((l >= 'a') && (l <= 'z')) {
                if (lexer (lexstream) == '(') {
                    if (lexer(lexstream).localeCompare ("lambda") == 0) {
                        if (lexer (lexstream) == '(') {
                            if (lexer (lexstream) == 'x') {
                                if (lexer (lexstream) == ',') {
                                    if (lexer (lexstream) == 'y') {
                                        if (lexer (lexstream) == ')') {
                                            lambdas [l.charCodeAt(0)-"a".charCodeAt(0)] = lambdaterm ();
                                            if (lexer (lexstream) != ')') {
                                                error ();
                                            }
                                            else {
                                                if (lexer (lexstream) != ')') 
                                                    error ();
                                                lambdaterms ();
                                            }
                
                                        }
                                        else
                                            error ();
                                    }
                                    else
                                        error ();
                                }
                                else
                                    error ();
                            }
                            else 
                                error ();
                        }
                        else 
                            error ();
                    }
                    else 
                        error ();
                }
                else
                    error ();
            }
            else   
                error ();
        }
        else if (str.localeCompare ("lambda") == 0) 
            error ();
        else if (str.localeCompare ("if") == 0) 
            error ();
        else if (str.localeCompare ("else") == 0) 
            error ();
        else {
            popLexstreami ();
            pushLexstreami(pos);
            x = schemexpr (0,0,lexstream);
            window.document.write (x);
        }
    }
  }

function lambdaterm () {
    var pos = popLexstreami ();
    var str;
    pushLexstreami (pos);
    
    if (lexer (lexstream) == '(') {
        if (lexer (lexstream) == "if") {
            str = "(if "
            str += lambdaterm1 ();
            str += lambdaterm1 ();
            str += lambdaterm1 ();
            if (lexer (lexstream) != ')')
                error ();
            str += ")";
        }
        else {
            popLexstreami ();
            pushLexstreami (pos);
            str = lambdaterm1 ();
        }
    }
    else {
        popLexstreami ();
        pushLexstreami (pos);
        str = lambdaterm1 ();
    }
    return str;
}

function lambdaterm1 () {
    var schemeoutstr = "";
    var ch, ch1;
    if ((ch1 = lexer (lexstream)) == '(') {
        ch = lexer (lexstream);
        if (ch == '+')
            schemeoutstr += "(+" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '*') 
            schemeoutstr += "(*" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '&') 
            schemeoutstr += "(&" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '|') 
            schemeoutstr += "(|" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '!') 
            schemeoutstr += "(!" + lambdaterm1 () + ")";
        else if (ch == '<') 
            schemeoutstr += "(<" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '>') 
            schemeoutstr += "(>" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '!=') 
            schemeoutstr += "(!=" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '==') 
            schemeoutstr += "(==" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '<=') 
            schemeoutstr += "(<=" + lambdaterm1 () + lambdaterm1 () + ")";
        else if (ch == '>=') 
            schemeoutstr += "(>=" + lambdaterm1 () + lambdaterm1 () + ")";
        else if ((ch >= 'a') && (ch <= 'z')) 
            schemeoutstr += "(" + ch  + lambdaterm1 () + lambdaterm1 () + ")";
        else
            error ();
        if (lexer (lexstream) != ')')
            error ();
        return schemeoutstr;
    }
    else if ((ch1 >= '0') && (ch1 <= '9')) {
        schemeoutstr += ch1;
        return schemeoutstr;
    }
    else if (ch1 == 'x') {
        schemeoutstr += ch1;
        return schemeoutstr;
    }
    else if (ch1 == 'y') {
        schemeoutstr += ch1;
        return schemeoutstr;
    }
    else {
        error ();
    }
}
  function pushLexstreami (lexstreami) {
    lexstreamistack [lexstreamistackptr] = lexstreami;
    lexstreamistackptr++;
  }
  function popLexstreami () {
    lexstreamistackptr--;
    return lexstreamistack [lexstreamistackptr];
    }
    





function schemexpr (x, y, lexstream) {
    var ch, ch1;
    var a, b, c;
    
           /*var abc = popLexstreami ();
        pushLexstreami (abc);
        alert (lexstream.substring (abc));*/

    if ((ch1 = lexer (lexstream)) == '(') {
        ch = lexer (lexstream);
        if (ch == 'if') {
            if (schemexpr (x, y, lexstream)) {
                c = schemexpr (x, y, lexstream);
                schemexpr2 (x, y, lexstream);
            }
            else {
                schemexpr2 (x, y, lexstream);
                c = schemexpr (x, y, lexstream);
            }
        }
        else if ((ch >= 'a') && (ch <= 'z')) {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            pushLexstreami (0);
            c = schemexpr (a, b, lambdas [ch.charCodeAt (0)-'a'.charCodeAt (0)]);
            popLexstreami ();
        }
        else if (ch == '+') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a+b);
        }
        else if (ch == '*') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a*b);
        }
        else if (ch == '&') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a && b);
        }
        else if (ch == '|') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a || b);
        }
        else if (ch == '!') {
            a = schemexpr (x, y, lexstream);
            c = (!a);
        }
        else if (ch == '<') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a < b);
        }
        else if (ch == '>') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a > b);
        }
        else if (ch == '<=') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c = (a <= b);
        }
        else if (ch == '>=') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c =  (a >= b);
        }
        else if (ch == '==') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c =  (a == b);
        }
        else if (ch == '!=') {
            a = schemexpr (x, y, lexstream);
            b = schemexpr (x, y, lexstream);
            c =  (a != b);
        }
        else {
            error ();
        }
        if (lexer (lexstream) != ')') {
            error ();
        }
        return c;
    }
    else if ((ch1 >= '0') && (ch1 <= '9')) {
        return ch1.charCodeAt(0)-'0'.charCodeAt(0);
    }
    else if (ch1 == 'x') {
        return x;
    }
    else if (ch1 == 'y') {
        return y;
    }
    else {
        error ();
    }
  }


function schemexpr2 (x, y, lexstream) {
    var ch, ch1;
    var a, b, c;
    
           /*var abc = popLexstreami ();
        pushLexstreami (abc);
        alert (lexstream.substring (abc));*/

    if ((ch1 = lexer (lexstream)) == '(') {
        ch = lexer (lexstream);
        if (ch == 'if') {
            if (schemexpr2 (x, y, lexstream)) {
                c = schemexpr2 (x, y, lexstream);
                c = schemexpr2 (x, y, lexstream);
            }
            else {
                c = schemexpr2 (x, y, lexstream);
                c = schemexpr2 (x, y, lexstream);
            }
        }
        else if ((ch >= 'a') && (ch <= 'z')) {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            pushLexstreami (0);
            //c = schemexpr (a, b, lambdas [ch.charCodeAt (0)-'a'.charCodeAt (0)]);
            popLexstreami ();
        }
        else if (ch == '+') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a+b);
        }
        else if (ch == '*') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a*b);
        }
        else if (ch == '&') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a && b);
        }
        else if (ch == '|') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a || b);
        }
        else if (ch == '!') {
            a = schemexpr2 (x, y, lexstream);
            c = (!a);
        }
        else if (ch == '<') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            alert (a);
            alert (b);
            c = (a < b);
        }
        else if (ch == '>') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a > b);
        }
        else if (ch == '<=') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c = (a <= b);
        }
        else if (ch == '>=') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c =  (a >= b);
        }
        else if (ch == '==') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c =  (a == b);
        }
        else if (ch == '!=') {
            a = schemexpr2 (x, y, lexstream);
            b = schemexpr2 (x, y, lexstream);
            c =  (a != b);
        }
        else {
            error ();
        }
        if (lexer (lexstream) != ')') {
            error ();
        }
        return 10;
    }
    else if ((ch1 >= '0') && (ch1 <= '9')) {
        return 0;
    }
    else if (ch1 == 'x') {
        return 0;
    }
    else if (ch1 == 'y') {
        return 0;
    }
    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 (/<br>/g, "<br>");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, " "); 
  window.document.write (content);
  Lambda-Ausdruck a: (+ x y)