<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--subex/arithmetic.go15
-rw-r--r--subex/parse.go4
-rw-r--r--subex/subexast.go14
3 files changed, 32 insertions, 1 deletions
diff --git a/subex/arithmetic.go b/subex/arithmetic.go
index 9e5e530..4cbc9db 100644
--- a/subex/arithmetic.go
+++ b/subex/arithmetic.go
@@ -156,3 +156,18 @@ func notValues(values walk.ValueList) (notted walk.ValueList, err error) {
}
return notted, nil
}
+
+// Returns true if all values are equal, false if not
+func equalValues(values walk.ValueList) (walk.ValueList, error) {
+ if len(values) == 0 {
+ return walk.ValueList{walk.BoolScalar(true)}, nil
+ }
+ first := values[0]
+ for _, value := range values[1:] {
+ // TODO: Refine the equality check
+ if value != first {
+ return walk.ValueList{walk.BoolScalar(false)}, nil
+ }
+ }
+ return walk.ValueList{walk.BoolScalar(true)}, nil
+}
diff --git a/subex/parse.go b/subex/parse.go
index 2392b22..35baaa2 100644
--- a/subex/parse.go
+++ b/subex/parse.go
@@ -260,7 +260,7 @@ func parseSubex(l RuneReader, minPower int, runic bool) SubexAST {
// case '[':
// rangeParts := parseRangeSubex(l)
// lhs = SubexASTRange {rangeParts}
- case ')', ']', '"', '|', ';', '{', '+', '-', '*', '/', '!', '$':
+ case ')', ']', '"', '|', ';', '{', '+', '-', '*', '/', '!', '=', '$':
l.Rewind()
return SubexASTEmpty{}
// case '=':
@@ -366,6 +366,8 @@ func parseSubex(l RuneReader, minPower int, runic bool) SubexAST {
lhs = SubexASTReciprocal {lhs}
case r == '!' && minPower <= 4:
lhs = SubexASTNot {lhs}
+ case r == '=' && minPower <= 4:
+ lhs = SubexASTEqual {lhs}
case r == '$' && minPower <= 4:
slot := l.Next()
if slot == eof {
diff --git a/subex/subexast.go b/subex/subexast.go
index b1ac931..e02091d 100644
--- a/subex/subexast.go
+++ b/subex/subexast.go
@@ -395,6 +395,20 @@ func (ast SubexASTNot) String() string {
return fmt.Sprintf("(%v)!", ast.Content)
}
+// Runs the content Subex and collects the output
+// Replaces it with true if all output values are equal and false otherwise
+type SubexASTEqual struct {
+ Content SubexAST
+}
+func (ast SubexASTEqual) compileWith(next SubexState, slotMap *SlotMap, runic bool) SubexState {
+ return &SubexCaptureBeginState {
+ next: ast.Content.compileWith(&SubexArithmeticEndState {
+ next: next,
+ calculate: equalValues,
+ }, slotMap, runic),
+ }
+}
+
// Does nothing
type SubexASTEmpty struct {}
func (ast SubexASTEmpty) compileWith(next SubexState, slotMap *SlotMap, runic bool) SubexState {