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,42 +301,35 @@ func parseParameter() {
} }
func parseExpression(out bool) string { func parseExpression(out bool) string {
/*openingBrackets := 0 output := parseArith()
output := ""
for accept("<") || accept(">") || accept("&") || accept("|") || accept("=") {
for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) { if accept("<") {
current := get().token output += "<"
next()
if out { } else if accept(">") {
appendOut(current, false) output += ">"
} else { next()
output += current } else if accept("&") {
} next()
expect("&")
if accept("(") { output += "&&"
openingBrackets++ } else if accept("|") {
} else if accept(")") { next()
openingBrackets-- expect("|")
} output += "||"
} else {
next() 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 { if out {
appendOut(output, false) appendOut(output, false)
@@ -370,7 +363,7 @@ func parseTerm() string {
} }
return parseIdentifier() return parseIdentifier()
} }
func parseFactor() string { func parseFactor() string {
output := parseTerm() output := parseTerm()
@@ -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)
} }
next()
output += parseExpression(false)
} }
return output return output
} }
func parseArith() string {
output := parseFactor()
for accept("+") || accept("-") {
if accept("+") {
output += "+"
} else {
output += "-"
}
next()
output += parseExpression(false)
}
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);