# Engine expression language

The Engine contains a rudimentary expression language for computing guards.

## Types

The languages supports the types Strings, Booleans, Integers, and Floats. `Null`

is a valid value of every type.

## Syntax

```
expr ::= expr && expr # Conjunction ("and")
| expr || expr # Disjunction ("or")
| expr < expr
| expr > expr
| expr = expr
| expr != expr
| expr ++ expr # String concatenation
| expr + expr
| ( expr )
| const
| var
const ::= ('"'[^'"']*'"') | ('\''[^'\'']*'\'') # string
| ('-'? digit+) # int
| ('-'? digit+ '.' digit+) # double
| true
| false
| null
var ::= (char|['_' '$'])(char|['-' '_' '\'']|digit)* # identifier
```

Examples of constant expressions:

```
1
10.0
"A string"
null
true
false
```

## Semantics

Variables `var`

refer to events in scope at the location of the expression;
see [articles/location.md] for details.

Less-than and greater-than operators convert between numeric types, and return
false if either side is `null`

.

## Examples

An expression that evaluates to true if the event `Amount`

is greater than 10000:

```
Amount > 10000
```

An expression that evaluates to true if the event `Type`

is equal to the
string `Architect`

or `null`

.

```
Type == "Architect" || Type == null
```

An expression that evaluates to true if the event `Amount`

plus 1000 is greater
than 10000 or less than 20000:

```
(Amount + 1000 > 10000) || (Amount + 1000 < 20000)
```

## Programmatic specification

Expressions are constructed programmatically using the Expression class. Use the from-string constructor which parses an expression from a string:

```
Expression e = new Expression("I > 1000");
```

Use expressions to construct guarded relations. E.g., to construct a condition from top-level event "G" to top-level event "H" which is active only when the top-level event "I" has a value greater than 1000:

```
graph.AddCondition("G", "H", null, new Expression("I > 0"), null);
```

You can check whether an expression is syntax and type-correct in a particular graph using the call CheckExpression.