GO package for analysis and calculation of expressions
Go to file
2024-03-28 08:52:54 +01:00
ast_test.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
ast.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
byte-slider.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
context.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
go.mod added go.mod 2024-03-26 08:56:20 +01:00
helpers_test.go helpers_test.go: changed some comments 2024-03-28 06:34:40 +01:00
helpers.go helpers.go provides easy functions to parse and evaluate expressions 2024-03-28 06:32:37 +01:00
operand-const.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operand-func.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operand-list.go Added list '[]' data type. Fix: function with no arguments 2024-03-28 08:51:02 +01:00
operand-var.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operator-bool.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operator-fact.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operator-prod.go added operator '%' (division remainder) and test 2024-03-26 09:27:14 +01:00
operator-rel.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operator-sign.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
operator-sum.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
parser_test.go parser_test.go: add test on the list data type 2024-03-28 08:52:54 +01:00
parser.go Added list '[]' data type. Fix: function with no arguments 2024-03-28 08:51:02 +01:00
README.adoc Second incomplete draft 2024-03-27 08:44:47 +01:00
scanner_test.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
scanner.go Added the tilde '~' operator acting as NOT 2024-03-28 06:25:29 +01:00
simple-func-store.go Added simple context objects 2024-03-28 06:29:11 +01:00
simple-var-store.go Added simple context objects 2024-03-28 06:29:11 +01:00
symbol.go Added list '[]' data type. Fix: function with no arguments 2024-03-28 08:51:02 +01:00
term_test.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
term-constuctor-registry.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
term.go Added the tilde '~' operator acting as NOT 2024-03-28 06:25:29 +01:00
token_test.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
token.go Added copyrighr note to all sources 2024-03-26 08:45:18 +01:00
utils.go utils.go: added functions anyInteger() and anyFloat() 2024-03-28 06:26:20 +01:00

Expr

1. Expr

Expr is a GO package capable of analysing, interpreting and calculating expressions.

1.1. Usage

import (
	"fmt"
	"strings"

	"git.portale-stac.it/go-pkg/expr"
)

func main() {
	ctx := expr.NewSimpleVarStore()
	ctx.SetValue("var", int64(4))

	source := `(3-1)*(10/5) == var`

    r := strings.NewReader(source)
    scanner := expr.NewScanner(r, DefaultTranslations())
	parser := expr.NewParser(ctx)

	if ast, err := parser.parse(scanner); err == nil {
		if result, err := ast.eval(ctx); err == nil {
            fmt.Printf("%q -> %v [%T]\n", source, result, result)
        } else {
            fmt.Println("Error calculating the expression:", err)
        }
	} else {
        fmt.Println("Error parsing the expression:", err)
    }
}

The above program is equivalent to the following one.

import (
	"fmt"
	"git.portale-stac.it/go-pkg/expr"
)

func main() {
	ctx := expr.NewSimpleVarStore()
	ctx.SetValue("var", int64(4))

	source := `(3-1)*(10/5) == var`

    if result, err := expr.evalString(ctx, source); err == nil {
        fmt.Printf("%q -> %v [%T]\n", source, result, result)
    } else {
        fmt.Println("Error calculating the expression:", err)
    }
}

1.2. Data types

Expr supports numerical, string, relational, and boolean expressions.

1.2.1. Numbers

Numbers can be integers (GO int64) and float (GO float64). In mixed operations involving integers and floats, integers are automatically promoted to floats.

Table 1. Arithmetic operators
Symbol Operation Description Examples

+ / -

change sign

Change the sign of values

-1 [-1], -(+2) [-2]

+

sum

Add two values

-1 + 2 [1], 4 + 0.5 [4.5]

-

subtracion

Subtract the right value from the left one

3 - 1 [2], 4 - 0.5 [3.5]

*

product

Multiply two values

-1 * 2 [-2], 4 * 0.5 [2.0]

/

Division

Divide the left value by the right one

-1 / 2 [0], 1.0 / 2 [0.5]

./

Float division

Force float division

-1 ./ 2 [-0.5]

%

Modulo

Remainder of the integer division

5 % 2 [1]

1.2.2. String

Strings are character sequences enclosed between two double quote ".

1.2.3. Boolean

Boolean data type has two values only: true and false. Relational and Boolean expressions produce a Boolean values.

Table 2. Relational operators
Symbol Operation Description Examples

<

Less

True if the left value is less than the right one

5 < 2 [false], "a" < "b" [true]

<=

Less or Greater

True if the left value is less or greater than the right one

5 ⇐ 2 [false], "b" ⇐ "b" [true]

Table 3. Boolean operators
Symbol Operation Description Examples

NOT

Not

True if the right value is false

NOT true [false], NOT (2 < 1) [true]

AND / &&

And

True if both left and right values are true

false && true [false], "a" < "b" AND NOT (2 < 1) [true]

OR / ||

Or

True if at least one of the left and right values integers true

false or true [true], "a" == "b" OR (2 == 1) [false]