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)