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)
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
}

View File

@@ -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)

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);