diff --git a/bin/main b/bin/main index 4dae3b2..e7044d3 100755 Binary files a/bin/main and b/bin/main differ diff --git a/in/statements.asl b/in/statements.asl index e41902c..93566f8 100644 --- a/in/statements.asl +++ b/in/statements.asl @@ -1,6 +1,9 @@ -if (4 < (5+5)/2 || ((3-3)*10-5)) { - hint("hallo welt"); -} -else { - hint("no"); +var _x = 3; + +switch _x { + case 1: + case 2: + somefunc(2); + default: + somefunc(3); } diff --git a/in/zeus.asl b/in/zeus.asl new file mode 100644 index 0000000..b75b59c --- /dev/null +++ b/in/zeus.asl @@ -0,0 +1,26 @@ +if isServer { + exitWith(); +} + +func ZeusGrpPlaced(_group) { + +} + +func ZeusObjPlaced(_unit) { + +} + +foreach curator => allCurators { + addCuratorEditableObjects(curator, allUnits, true); + addCuratorEditableObjects(curator, allMissionObjects("All"), false); + + foreach unit => allUnits { + var _vehicle = vehicle(unit); + + if _vehicle != unit { + addCuratorEditableObjects(curator, _vehicle, true); + } + } + + addEventHandler(curator, "CuratorGroupPlaced", BIS_fnc_MP()); +} diff --git a/pkg/linux_amd64/asl.a b/pkg/linux_amd64/asl.a index f204457..8d18cf4 100644 Binary files a/pkg/linux_amd64/asl.a and b/pkg/linux_amd64/asl.a differ diff --git a/src/asl/parser.go b/src/asl/parser.go index bfc96aa..9c47128 100644 --- a/src/asl/parser.go +++ b/src/asl/parser.go @@ -21,6 +21,10 @@ func parseBlock() { parseVar() } else if accept("if") { parseIf() + } else if accept("while") { + parseWhile() + } else if accept("switch") { + parseSwitch() } else if accept("func") { parseFunction() } else { @@ -63,6 +67,60 @@ func parseIf() { appendOut("};\n") } +func parseWhile() { + expect("while") + appendOut("while {") + parseExpression() + appendOut("} do {\n") + expect("{") + parseBlock() + expect("}") + appendOut("};\n") +} + +func parseSwitch() { + expect("switch") + appendOut("switch (") + parseExpression() + appendOut(") do {\n") + expect("{") + parseSwitchBlock() + expect("}") + appendOut("};\n") +} + +func parseSwitchBlock() { + if accept("}") { + return + } + + if accept("case") { + expect("case") + appendOut("case ") + parseExpression() + expect(":") + appendOut(":\n") + + if !accept("case") && !accept("}") { + appendOut("{\n") + parseBlock() + appendOut("};\n") + } + } else if accept("default") { + expect("default") + expect(":") + appendOut("default:\n") + + if !accept("}") { + appendOut("{\n") + parseBlock() + appendOut("};\n") + } + } + + parseSwitchBlock() +} + func parseFunction() { expect("func") appendOut(get().token+" = {\n") @@ -99,7 +157,7 @@ func parseFunctionParameter() { // Everything that does not start with a keyword. func parseStatement() { // empty block - if accept("}") { + if accept("}") || accept("case") || accept("default") { return } @@ -151,7 +209,7 @@ func parseParameter() { func parseExpression() { openingBrackets := 0 - for !accept(",") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) { + for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) { current := get().token appendOut(current) diff --git a/src/asl/tokenizer.go b/src/asl/tokenizer.go index 849faf4..0154c56 100644 --- a/src/asl/tokenizer.go +++ b/src/asl/tokenizer.go @@ -2,6 +2,7 @@ package asl import ( "fmt" + "strings" ) type Token struct{ @@ -18,14 +19,19 @@ var delimiter = []byte{'=', '>', '!', ',', + ':', '&', '|'} var keywords = []string{"var", "if", + "while", + "switch", "func", "true", - "false"} + "false", + "case", + "default"} var whitespace = []byte{' ', '\n', '\t'} @@ -43,7 +49,7 @@ func Tokenize(code []byte) []Token { tokens = append(tokens, Token{string(c)}) token = "" - } else if stringArrayContains(keywords, token) { + } else if stringArrayContains(keywords, strings.ToLower(token)) { tokens = append(tokens, Token{token}) token = "" } else if !byteArrayContains(whitespace, c) { diff --git a/src/main/asl.go b/src/main/asl.go index 59dbe20..54670d0 100644 --- a/src/main/asl.go +++ b/src/main/asl.go @@ -8,7 +8,7 @@ import ( func main(){ // read test file - code, _ := ioutil.ReadFile("in/simple.asl") + code, _ := ioutil.ReadFile("in/statements.asl") token := asl.Tokenize(code) out := asl.Parse(token)