xn/doc/01_syntax.md
2026-04-26 18:08:49 +00:00

76 lines
2.1 KiB
Markdown

# XN Syntax
## Comments
Comments are single line only prefixed with the pound sign ('#').
## Rules
Rules consists of two parts, a selector, and a block containing statements.
A selector is an XPath string surrounded with braces prefixed with a dollar sign.
The XPath selects zero or more document nodes which will serve as the context for the statement block.
## Bangs
Bangs are function calls combined with a statement block.
They are prefixed with an exclaimation mark.
A bang function always produces context nodes for the statement block.
## Statement Block
A statement block are multiple statements terminated with a semicolon,
surrounded by curly braces.
## Statements
A statement can be an expression, a function call, a rule or a bang.
To note is that a nested rule will use its parents context to refine the selection further.
## Expressions
An expression can consist of function calls, operators, strings or numbers.
Operators supported:
| Operator | Function |
|----------|----------------------|
| + | addition |
| - | subtraction |
| * | multiplication |
| / | division |
| ** | power |
| & | bitwise and |
| | | bitwise or |
| ^ | bitwise exclusive or |
| .. | string concatenate |
## Example
```
# Select the RxPdo with Index 0x1600
$("RxPdo/Index[.="#x1600"]/..")
{
# Function call
swap("Entry[3]", "Entry[4]");
# Of that RxPdo, select the 3rd Entry via a nested rule
$("Entry[3]")
{
# This bang has "RxPdo/Index[.="#x1600"]/../Entry[3]" as its context
!before("Entry")
{
# Function call contains an expression, which evaluates here to "!#xFFFF"
!add("Index") { text("!"..hexlit(2**16-1)); };
!add("SubIndex") { text("3"); }
!add("BitLen") { text("256"); }
!add("Name") { text("Test"); }
!add("DataType") { text("UINT"); }
}
}
}
# One .xn can contain multiple rules
$("//Module[@Crc32]")
{
attr("Crc32", hexlit(crc32()));
};
```