Usage
Command Line Options
In the Nix development shell (and project root directory), run python -m lamb -h to see help information.
Some frequently used command-line toggles are listed below:
-c <length>: stop searching for ambiguous sentences after reaching the given length. This is useful if you want to check the bounded unambiguity of a given grammar.-l <length>: start the checking process at the specified length. This assumes that one has already checked that any shorter sentence under this grammar is unambiguous.-s: output metrics like running time as well as REPL outputs as machine-readable JSON strings.
EBNF Syntax
Lamb accepts .bnf files as inputs.
A formal definition in Antlr can be found here.
Informally, a .bnf file consists of many production rules, each has the form
<nonterminal> ::= <expr> ;The expression is one of the following:
- An identifier representing a nonterminal (e.g.,
block) - A quoted string representing a terminal (e.g.,
"do") - A parenthesized expression (to promote priority)
- A sequence of expressions as concatenation
- A postfix expression
- An infix expression
We include all standard EBNF constructs:
- Postfix
+for Kleene plus (occur at least once) - Postfix
*for Kleene star (occur an arbitrary number of times, including zero) - Postfix
?for optional (occur once or none) - Infix
|for alternative (choose either part)
We support the following layout constraints:
- Infix
<>or||for alignment (the first tokens of the two parts have the same column number) - Infix
->for indentation (the second part has its first token to the right of the first part and a newline in between) - Postfix
|>for offside (any subsequent lines must start from a column that is further to the right of the start token of the first line) - Postfix
|>>for offside align (a variant of the above: subsequent lines can start from the same column as that of the first line) - Postfix
|+|for aligned Kleene plus (a variant of Kleene plus, but each element must be aligned to each other) - Postfix
|*|for aligned Kleene star (a variant of Kleene plus, but each element must be aligned to each other) - Postfix
~for single-line (one-line)
If needed, check the examples in the tests/ folder for a better understanding.