mirror of
https://github.com/Kugelschieber/asl.git
synced 2026-01-18 12:00:25 +00:00
Added conditional expressions.
This commit is contained in:
@@ -67,7 +67,7 @@ func parseIf() {
|
||||
parseExpression(true)
|
||||
appendOut(") then {", true)
|
||||
expect("{")
|
||||
parseBlock()
|
||||
parseExpression(true)
|
||||
expect("}")
|
||||
|
||||
if accept("else") {
|
||||
@@ -301,42 +301,35 @@ func parseParameter() {
|
||||
}
|
||||
|
||||
func parseExpression(out bool) string {
|
||||
/*openingBrackets := 0
|
||||
output := ""
|
||||
|
||||
for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) {
|
||||
current := get().token
|
||||
|
||||
if out {
|
||||
appendOut(current, false)
|
||||
} else {
|
||||
output += current
|
||||
}
|
||||
|
||||
if accept("(") {
|
||||
openingBrackets++
|
||||
} else if accept(")") {
|
||||
openingBrackets--
|
||||
}
|
||||
|
||||
next()
|
||||
output := parseArith()
|
||||
|
||||
for accept("<") || accept(">") || accept("&") || accept("|") || accept("=") {
|
||||
if accept("<") {
|
||||
output += "<"
|
||||
next()
|
||||
} else if accept(">") {
|
||||
output += ">"
|
||||
next()
|
||||
} else if accept("&") {
|
||||
next()
|
||||
expect("&")
|
||||
output += "&&"
|
||||
} else if accept("|") {
|
||||
next()
|
||||
expect("|")
|
||||
output += "||"
|
||||
} else {
|
||||
output += "="
|
||||
next()
|
||||
}
|
||||
|
||||
if accept("=") {
|
||||
output += "="
|
||||
next()
|
||||
}
|
||||
|
||||
output += parseExpression(false)
|
||||
}
|
||||
|
||||
return output*/
|
||||
|
||||
output := parseFactor()
|
||||
|
||||
for accept("+") || accept("-") {
|
||||
if accept("+") {
|
||||
output += "+"
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
} else {
|
||||
output += "-"
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
}
|
||||
}
|
||||
|
||||
if out {
|
||||
appendOut(output, false)
|
||||
@@ -370,7 +363,7 @@ func parseTerm() string {
|
||||
}
|
||||
|
||||
return parseIdentifier()
|
||||
}
|
||||
}
|
||||
|
||||
func parseFactor() string {
|
||||
output := parseTerm()
|
||||
@@ -378,14 +371,30 @@ func parseFactor() string {
|
||||
for accept("*") || accept("/") { // TODO: modulo?
|
||||
if accept("*") {
|
||||
output += "*"
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
} else {
|
||||
output += "/"
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
}
|
||||
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
func parseArith() string {
|
||||
output := parseFactor()
|
||||
|
||||
for accept("+") || accept("-") {
|
||||
if accept("+") {
|
||||
output += "+"
|
||||
} else {
|
||||
output += "-"
|
||||
}
|
||||
|
||||
next()
|
||||
output += parseExpression(false)
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
@@ -55,12 +55,26 @@ func TestParserFunction(t *testing.T) {
|
||||
}
|
||||
|
||||
// TODO
|
||||
/*func TestParserAssignResult(t *testing.T) {
|
||||
func TestParserAssignResult(t *testing.T) {
|
||||
got := getCompiled(t, "test/parser_assign_result.asl")
|
||||
want := "x = [1, 2, 3] call foo;\ny = [1, 2, 3] call bar;"
|
||||
|
||||
equal(t, got, want)
|
||||
}*/
|
||||
}
|
||||
|
||||
func TestExpression(t *testing.T) {
|
||||
got := getCompiled(t, "test/parser_expression.asl")
|
||||
want := "x = (1+(2+3))/(6*(someVariable+99-100))-(20)+anotherVariable+([] call foo);\n"
|
||||
|
||||
equal(t, got, want)
|
||||
}
|
||||
|
||||
func TestExpression2(t *testing.T) {
|
||||
got := getCompiled(t, "test/parser_expression2.asl")
|
||||
want := "x = true||(3>=4&&5<8);\n"
|
||||
|
||||
equal(t, got, want)
|
||||
}
|
||||
|
||||
func getCompiled(t *testing.T, file string) string {
|
||||
code, err := ioutil.ReadFile(file)
|
||||
|
||||
Reference in New Issue
Block a user