Compilerbau und PHP Codes

Description of your first forum.
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Compilerbau und PHP Codes

Beitrag von davidvajda »

Einen Ping per PHP in der Homepage absetzen

Code: Alles auswählen

<form method="post">
<textarea rows="1" cols="60" name="inputtext">www.ituenix.de</textarea><br><br>
<input type="Submit" value="ping">
</form>

<div style=" background-color: black; color: lightgreen;">
<b>
<code>
<?php 
include ('/var/www/html/track2.php');
?>


<?php
$str = $_POST["inputtext"];

for ($i = 0;  $i < strlen ($str);  $i++) {
   if(!(($str[$i] >= 'a') && ($str[$i] <= 'z'))) {
      if(!(($str[$i] >= '0') && ($str[$i] <= '9'))) {
         if(!($str[$i] == '.')  && !($str[$i] == '-')) {
            if(!(($str[$i] >= 'A') && ($str[$i] <= 'Z'))) {
               echo "only use numbers, characters and dot in string";
               exit;
            }
         }
      }
   }
}

exec ("ping -c 4 " .$str , $outstr);

for ($i = 0;  $i < count($outstr);  $i++) {
  echo $outstr[$i];
  echo "<br>";
}

?>
</b>
</code>
</div>
Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Vorausschau - einen Funktionsplotter in PHP schreiben

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Links auf der Homepage, automatisch generiert

Code: Alles auswählen

#!/bin/bash 

l=$(ls *.tar.gz)

for s in $l 
do 
    echo "https://www.dvajda.de/ftpupload/img/$s" >> links.txt
done

l=$(ls *.zip)

for s in $l 
do 
    echo "https://www.dvajda.de/ftpupload/img/$s" >> links.txt
done
Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

https://www.dvajda.de/ftpupload/img/2021-08-05.tar.gz
https://www.dvajda.de/ftpupload/img/202 ... dft.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -21.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -23.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -27.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -19.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -21.tar.gz
https://www.dvajda.de/ftpupload/img/com ... -27.tar.gz
https://www.dvajda.de/ftpupload/img/cyu ... -02.tar.gz
https://www.dvajda.de/ftpupload/img/dif ... -05.tar.gz
https://www.dvajda.de/ftpupload/img/dif ... -06.tar.gz
https://www.dvajda.de/ftpupload/img/dif ... -07.tar.gz
https://www.dvajda.de/ftpupload/img/dif ... tra.tar.gz
https://www.dvajda.de/ftpupload/img/fin ... -15.tar.gz
https://www.dvajda.de/ftpupload/img/fun ... ter.tar.gz
https://www.dvajda.de/ftpupload/img/rev ... ler.tar.gz
https://www.dvajda.de/ftpupload/img/sor ... hit.tar.gz
https://www.dvajda.de/ftpupload/img/sweetexpr.tar.gz
https://www.dvajda.de/ftpupload/img/www ... -13.tar.gz
https://www.dvajda.de/ftpupload/img/yun7x1.tar.gz
https://www.dvajda.de/ftpupload/img/yun ... -31.tar.gz
https://www.dvajda.de/ftpupload/img/yun ... -10.tar.gz
https://www.dvajda.de/ftpupload/img/2021-08-05.zip
https://www.dvajda.de/ftpupload/img/202 ... ft-dft.zip
https://www.dvajda.de/ftpupload/img/com ... -08-21.zip
https://www.dvajda.de/ftpupload/img/com ... -08-23.zip
https://www.dvajda.de/ftpupload/img/com ... -08-27.zip
https://www.dvajda.de/ftpupload/img/com ... -10-19.zip
https://www.dvajda.de/ftpupload/img/com ... -10-21.zip
https://www.dvajda.de/ftpupload/img/com ... -10-27.zip
https://www.dvajda.de/ftpupload/img/cyu ... -09-02.zip
https://www.dvajda.de/ftpupload/img/diff-2021-08-05.zip
https://www.dvajda.de/ftpupload/img/diff-2021-08-06.zip
https://www.dvajda.de/ftpupload/img/dif ... -ultra.zip
https://www.dvajda.de/ftpupload/img/diff-2021-08-07.zip
https://www.dvajda.de/ftpupload/img/fin ... -10-15.zip
https://www.dvajda.de/ftpupload/img/fun ... tter20.zip
https://www.dvajda.de/ftpupload/img/fun ... lotter.zip
https://www.dvajda.de/ftpupload/img/reversecompiler.zip
https://www.dvajda.de/ftpupload/img/sor ... bighit.zip
https://www.dvajda.de/ftpupload/img/yun7x1.zip
https://www.dvajda.de/ftpupload/img/yun ... -08-31.zip
https://www.dvajda.de/ftpupload/img/yun ... -09-10.zip
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Ein Compiler - ein simpler taschenrechner

Code: Alles auswählen

<html>
  <head>
    <title></title>
    <meta content="">
    <style></style>
  </head>
  <body>
  <script>
  var p = "sin(5.1*(5.718*(3.43*(2.45+4.66*(sin(9.4)+3.01))))*2.22+1.12)*ln(2.2)";
var j = 0;

function parser_error() {
    alert("Parser Error");
}

function expression() {
     var x, y;
     x = term();
     if(p.charAt(j) == '+') {
        j++;
        y = expression();
        return x+y;
     }
     else if(p.charAt(j) == '-') {
        j++;
        y = expression();
        return x-y;
     }
     return x;
}

