From c3c4ca6f7dd01e08df15bd0cfbad5c66157ad2f1 Mon Sep 17 00:00:00 2001 From: Marvin Blum Date: Sun, 25 Oct 2015 13:51:53 +0100 Subject: [PATCH] Added try ... catch. --- ToDo.md | 2 +- in/simple.asl | 9 ++++++--- src/asl/parser.go | 16 ++++++++++++++++ src/asl/parser_test.go | 7 +++++++ src/asl/tokenizer.go | 4 +++- src/main/asl.go | 2 +- test/parser_try_catch.asl | 5 +++++ 7 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 test/parser_try_catch.asl diff --git a/ToDo.md b/ToDo.md index 6a1df76..97a12fc 100644 --- a/ToDo.md +++ b/ToDo.md @@ -10,7 +10,7 @@ * ~~inline buildin function call -> foo(a)(bar(x)(y));~~ * ~~negative values e.g. -1, operator !~~ * ~~tokenizer splits commands like "format" -> for, mat~~ -* try ... catch +* ~~try ... catch~~ ## Special cases diff --git a/in/simple.asl b/in/simple.asl index 0bc4a9c..f11ba71 100644 --- a/in/simple.asl +++ b/in/simple.asl @@ -1,3 +1,6 @@ -// TODO: -//var _x = setHitIndex(vehicle()(player))(1, 1); - +try { + var x = 100; + doSomething(x); +} catch { + errorHandling(); +} diff --git a/src/asl/parser.go b/src/asl/parser.go index 4d5bb0a..b85cc7b 100644 --- a/src/asl/parser.go +++ b/src/asl/parser.go @@ -35,6 +35,8 @@ func parseBlock() { parseFunction() } else if accept("return") { parseReturn() + } else if accept("try") { + parseTryCatch() } else if accept("case") || accept("default") { return } else { @@ -232,6 +234,20 @@ func parseReturn() { appendOut(";", true) } +func parseTryCatch() { + expect("try") + expect("{") + appendOut("try {", true) + parseBlock() + expect("}") + expect("catch") + expect("{") + appendOut("} catch {", true) + parseBlock() + expect("}") + appendOut("};", true) +} + // Everything that does not start with a keyword. func parseStatement() { // empty block diff --git a/src/asl/parser_test.go b/src/asl/parser_test.go index 218cc35..80b3c76 100644 --- a/src/asl/parser_test.go +++ b/src/asl/parser_test.go @@ -101,6 +101,13 @@ func TestParserOperator(t *testing.T) { equal(t, got, want) } +func TestParserTryCatch(t *testing.T) { + got := getCompiled(t, "test/parser_try_catch.asl") + want := "try {\n} catch {\n};\n" + + equal(t, got, want) +} + func getCompiled(t *testing.T, file string) string { code, err := ioutil.ReadFile(file) diff --git a/src/asl/tokenizer.go b/src/asl/tokenizer.go index 047aeea..6d28c70 100644 --- a/src/asl/tokenizer.go +++ b/src/asl/tokenizer.go @@ -41,7 +41,9 @@ var keywords = []string{ "false", "case", "default", - "return"} + "return", + "try", + "catch"} var whitespace = []byte{' ', '\n', '\t'} var identifier = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_" diff --git a/src/main/asl.go b/src/main/asl.go index 5393431..332f11c 100644 --- a/src/main/asl.go +++ b/src/main/asl.go @@ -19,7 +19,7 @@ func usage() { func main() { // read test file - code, _ := ioutil.ReadFile("in/complex.asl") + code, _ := ioutil.ReadFile("in/simple.asl") token := asl.Tokenize(code) out := asl.Parse(token, true) diff --git a/test/parser_try_catch.asl b/test/parser_try_catch.asl new file mode 100644 index 0000000..ca777d4 --- /dev/null +++ b/test/parser_try_catch.asl @@ -0,0 +1,5 @@ +try { + // ... +} catch { + // ... +}