Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Syntax Documentation #85

Open
Allsetra-RB opened this issue Nov 18, 2020 · 2 comments
Open

Syntax Documentation #85

Allsetra-RB opened this issue Nov 18, 2020 · 2 comments

Comments

@Allsetra-RB
Copy link

Hi,

I was having some trouble finding the exact syntax the library requires. Just wanted to mention that it's worth documenting. I found a post on codeproject that describes the syntax. Consider working it into the GetStarted documentation page.

(The link might be out of date. I found that I needed to use ; as a separator in the if statement, which makes sense since in Dutch the , conflicts with a decimal point.)

@gotmachine
Copy link

The lack of a documentation for the expression language syntax is indeed annoying. Took the liberty to convert the codeproject table to markdown, in case @mparlak has some time to update the wiki. So far I haven't found anything that is outdated, but I haven't tested everything.

The Expression Language

The expression language that this library parses is a mix of elements of C# and VB.NET. Since the aim of this library is speed, the language is strongly typed (same rules as C#) and there is no late binding. Unlike C#, the language is not case-sensitive. Here is a breakdown of the language elements:

Element Description Example
+, - Additive 100 + a
*, /, % Multiplicative 100 * 2 / (3 % 2)
^ Power 2 ^ 16
- Negation -6 + 10
+ Concatenation "abc" + "def"
<<, >> Shift 0x80 >> 2
=, <>, <, >, <=, >= Comparison 2.5 > 100
And, Or, Xor, Not Logical (1 > 10) and (true or not false)
And, Or, Xor, Not Bitwise 100 And 44 or (not 255)
If Conditional If(a > 100, "greater", "less")
Cast Cast and conversion cast(100.25, int)
[] Array index 1 + arr[i+1]
. Member varA.varB.function("a")
String literal "string!"
Char literal 'c'
Boolean literal true AND false
Real literal Double and single 100.25 + 100.25f
Integer literal Signed/unsigned 32/64 bit 100 + 100U + 100L + 100LU
Hex literal 0xFF + 0xABCDU + 0x80L + 0xC9LU
### The Expression Language

The expression language that this library parses is a mix of elements of C# and VB.NET. Since the aim of this library is speed, the language is strongly typed (same rules as C#) and there is no late binding. Unlike C#, the language is not case-sensitive. Here is a breakdown of the language elements:

| Element             | Description               | Example                            |
|---------------------|---------------------------|------------------------------------|
| +, -                | Additive                  | `100 + a `                         |
| *, /, %             | Multiplicative            | `100 * 2 / (3 % 2)`                |
| ^                   | Power                     | `2 ^ 16`                           |
| -                   | Negation                  | `-6 + 10`                          |
| +                   | Concatenation             | `"abc" + "def"`                    |
| <<, >>              | Shift                     | `0x80 >> 2`                        |
| =, <>, <, >, <=, >= | Comparison                | `2.5 > 100`                        |
| And, Or, Xor, Not   | Logical                   | `(1 > 10) and (true or not false)` |
| And, Or, Xor, Not   | Bitwise                   | `100 And 44 or (not 255)`          |
| If                  | Conditional               | `If(a > 100, "greater", "less")`   |
| Cast                | Cast and conversion       | `cast(100.25, int)`                |
| []                  | Array index               | `1 + arr[i+1]`                     |
| .                   | Member                    | `varA.varB.function("a")`          |
| String literal      |                           | `"string!"`                        |
| Char literal        |                           | `'c'`                              |
| Boolean literal     |                           | `true AND false`                   |
| Real literal        | Double and single         | `100.25 + 100.25f`                 |
| Integer literal     | Signed/unsigned 32/64 bit | `100 + 100U + 100L + 100LU`        |
| Hex literal         |                           | `0xFF + 0xABCDU + 0x80L + 0xC9LU`  |

@hunkydoryrepair
Copy link
Contributor

Would like to see these in order of operator precedence, too.

The "Getting Started" mentions overloading operators, but that also is undocumented. I can see the code that is checking for overloaded operators, but not how to set them. I supplied my own "Multiply" function but it does not get used.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants