mirror of
https://github.com/Kugelschieber/asl.git
synced 2026-01-18 12:00:25 +00:00
Added while and switch.
This commit is contained in:
@@ -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
26
in/zeus.asl
Normal 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.
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user