Skip to content

VorlageWIP

gulrak edited this page Nov 17, 2019 · 1 revision

Die Modernisierung von Vorlage

Mit dem Ziel den Vorlage-Source innerhalb der nächsten Monate, spätestens Ende Q1/2020 zu veröffentlichen, habe ich begonnen, problematische Teile von Vorlage zu erneuern. Teilweise geht dies mit Refactoring, aber teilweise erfordert es auch das Neuschreiben einer alternativen Implementierung, die die alte ersetzen wird. Konkret ist dies vor allem die Expression-Engine, aber der ganze Interpreter steht auf dem Prüfstand.

Hier sammle ich Infos über den Status und versuche dabei auch den Aufbau der Skriptsprache technisch zu dokumentieren.

Hinweis: Diese Seite und ihre Unterseiten sind nicht als Dokumentation für Vorlage-Benutzer gedacht, sondern im Moment als Dokumentation für mich, und vielleicht nach der Veröffentlichung für jeden, der sich an dem Code versuchen will. Da ich vorzugsweise in Englisch entwickle, bitte ich das Sprachwirrwar zu entschuldigen. ;-)

Tasks

  • New Value class with operations
  • VMS Lexer
  • VMS Parser
  • AST nodes
  • Game object access
  • Expression Evaluator

Status of Expression Implementation

(Elements the new implementation must support and their state.)

  • Operators (a,b,c = float/int, $v = Var, $a = Array, $d = Dictionary)
    • -a
    • a+b
    • a-b
    • a*b
    • a%b
    • a^b
    • !a
    • a==b
    • a<=b
    • a>=b
    • a<b
    • a>b
    • (a+b)*c
    • a&&b
    • a||b
    • $v
    • $v=b
    • $a[b]=c
    • $a.size
    • foo(a,b)
    • obj[a]
    • obj.attr
    • obj.attr[a]

VMS Grammar (Vorlage MetaScript)

Dies ist der Versuch die Gramatik der Skriptsprache aufzuschreiben, wobei Abweichungen nicht ausgeschlossen sind, die neue Engine wird versuchen so kompatibel zu sein wie es vertretbar ist, aber minimale Änderungen in Grenzfällen sind nicht ausgeschlossen.

Achtung: Die Grammatik ist noch längst nicht vollständig und kann sich noch ändern.

Statement   = Expression
            | AssignmentExpression
            | ControlStatement
            | DeclarationStatement
            ;

ControlStatement = "#after", WS, Expression, NLWS, StatementBlock
                | "#call", WS, Expression, { WS, Expression }
                | "#every", WS, Expression, WS, Expression, NLWS, StatementBlock
                | "#forever", NLSW StatementBlock
                | "#if", WS, Expression, NLSW, StatementBlock
                | "#if", WS, Expression, NLSW, StatementBlock, NLSW, "#else", NLSW, StatementBlock
                | "#next", WS, Expression, NLWS, StatementBlock
                | "#while", WS, Expression, NLWS, StatementBlock
                ;

StatementBlock = "{", { Statement, { ( ":" | "\n" ) Statement } }, "}" ;

AssignmentExpression = Variable, "=", Expression ;

Expression = LogicalExpression ;

LogicalExpression = ComparisonExpression, { ( "&&" | "||" ), ComparisonExpression } ;

ComparisonExpression = AdditionExpression, { ( "==" | "!=" | "<" | "<=" | ">" | ">=" ), AdditionExpression } ;

AdditionExpression = MultiplicativeExpression, { ( "+", "-" ), MultiplicativeExpression } ;

MultiplicativeExpression = ExponentiationExpression, { ( "*" | "/" | "%" ), ExponentiationExpression } ;

ExponentiationExpression = UnaryExpression, { "^" UnaryExpression } ;

UnaryExpression = { "!" | "-" }, PrimaryExpression ;

PrimaryExpression   = Constant
                    | Variable
                    | Object
                    | FunctionCall
                    | "(", Expression, ")"
                    ;

Variable = VarName, { "[", Expression, "]" } ;

Object = ObjectAccess, { ".", ObjectAccess, } ;

ObjectAcess = Identifier
            | Identifier ".size"
            | Identifier "[", Expression, { ",", Expression }, "]"
            ;

VarName = "$", ( Letter | Digit ), { ( Letter | Digit ) }
        | "$`" | "$´" | "$&" | "$+"
        ;

Constant = String | Integer | Float | Base36 | ArrayLiteral ;

ArrayLiteral = "[", { Expression, { "," Expression } }, "]" ;

String = '"', { StringChar | "'" | EscapeSequence }, '"'
       | "'", { StringChar | '"' | EscapeSequence }, "'"
       ; 

EscapeSequence  = "\", "n"
                | "\", "r"
                | "\", "t"
                | "\", "'"
                | "\", '"'
                | "\", "\"
                ;

Text = ( Letter | Digit | "~" ), { ( Letter | Digit | "~" ) } ;

Identifier = Letter, { Letter | Digit } ;

Integer = Digit, { Digit } ;

Base36 = Base36CHar, { Base36Char } ;

Float = Digit, { Digit }, ".", { Digit } ;

Letter  = "A" | "B" | "C" | "D" | "E" | "F" | "G"
        | "H" | "I" | "J" | "K" | "L" | "M" | "N"
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
        | "V" | "W" | "X" | "Y" | "Z"
        | "Ä" | "Ö" | "Ü" 
        | "a" | "b" | "c" | "d" | "e" | "f" | "g"
        | "h" | "i" | "j" | "k" | "l" | "m" | "n"
        | "o" | "p" | "q" | "r" | "s" | "t" | "u"
        | "v" | "w" | "x" | "y" | "z"
        | "ä" | "ö" | "ü" | "ß"
        ;

Base36Char = "A" | "B" | "C" | "D" | "E" | "F" | "G"
        | "H" | "I" | "J" | "K" | "L" | "M" | "N"
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
        | "V" | "W" | "X" | "Y" | "Z"
        | "a" | "b" | "c" | "d" | "e" | "f" | "g"
        | "h" | "i" | "j" | "k" | "l" | "m" | "n"
        | "o" | "p" | "q" | "r" | "s" | "t" | "u"
        | "v" | "w" | "x" | "y" | "z"
        | Digit
        ;

Digit   = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

NLWS = { { WS }, "\n" }, WS ;

WS = ( " " | "\t" ), { ( " " | "\t" ) } ;

StringChar = ? Any character but newline, backslash, single quote or double quote ?

Clone this wiki locally