summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
Diffstat (limited to 'parser')
-rw-r--r--parser/README.md2
-rw-r--r--parser/expr.go4
-rw-r--r--parser/interpreter_test.go4
3 files changed, 5 insertions, 5 deletions
diff --git a/parser/README.md b/parser/README.md
index 23c23b8..c9ff440 100644
--- a/parser/README.md
+++ b/parser/README.md
@@ -70,7 +70,7 @@ Go language support:
- [ ] select statement
- [x] binary operators
- [ ] unary operators
-- [ ] logical operators && and ||
+- [x] logical operators && and ||
- [ ] assign operators
- [x] operator precedence rules
- [x] parenthesis expressions
diff --git a/parser/expr.go b/parser/expr.go
index 18c97a5..d626e9e 100644
--- a/parser/expr.go
+++ b/parser/expr.go
@@ -85,7 +85,7 @@ func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) {
if out, err = p.ParseLogical(out); err != nil {
return out, err
}
- if l := len(out) - 1; out[l].Id == lang.Define || out[l].Id == lang.Assign {
+ if l := len(out) - 1; l >= 0 && (out[l].Id == lang.Define || out[l].Id == lang.Assign) {
// Handle the assignment of a logical expression.
s1 := p.subExprLen(out[:l])
head, err := p.ParseLogical(out[:l-s1])
@@ -139,7 +139,7 @@ func (p *Parser) ParseExprStr(s string) (tokens Tokens, err error) {
// If the last token is not a logical operator then the function is idempotent.
func (p *Parser) ParseLogical(in Tokens) (out Tokens, err error) {
l := len(in) - 1
- if !in[l].Id.IsLogicalOp() {
+ if l < 0 || !in[l].Id.IsLogicalOp() {
return in, nil
}
xp := strconv.Itoa(p.labelCount[p.scope])
diff --git a/parser/interpreter_test.go b/parser/interpreter_test.go
index 9794337..02cd105 100644
--- a/parser/interpreter_test.go
+++ b/parser/interpreter_test.go
@@ -96,8 +96,8 @@ func TestIf(t *testing.T) {
{src: "a := 0; if a == 1 { a = 2 } else { a = 1 }; a", res: "1"},
{src: "a := 0; if a == 1 { a = 2 } else if a == 0 { a = 3 } else { a = 1 }; a", res: "3"},
{src: "a := 0; if a == 1 { a = 2 } else if a == 2 { a = 3 } else { a = 1 }; a", res: "1"},
- //{src: "a := 1; if a > 0 && a < 2 { a = 3 }; a", res: "3"},
- //{src: "a := 1; if a < 0 || a < 2 { a = 3 }; a", res: "3"},
+ {src: "a := 1; if a > 0 && a < 2 { a = 3 }; a", res: "3"},
+ {src: "a := 1; if a < 0 || a < 2 { a = 3 }; a", res: "3"},
})
}