1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# Zisp S-Expression Syntax
We use a BNF notation with the following rules:
* Concatenation of expressions is implicit: `foo bar` means `foo`
followed by `bar`.
* Expressions may be followed by `?`, `*`, `+`, `{N}`, or `{N,M}`,
which have the meanings they have in regular expressions.
* The syntax is defined in terms of bytes, not characters. Terminals
`'c'` and `"c"` refer to the ASCII value of the given character `c`.
Numbers are in decimal and refer to a byte with the given value.
* The `~` prefix means NOT. It only applies to rules that match one
byte, and negates them. For example, `~( 'a' | 'b' )` matches any
byte other than 97 and 98.
* Ranges of terminal values are expressed as `x...y` (inclusive).
* There is no ambiguity, backtracking, or look-ahead beyond the byte
currently being matched. Rules match left to right, depth-first,
and greedy. As soon as the input matches the first terminal of a
rule, it must match that rule to the end.
The last rule means that the BNF is very simple to translate to code.
The parser consumes one `unit` from an input stream every time it's
called; it returns the `datum` therein, or EOF.
```
```
|