# 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. ``` ```