cfg •
Rust library for manipulating context-free grammars. You can check the documentation here.
Analyzing and modifying grammars
The following features are implemented thus far:
- cycle detection and elimination,
- useless rule detection and elimination,
- grammar binarization,
- nulling rule elimination for binarized grammars,
- FIRST and FOLLOW set computation,
- minimal distance computation,
- unused symbol removal.
Building grammars
cfg
includes an interface that simplifies grammar construction.
Generating symbols
The easiest way of generating symbols is with the sym
method. The library is unaware
of the start symbol.
let mut grammar: Cfg = new;
let = grammar.sym;
Building grammar rules
Rules have a LHS symbol and zero or more RHS symbols.
grammar.rule.rhs
.rhs;
Building sequence rules
Sequence rules have a LHS symbol, a RHS symbol, a range of repetitions, and optional separation. Aside from separation, they closely resemble regular expression repetitions.
grammar.sequence.inclusive.rhs;
Building precedenced rules
Precedenced rules are the most convenient way to describe operators. Once
built, they are immediately rewritten into basic grammar rules, and unique
symbols are generated. Operator associativity can be set to Right
or
Group
. It's Left
by default.
use ;
grammar.precedenced_rule
.rhs
.rhs
.associativity
.rhs
.lower_precedence
.associativity
.rhs
.lower_precedence
.rhs
.lower_precedence
.rhs;
Using a custom grammar representation
Your grammar type has to implement several traits:
RuleContainer
ContextFree
ContextFreeRef
ContextFreeMut
License
Dual-licensed for compatibility with the Rust project.
Licensed under the Apache License Version 2.0: http://www.apache.org/licenses/LICENSE-2.0, or the MIT license: http://opensource.org/licenses/MIT, at your option.