Added conditional expressions.

This commit is contained in:
Marvin Blum
2015-10-14 22:00:59 +02:00
parent 8144e207ed
commit a8c6da2958
5 changed files with 69 additions and 44 deletions

View File

@@ -1 +1 @@
var x = (1+(2+3))/(6*(someVariable+99-100))-(20)+anotherVariable+foo(); var x = (a < b <= c) >= 10 && true;

View File

@@ -67,7 +67,7 @@ func parseIf() {
parseExpression(true) parseExpression(true)
appendOut(") then {", true) appendOut(") then {", true)
expect("{") expect("{")
parseBlock() parseExpression(true)
expect("}") expect("}")
if accept("else") { if accept("else") {
@@ -301,41 +301,34 @@ func parseParameter() {
} }
func parseExpression(out bool) string { func parseExpression(out bool) string {
/*openingBrackets := 0 output := parseArith()
output := ""
for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) { for accept("<") || accept(">") || accept("&") || accept("|") || accept("=") {
current := get().token if accept("<") {
output += "<"
if out { next()
appendOut(current, false) } else if accept(">") {
output += ">"
next()
} else if accept("&") {
next()
expect("&")
output += "&&"
} else if accept("|") {
next()
expect("|")
output += "||"
} else { } else {
output += current output += "="
}
if accept("(") {
openingBrackets++
} else if accept(")") {
openingBrackets--
}
next() next()
} }
return output*/ if accept("=") {
output += "="
output := parseFactor()
for accept("+") || accept("-") {
if accept("+") {
output += "+"
next() next()
}
output += parseExpression(false) output += parseExpression(false)
} else {
output += "-"
next()
output += parseExpression(false)
}
} }
if out { if out {
@@ -378,14 +371,30 @@ func parseFactor() string {
for accept("*") || accept("/") { // TODO: modulo? for accept("*") || accept("/") { // TODO: modulo?
if accept("*") { if accept("*") {
output += "*" output += "*"
next()
output += parseExpression(false)
} else { } else {
output += "/" output += "/"
}
next()
output += parseExpression(false)
}
return output
}
func parseArith() string {
output := parseFactor()
for accept("+") || accept("-") {
if accept("+") {
output += "+"
} else {
output += "-"
}
next() next()
output += parseExpression(false) output += parseExpression(false)
} }
}
return output return output
} }

View File

@@ -55,12 +55,26 @@ func TestParserFunction(t *testing.T) {
} }
// TODO // TODO
/*func TestParserAssignResult(t *testing.T) { func TestParserAssignResult(t *testing.T) {
got := getCompiled(t, "test/parser_assign_result.asl") got := getCompiled(t, "test/parser_assign_result.asl")
want := "x = [1, 2, 3] call foo;\ny = [1, 2, 3] call bar;" want := "x = [1, 2, 3] call foo;\ny = [1, 2, 3] call bar;"
equal(t, got, want) 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 { func getCompiled(t *testing.T, file string) string {
code, err := ioutil.ReadFile(file) code, err := ioutil.ReadFile(file)

View File

@@ -0,0 +1 @@
var x = (1+(2+3))/(6*(someVariable+99-100))-(20)+anotherVariable+foo();

View File

@@ -0,0 +1 @@
var x = true || (3 >= 4 && 5 < 8);