From 70730efb78f72ae40da8a05a398746295f8a03d1 Mon Sep 17 00:00:00 2001 From: Miha-ha Date: Sun, 29 Apr 2018 10:09:10 +0300 Subject: [PATCH 1/2] the correct parsing of complex expressions --- parse/parse.go | 18 +++++++--- parse/parse_test.go | 84 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/parse/parse.go b/parse/parse.go index e8c7371..7128a74 100644 --- a/parse/parse.go +++ b/parse/parse.go @@ -51,10 +51,20 @@ loop: break loop } case T_LOGICAL_AND, T_LOGICAL_OR, T_LOGICAL_NOT, T_IS_EQUAL, T_IS_NOT_EQUAL, T_IS_GREATER, T_IS_GREATER_OR_EQUAL, T_IS_SMALLER, T_IS_SMALLER_OR_EQUAL: - node.value = token - node.right = newTree() - stack.push(node) - node = node.right + if node.value.Type != T_ERR { + //new root + tree = newTree() + tree.left = node + tree.right = newTree() + tree.value = token + stack.push(tree) + node = tree.right + } else { + node.value = token + node.right = newTree() + stack.push(node) + node = node.right + } case T_IDENTIFIER, T_NUMBER, T_STRING, T_BOOLEAN: node.value = token node, err = stack.pop() diff --git a/parse/parse_test.go b/parse/parse_test.go index 008c2df..b4edb06 100644 --- a/parse/parse_test.go +++ b/parse/parse_test.go @@ -9,6 +9,90 @@ func TestParser(t *testing.T) { exp string ast *tree }{ + { + "foo > bar", + &tree{ + value: token{Type: T_IS_GREATER, Value: ">"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "foo"}, + }, + right: &tree{ + value: token{Type: T_IDENTIFIER, Value: "bar"}, + }, + }, + }, + { + "((f > 1) && (f < 3)) && ((b > 1) && (b < 3))", + &tree{ + value: token{Type: T_LOGICAL_AND, Value: "&&"}, + left: &tree{ + value: token{Type: T_LOGICAL_AND, Value: "&&"}, + left: &tree{ + value: token{Type: T_IS_GREATER, Value: ">"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "f"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "1"}, + }, + }, + right: &tree{ + value: token{Type: T_IS_SMALLER, Value: "<"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "f"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "3"}, + }, + }, + }, + right: &tree{ + value: token{Type: T_LOGICAL_AND, Value: "&&"}, + left: &tree{ + value: token{Type: T_IS_GREATER, Value: ">"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "b"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "1"}, + }, + }, + right: &tree{ + value: token{Type: T_IS_SMALLER, Value: "<"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "b"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "3"}, + }, + }, + }, + }, + }, + { + "((f > 1) && (f < 3))", + &tree{ + value: token{Type: T_LOGICAL_AND, Value: "&&"}, + left: &tree{ + value: token{Type: T_IS_GREATER, Value: ">"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "f"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "1"}, + }, + }, + right: &tree{ + value: token{Type: T_IS_SMALLER, Value: "<"}, + left: &tree{ + value: token{Type: T_IDENTIFIER, Value: "f"}, + }, + right: &tree{ + value: token{Type: T_NUMBER, Value: "3"}, + }, + }, + }, + }, { "(foo > bar)", &tree{ From 262b481ac9da063c234c36ddd8ea2dedff38aee6 Mon Sep 17 00:00:00 2001 From: Miha-ha Date: Tue, 8 May 2018 22:20:41 +0300 Subject: [PATCH 2/2] remove comment --- parse/parse.go | 1 - 1 file changed, 1 deletion(-) diff --git a/parse/parse.go b/parse/parse.go index 7128a74..5b2b0f2 100644 --- a/parse/parse.go +++ b/parse/parse.go @@ -52,7 +52,6 @@ loop: } case T_LOGICAL_AND, T_LOGICAL_OR, T_LOGICAL_NOT, T_IS_EQUAL, T_IS_NOT_EQUAL, T_IS_GREATER, T_IS_GREATER_OR_EQUAL, T_IS_SMALLER, T_IS_SMALLER_OR_EQUAL: if node.value.Type != T_ERR { - //new root tree = newTree() tree.left = node tree.right = newTree()