You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.8 KiB
Markdown
50 lines
1.8 KiB
Markdown
### Action Execution Environment
|
|
|
|
Actions and predicates have these variables and functions available to them.
|
|
|
|
* All variables and functions defined in the initializer at the beginning of the grammar are available.
|
|
|
|
* Labels from preceding expressions are available as local variables, which will have the match result of the labelled expressions.
|
|
|
|
A label is only available after its labelled expression is matched:
|
|
|
|
```pegjs
|
|
rule = A:('a' B:'b' { /* B is available, A is not */ } )
|
|
```
|
|
|
|
A label in a sub-expression is only valid within the sub-expression:
|
|
|
|
```pegjs
|
|
rule = A:'a' (B: 'b') (C: 'b' { /* A and C are available, B is not */ })
|
|
```
|
|
|
|
* `options` is a variable that contains the parser options.
|
|
|
|
* `error(message, where)` will report an error and throw an exception. `where` is optional; the default is the value of `location()`.
|
|
|
|
* `expected(message, where)` is similar to `error`, but reports: Expected _message_ but "_other_" found
|
|
|
|
* `location()` returns an object like this:
|
|
|
|
```js
|
|
{
|
|
start: { offset: 23, line: 5, column: 6 },
|
|
end: { offset: 25, line: 5, column: 8 }
|
|
}
|
|
```
|
|
|
|
For actions, `start` refers to the position at the beginning of the preceding expression, and `end` refers to the position after the end of the preceding expression.
|
|
|
|
For predicates, `start` and `end` are the same, the location where the predicate is evaluated.
|
|
|
|
`offset` is a 0-based character index within the source text.
|
|
`line` and `column` are 1-based indices.
|
|
|
|
Note that `line` and `column` are somewhat expensive to compute, so if you need location frequently, you might want to use `offset()` or `range()` instead.
|
|
|
|
* `offset()` returns the start offset.
|
|
|
|
* `range()` returns an array containing the start and end offsets, such as `[23, 25]`.
|
|
|
|
* `text()` returns the source text between `start` and `end` (which will be "" for predicates).
|