summaryrefslogtreecommitdiff
path: root/spec/syntax.md
blob: b85ed78375c0905b7ecd7f4a2b8ac8b0db12cab2 (plain)
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.

```


```