function factor() {
     var z;
     var x;
     var y;
     if(p.charAt(j) == '(') {
        j++;
        x = expression();
        if(p.charAt(j) == ')')
           j++;
        else
           parser_error();
        return x;
     }
     else if((p.charAt(j) == 't') && (p.charAt(j+1) == 'a') && (p.charAt(j+2) == 'n') && (p.charAt(j+3) == '(')) {
            j+=4;
            x = expression();
            y = Math.tan(x);
            if(p.charAt(j) == ')')
                j++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(j) == 'c') && (p.charAt(j+1) == 'o') && (p.charAt(j+2) == 's') && (p.charAt(j+3) == '(')) {
            j+=4;
            x = expression();
            y = Math.cos(x);
            if(p.charAt(j) == ')')
                j++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(j) == 's') && (p.charAt(j+1) == 'i') && (p.charAt(j+2) == 'n') && (p.charAt(j+3) == '(')) {
            j+=4;
            x = expression();
            y = Math.sin(x);
            if(p.charAt(j) == ')')
                j++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(j) == 'l') && (p.charAt(j+1) == 'n') && (p.charAt(j+2) == '(')) {
            j+=3;
            x = expression();
            y = Math.log(x);
            if(p.charAt(j) == ')')
                j++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(j) == 'e') && (p.charAt(j+1) == 'x') && (p.charAt(j+2) == 'p') && (p.charAt(j+3) == '(')) {
            j+=4;
            x = expression();
            y = Math.exp(x);
            if(p.charAt(j) == ')')
                j++;
            else
                parser_error();
            return y;
    }
    else if((x = parseFloat(p.substring(j))) != NaN) {
            var i = 0;
            while (parseFloat(p.substring(j)) != parseFloat(p.substring(j, i+j)))
                i++;
            while (p.charAt (i+j) == '0')
                j++;
            j += i;
            return x;
    }
    else
        parser_error();
}

function term() {
     var x, y;
     x = factor();
     if(p.charAt(j) == '*') {
         j++;
         y = term();
         return x * y;
     }
     else if(p.charAt(j) == '/') {
         j++;
         y = term();
         return x / y;
     }
     return x;
}

p = window.prompt("Geben Sie einen arithmetischen Ausdruck ein, Zahlen duerfen nur eine Ziffer sein, nur + und * erlaubt", p);
alert(expression());

j = 0;
if (p.length > 30)
    document.write("<font color=\"blue\"><center><code><p> " + p.substr (0, 30) + "..." + "=" + expression() +"</p></code></center></font>");
else
    document.write("<font color=\"blue\"><center><code><p> " + p + "=" + expression() +"</p></code></center></font>");

//document.write("<font color=\"blue\"><center><code><p> "  + expression() +"</p></code></center></font>");
</script>

  
  </body>
</html>

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Ein kleiner scheme Artiger Compiler

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(' ',"&nbsp;&nbsp;");
    lexoutput = lexoutput.replace(/[\r\t\v\f\s]/g,"&nbsp;&nbsp;");
    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 &auml;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 ("<", "&lt;");
  content = content.replace (">", "&gt;");
  content = content.replace (/<br>/g, "&lt;br&gt;");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, "&nbsp;"); 
  window.document.write (content);
  </script>
</div>
  </body>
</html>
Bild

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Scheme Compiler v24

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(' ',"&nbsp;&nbsp;");
    lexoutput = lexoutput.replace(/[\r\t\v\f\s]/g,"&nbsp;&nbsp;");
    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 &auml;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 ("<", "&lt;");
  content = content.replace (">", "&gt;");
  content = content.replace (/<br>/g, "&lt;br&gt;");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, "&nbsp;"); 
  window.document.write (content);
  </script>
</div>
  </body>
</html>
Bild

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Scheme v0.23

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(' ',"&nbsp;&nbsp;");
    lexoutput = lexoutput.replace(/[\r\t\v\f\s]/g,"&nbsp;&nbsp;");
    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 (analysenumber (x));
            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 &auml;hnliches<br>";
    
    if ((y % 2) == 0)
        str = "Die Zahl ist gerade";
    else
        str = "Die Zahl ist ungerade";
    return str;
}

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 ("<", "&lt;");
  content = content.replace (">", "&gt;");
  content = content.replace (/<br>/g, "&lt;br&gt;");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, "&nbsp;"); 
  window.document.write (content);
  </script>
</div>
  </body>
</html>
Bild

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Scheme v0.22

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(' ',"&nbsp;&nbsp;");
    lexoutput = lexoutput.replace(/[\r\t\v\f\s]/g,"&nbsp;&nbsp;");
    lexoutput = lexoutput.replace(/list/g,"<b style=\"color:lightgreen\">list</b>");
    lexoutput = lexoutput.replace(/define/g,"<b style=\"color:lightgreen\">define</b>");
    lexoutput = lexoutput.replace(/next/g,"<b style=\"color:lightgreen\">next</b>");
    lexoutput = lexoutput.replace(/prev/g,"<b style=\"color:lightgreen\">prev</b>");
    lexoutput = lexoutput.replace(/if/g,"<b style=\"color:lightgreen\">if</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 (x);
        }
    }
  }

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 ("<", "&lt;");
  content = content.replace (">", "&gt;");
  content = content.replace (/<br>/g, "&lt;br&gt;");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, "&nbsp;"); 
  window.document.write (content);
  </script>
</div>
  </body>
</html>
Bild

Bild
davidvajda
Site Admin
Beiträge: 66
Registriert: Mo Feb 06, 2023 5:13 pm

Re: Compilerbau und PHP Codes

Beitrag von davidvajda »

Scheme v0.21

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 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);
    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 (x);
        }
    }
  }

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 ("<", "&lt;");
  content = content.replace (">", "&gt;");
  content = content.replace (/<br>/g, "&lt;br&gt;");
  content = content.replace(/(?:\r\n|\r|\n)/g, '<br>');
  content = content.replace(/ /g, "&nbsp;"); 
  window.document.write (content);
  </script>
</div>
  </body>
</html>
Bild

Bild
Antworten