/javasl

Primary LanguageJava

JavaSL - Java scripting language

A simple scripting language written in java.

Types

Misc:
    void, bool
Scalar:
    int8, int16, int32, int64
    uint8, uint16, uint32, uint64

Operators

Precedence Operator
1 * / %
2 + -
3 << >>
4 < <= > >=
5 == !=
6 &
7 ^
8 |
9 &&
10 ||

Example usage

    String sourceString = "int32 i = 0; while (i < 10) { i = i + externalFunc(i); } print(i);";
    Script script = new Script();
    script.addDefaultFunctionPrint();
    script.addExternalFunction("externalFunc", new Int32_T(), new Type_T[]{new Int32_T()}, (p) -> {
        int p0 = Script.intParam(p[0]);
        return new Int32_T(p0 + 2);
    });

    try {
        script.compileFromSource(sourceString);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (script.isReady()) {
        script.execute();
    }
    Output to stdout: 14

Grammar

TODO: move IDENTIFIER IDENTIFIER from LHS to VAR_DECL

  • TERM[x] means for every operator precedence apply this grammar
LHS => IDENTIFIER | VAR_DECL | IDENTIFIER IDENTIFIER
VAR_DECL => TYPE IDENTIFIER
RHS => EXPR
EXPR => TERM[x]
TERM[x] => TERM[x-1] {OP_PREC[x][0] TERM[x-1] | OP_PREC[x][1] TERM[x-1] | ...}
TERM[0] => FACTOR {OP_PREC[0][0] FACTOR | OP_PREC[0][1] FACTOR | ...}
FACTOR => FUNC_CALL | LITERAL | IDENTIFIER | "(" EXPR ")"
LITERAL => LITERAL_NUMBER | LITERAL_STRING | LITERAL_CHAR
LITERAL_NUMBER => digit {digit} | "-" digit {digit} | digit.{digit} | "-" digit.{digit} | {digit}.digit | "-" {digit}.digit
LITERAL_STRING => """ {character} """
LITERAL_CHAR => "'" character "'"
ASSIGNMENT => LHS "=" RHS
FUNC_DEF => VAR_DECL "(" PARAM_DECL ")" BLOCK
BLOCK => "{" STATEMENT ... STATEMENT "}"
STATEMENT => BLOCK | FUNC_DEF | FUNC_CALL ";" | ASSIGNMENT ";" | RRET ";" | IF | WHILE | FOR | BREAK ";" | CONTINUE ";"
PARAM_DECL => VAR_DECL { "," VAR_DECL } | NOTHING
PARAMS => EXPR { "," EXPR } | NOTHING
RET => "return" | "return" RHS
FUNC_CALL => IDENTIFIER "(" PARAMS ")"
IF => "if" "(" EXPR ")" STATEMENT | "if" "(" EXPR ")" STATEMENT "else" STATEMENT
WHILE => "while" "(" EXPR ")" STATEMENT
FOR => "for" "(" ASSIGNMENT | EXPR ";" EXPR ";" ASSIGNMENT | EXPR ")" STATEMENT
BREAK => "break"
CONTINUE => "continue"