From 353d495c50ccb326c37f80ad8c5da77d7f0c0a80 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Tue, 16 Apr 2024 03:54:50 +0200 Subject: [PATCH] two new operators added: '<<' and '>> --- operator-insert.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++ operator-sum.go | 4 +-- scanner.go | 4 +++ symbol.go | 2 ++ 4 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 operator-insert.go diff --git a/operator-insert.go b/operator-insert.go new file mode 100644 index 0000000..3a71c64 --- /dev/null +++ b/operator-insert.go @@ -0,0 +1,66 @@ +// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). +// All rights reserved. + +// operator-insert.go +package expr + + +//-------- insert term + +func newInsertTerm(tk *Token) (inst *term) { + return &term{ + tk: *tk, + children: make([]*term, 0, 2), + position: posInfix, + priority: priSign, + evalFunc: evalInsert, + } +} + +func newAppendTerm(tk *Token) (inst *term) { + return &term{ + tk: *tk, + children: make([]*term, 0, 2), + position: posInfix, + priority: priSign, + evalFunc: evalAppend, + } +} + +func evalInsert(ctx ExprContext, self *term) (v any, err error) { + var leftValue, rightValue any + + if leftValue, rightValue, err = self.evalInfix(ctx); err != nil { + return + } + + if isList(rightValue) { + list, _ := rightValue.([]any) + v = append([]any{leftValue}, list...) + } else { + err = self.errIncompatibleType(rightValue) + } + return +} + +func evalAppend(ctx ExprContext, self *term) (v any, err error) { + var leftValue, rightValue any + + if leftValue, rightValue, err = self.evalInfix(ctx); err != nil { + return + } + + if isList(leftValue) { + list, _ := leftValue.([]any) + v = append(list, rightValue) + } else { + err = self.errIncompatibleType(leftValue) + } + return +} + +// init +func init() { + registerTermConstructor(SymInsert, newInsertTerm) + registerTermConstructor(SymAppend, newAppendTerm) +} diff --git a/operator-sum.go b/operator-sum.go index ac0f21b..53cd520 100644 --- a/operator-sum.go +++ b/operator-sum.go @@ -65,9 +65,7 @@ func evalPlus(ctx ExprContext, self *term) (v any, err error) { func newMinusTerm(tk *Token) (inst *term) { return &term{ - tk: *tk, - // class: classOperator, - // kind: kindUnknown, + tk: *tk, children: make([]*term, 0, 2), position: posInfix, priority: priSum, diff --git a/scanner.go b/scanner.go index f244f29..e4eb848 100644 --- a/scanner.go +++ b/scanner.go @@ -219,6 +219,8 @@ func (self *scanner) fetchNextToken() (tk *Token) { case '<': if next, _ := self.peek(); next == '=' { tk = self.moveOn(SymLessOrEqual, ch, next) + } else if next == '<' { + tk = self.moveOn(SymAppend, ch, next) } else if next == '>' { tk = self.moveOn(SymLessGreater, ch, next) } else { @@ -227,6 +229,8 @@ func (self *scanner) fetchNextToken() (tk *Token) { case '>': if next, _ := self.peek(); next == '=' { tk = self.moveOn(SymGreaterOrEqual, ch, next) + } else if next == '>' { + tk = self.moveOn(SymInsert, ch, next) } else { tk = self.makeToken(SymGreater, ch) } diff --git a/symbol.go b/symbol.go index 5ebe214..341fc78 100644 --- a/symbol.go +++ b/symbol.go @@ -59,6 +59,8 @@ const ( SymQuestionEqual // 48: '?=' SymDoubleAt // 49: '@@' SymDoubleColon // 50: '::' + SymInsert // 51: '>>' + SymAppend // 52: '<<' SymChangeSign SymUnchangeSign SymIdentifier