Added while and switch.

This commit is contained in:
Marvin Blum
2015-09-21 17:16:00 +02:00
parent af7a0a9f4c
commit 1f0730b984
7 changed files with 103 additions and 10 deletions

BIN
bin/main

Binary file not shown.

View File

@@ -1,6 +1,9 @@
if (4 < (5+5)/2 || ((3-3)*10-5)) { var _x = 3;
hint("hallo welt");
} switch _x {
else { case 1:
hint("no"); case 2:
somefunc(2);
default:
somefunc(3);
} }

26
in/zeus.asl Normal file
View File

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

Binary file not shown.

View File

@@ -21,6 +21,10 @@ func parseBlock() {
parseVar() parseVar()
} else if accept("if") { } else if accept("if") {
parseIf() parseIf()
} else if accept("while") {
parseWhile()
} else if accept("switch") {
parseSwitch()
} else if accept("func") { } else if accept("func") {
parseFunction() parseFunction()
} else { } else {
@@ -63,6 +67,60 @@ func parseIf() {
appendOut("};\n") 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() { func parseFunction() {
expect("func") expect("func")
appendOut(get().token+" = {\n") appendOut(get().token+" = {\n")
@@ -99,7 +157,7 @@ func parseFunctionParameter() {
// Everything that does not start with a keyword. // Everything that does not start with a keyword.
func parseStatement() { func parseStatement() {
// empty block // empty block
if accept("}") { if accept("}") || accept("case") || accept("default") {
return return
} }
@@ -151,7 +209,7 @@ func parseParameter() {
func parseExpression() { func parseExpression() {
openingBrackets := 0 openingBrackets := 0
for !accept(",") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) { for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) {
current := get().token current := get().token
appendOut(current) appendOut(current)

View File

@@ -2,6 +2,7 @@ package asl
import ( import (
"fmt" "fmt"
"strings"
) )
type Token struct{ type Token struct{
@@ -18,14 +19,19 @@ var delimiter = []byte{'=',
'>', '>',
'!', '!',
',', ',',
':',
'&', '&',
'|'} '|'}
var keywords = []string{"var", var keywords = []string{"var",
"if", "if",
"while",
"switch",
"func", "func",
"true", "true",
"false"} "false",
"case",
"default"}
var whitespace = []byte{' ', '\n', '\t'} var whitespace = []byte{' ', '\n', '\t'}
@@ -43,7 +49,7 @@ func Tokenize(code []byte) []Token {
tokens = append(tokens, Token{string(c)}) tokens = append(tokens, Token{string(c)})
token = "" token = ""
} else if stringArrayContains(keywords, token) { } else if stringArrayContains(keywords, strings.ToLower(token)) {
tokens = append(tokens, Token{token}) tokens = append(tokens, Token{token})
token = "" token = ""
} else if !byteArrayContains(whitespace, c) { } else if !byteArrayContains(whitespace, c) {

View File

@@ -8,7 +8,7 @@ import (
func main(){ func main(){
// read test file // read test file
code, _ := ioutil.ReadFile("in/simple.asl") code, _ := ioutil.ReadFile("in/statements.asl")
token := asl.Tokenize(code) token := asl.Tokenize(code)
out := asl.Parse(token) out := asl.Parse(token)