Code: Alles auswählen
<html>
<head>
<title></title>
<meta content="">
<style></style>
</head>
<body>
<form name="ExprInput" onsubmit="run()" method="post">
Expression 1: <textarea id="expr1" type="text" name="expr1" rows="12" cols="100">
(define c
(lambda (x, y)
(if
(< x 9)
(list x (c (+ x 1) 0))
(list 8 9)
)
)
)
(next (next (c 1 0)))
</textarea><br>
<input type="submit" value="Submit">
</form>
<div id="myscript">
<script>
/*
Expr ::= term | expr | fact
expr ::= ( '+' Expr Expr )
term ::= ( '*' Expr Expr )
fact ::= const
*/
var lexstream = document.getElementById ("expr1").value;
var lexoutput = 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,' ');
lexoutput = lexoutput.replace(/[\n]/g,'<br>');
lexoutput = lexoutput.replace(' '," ");
lexoutput = lexoutput.replace(/[\r\t\v\f\s]/g," ");
lexoutput = lexoutput.replace(/list/g,"<a href=\"https://de.wikipedia.org/wiki/Scheme#Paare_und_Listen\"><b style=\"color:lightgreen\">list</b></a>");
lexoutput = lexoutput.replace(/define/g,"<a href=\"https://de.wikipedia.org/wiki/Scheme#define\"><b style=\"color:lightgreen\">define</b></a>");
lexoutput = lexoutput.replace(/next/g,"<a href=\"https://de.wikipedia.org/wiki/Scheme#Paare_und_Listen\"><b style=\"color:lightgreen\">next</b></a>");
lexoutput = lexoutput.replace(/prev/g,"<a href=\"https://de.wikipedia.org/wiki/Scheme#Paare_und_Listen\"><b style=\"color:lightgreen\">prev</b></a>");
lexoutput = lexoutput.replace(/if/g,"<a href=\"https://de.wikipedia.org/wiki/Scheme#Fallunterscheidung\"><b style=\"color:lightgreen\">if</b></a>");
lexoutput = lexoutput.replace(/\+/g,"<b style=\"color:lightgreen\">+</b>");
lexoutput = lexoutput.replace(/\*/g,"<b style=\"color:lightgreen\">*</b>");
lexoutput = lexoutput.replace(/else/g,"<b style=\"color:lightgreen\">else</b>");
lexoutput = lexoutput.replace(/lambda/g,'<a href=\"https://de.wikipedia.org/wiki/Scheme\"><b style=\"background-color:lightblue;\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/3/39/Lambda_lc.svg\" height=\"16px\"></b><a>');
window.document.write ("<code>" + lexoutput + "</code>");
pushLexstreami (lexstreami);
lambdadefines (lexstream);
}
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.substring (lexstreami, "list".length+lexstreami).localeCompare ("list") == 0) {
x = "list";
lexstreami += "list".length;
pushLexstreami (lexstreami);
return x;
}
else if (lexstream.substring (lexstreami, "prev".length+lexstreami).localeCompare ("prev") == 0) {
x = "prev";
lexstreami += "prev".length;
pushLexstreami (lexstreami);
return x;
}
else if (lexstream.substring (lexstreami, "next".length+lexstreami).localeCompare ("next") == 0) {
x = "next";
lexstreami += "next".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 (lexstream) {
var l;
var str;
var pos;
lexstreami = popLexstreami ();
pushLexstreami (lexstreami);
pos = lexstreami;
if (lexer(lexstream).localeCompare ("(") == 0) {
if (lexer(lexstream).localeCompare ("lambda") == 0) {
if (lexer (lexstream) == '(') {
if (lexer (lexstream) == 'x') {
if (lexer (lexstream) == ',') {
if (lexer (lexstream) == 'y') {
if (lexer (lexstream) == ')') {
str = "(lambda (x,y)" + lambdaterm (lexstream) + ")";
if (lexer (lexstream) != ')')
error ();
return str;
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
}
function cutlambda (str) {
var str1 = str.substring ("(lambda(x,y)".length+1, str.length-1);
return str1;
}
function lambdadefines (lexstream) {
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')) {
lambdas [l.charCodeAt(0)-"a".charCodeAt(0)] = lambdaterms (lexstream);
if (lexer (lexstream) != ')') {
error ();
}
lambdadefines (lexstream);
}
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 ("<br><br>" + analysenumber (x) + "<br><br>");
window.document.write (x);
}
}
}
function analysenumber (x) {
var str = "";
var y;
y = parseInt (x, 10);
if (y == NaN)
return "<br>Es handelt sich nicht um eine Zahl, sondern Liste oder ähnliches<br>";
if ((y % 2) == 0)
str = "Die Zahl ist gerade";
else
str = "Die Zahl ist ungerade";
str = str + "<br>" + primfactor (y) + "<br>";
return str;
}
function primfactor (x) {
var i;
var str = "";
if (x > 1) {
for (i = x-1; i > 1; i--) {
if ((x % i) == 0) {
str += primfactor (x / i);
str += primfactor (i);
break;
}
}
if (i == 1)
str = str + " " + x + " ";
return str;
}
else
return "";
}
function lambdaterm (lexstream) {
var pos = popLexstreami ();
var str;
pushLexstreami (pos);
if (lexer (lexstream) == '(') {
if (lexer (lexstream) == "if") {
str = "(if "
str += lambdaterm1 (lexstream);
str += lambdaterm1 (lexstream);
str += lambdaterm1 (lexstream);
if (lexer (lexstream) != ')')
error ();
str += ")";
}
else {
popLexstreami ();
pushLexstreami (pos);
str = lambdaterm1 (lexstream);
}
}
else {
popLexstreami ();
pushLexstreami (pos);
str = lambdaterm1 (lexstream);
}
return str;
}
function lambdaterm1 (lexstream) {
var schemeoutstr = "";
var ch, ch1;
if ((ch1 = lexer (lexstream)) == '(') {
ch = lexer (lexstream);
if (ch == '+')
schemeoutstr += "(+" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch.localeCompare ("lambda") == 0) {
if (lexer (lexstream) == '(') {
if (lexer (lexstream) == 'x') {
if (lexer (lexstream) == ',') {
if (lexer (lexstream) == 'y') {
if (lexer (lexstream) == ')') {
schemeoutstr = "(lambda (x,y)" + lambdaterm1 (lexstream) + ")";
if (lexer (lexstream) != ')')
error ();
return schemeoutstr;
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else if (ch == 'list')
schemeoutstr += "(list" + lambdaterm1 (lexstream) + " " + lambdaterm1 (lexstream) + ")";
else if (ch == 'prev')
schemeoutstr += "(prev" + lambdaterm1 (lexstream) + ")";
else if (ch == 'next')
schemeoutstr += "(next" + lambdaterm1 (lexstream) + ")";
else if (ch == '*')
schemeoutstr += "(*" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '&')
schemeoutstr += "(&" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '|')
schemeoutstr += "(|" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '!')
schemeoutstr += "(!" + lambdaterm1 (lexstream) + ")";
else if (ch == '<')
schemeoutstr += "(<" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '>')
schemeoutstr += "(>" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '!=')
schemeoutstr += "(!=" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '==')
schemeoutstr += "(==" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '<=')
schemeoutstr += "(<=" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if (ch == '>=')
schemeoutstr += "(>=" + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
else if ((ch >= 'a') && (ch <= 'z'))
schemeoutstr += "(" + ch + lambdaterm1 (lexstream) + lambdaterm1 (lexstream) + ")";
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 listnextschemexpr (x, y, str) {
var str1, str2;
pushLexstreami (0);
if (lexer (str) == '(') {
if (lexer (str) == 'list') {
str1 = schemexpr (x, y, str);
str2 = schemexpr (x, y, str);
if (lexer (str) != ')')
error ();
popLexstreami ();
return str2;
}
else
error ();
}
else
error ();
popLexstreami ();
}
function listprevschemexpr (x, y, str) {
var str1, str2;
pushLexstreami (0);
if (lexer (str) == '(') {
if (lexer (str) == 'list') {
str1 = schemexpr (x, y, str);
str2 = schemexpr (x, y, str);
if (lexer (str) != ')')
error ();
popLexstreami ();
return str1;
}
else
error ();
}
else
error ();
popLexstreami ();
}
function listnextschemexpr2 (x, y, str) {
var str1, str2;
pushLexstreami (0);
if (lexer (str) == '(') {
if (lexer (str) == 'list') {
str1 = schemexpr2 (x, y, str);
str2 = schemexpr2 (x, y, str);
if (lexer (str) != ')')
error ();
popLexstreami ();
return str2;
}
else
error ();
}
else
error ();
popLexstreami ();
}
function listprevschemexpr2 (x, y, str) {
var str1, str2;
pushLexstreami (0);
if (lexer (str) == '(') {
if (lexer (str) == 'list') {
str1 = schemexpr2 (x, y, str);
str2 = schemexpr2 (x, y, str);
if (lexer (str) != ')')
error ();
popLexstreami ();
return str1;
}
else
error ();
}
else
error ();
popLexstreami ();
}
function schemexpr (x, y, lexstream) {
var ch, ch1;
var a, b, c;
var str;
/*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.localeCompare ("lambda") == 0) {
if (lexer (lexstream) == '(') {
if (lexer (lexstream) == 'x') {
if (lexer (lexstream) == ',') {
if (lexer (lexstream) == 'y') {
if (lexer (lexstream) == ')') {
str = "(lambda (x,y)" + lambdaterm (lexstream) + ")";
if (lexer (lexstream) != ')')
error ();
return str;
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else if (ch == 'list')
c = '(list ' + schemexpr(x,y,lexstream) + " " + schemexpr(x,y,lexstream) + ")";
else if (ch == 'prev')
c = listprevschemexpr (x, y, schemexpr (x,y,lexstream), x, y);
else if (ch == 'next')
c = listnextschemexpr (x, y, 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, cutlambda(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 str;
/*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.localeCompare ("lambda") == 0) {
if (lexer (lexstream) == '(') {
if (lexer (lexstream) == 'x') {
if (lexer (lexstream) == ',') {
if (lexer (lexstream) == 'y') {
if (lexer (lexstream) == ')') {
str = "(lambda (x,y)" + lambdaterm (lexstream) + ")";
if (lexer (lexstream) != ')')
error ();
return str;
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else
error ();
}
else if (ch == 'list')
c = '(list ' + schemexpr2(x,y,lexstream) + " " + schemexpr2(x,y,lexstream) + ")";
else if (ch == 'prev')
c = listprevschemexpr2 (x, y, schemexpr2 (x,y,lexstream));
else if (ch == 'next')
c = listnextschemexpr2 (x, y, 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);
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);
</script>
</div>
</body>
</html>