GrammarDefinition<R> class abstract

Helper to conveniently define and build complex, recursive grammars using plain Dart code.

To create a new grammar definition subclass GrammarDefinition. For every production create a new method returning the primitive parser defining it. The method called start is supposed to return the start production of the grammar (that can be customized when building the parsers). To refer to another production use ref0 with the function reference as the argument.

Consider the following example to parse a list of numbers:

class ListGrammarDefinition extends GrammarDefinition {
  Parser start()   => ref0(list).end();
  Parser list()    => ref0(element) & char(',') & ref0(list)
                    | ref0(element);
  Parser element() => digit().plus().flatten();

Since this is plain Dart code, common refactorings such as renaming a production updates all references correctly. Also code navigation and code completion works as expected.

To attach custom production actions you might want to further subclass your grammar definition and override overriding the necessary productions defined in the superclass:

class ListParserDefinition extends ListGrammarDefinition {
  Parser element() => super.element().map((value) => int.parse(value));

Note that productions can be parametrized. Define such productions with positional arguments, and refer to them using ref1, ref2, ... where the number corresponds to the argument count.

Consider extending the above grammar with a parametrized token production:

class TokenizedListGrammarDefinition extends GrammarDefinition {
  Parser start() => ref0(list).end();
  Parser list() => ref0(element) & ref1(token, char(',')) & ref0(list)
                 | ref0(element);
  Parser element() => ref1(token, digit().plus());
  Parser token(Parser parser)  => parser.token().trim();

To get a runnable parser call the build method on the definition. It resolves recursive references and returns an efficient parser that can be further composed. The optional start reference specifies a different starting production within the grammar. The optional arguments parametrize the start production.

final parser = new ListParserDefinition().build();

parser.parse('1');          // [1]
parser.parse('1,2,3');      // [1, 2, 3]
  • @optionalTypeArgs




hashCode int
The hash code for this object.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited


build<T>({Function? start, List<Object> arguments = const []}) Parser<T>
Builds a composite parser from this definition.
buildFrom<T>(Parser<T> parser) Parser<T>
Builds a composite parser starting at the specified production.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
start() Parser<R>
The starting production of this definition.
toString() String
A string representation of this object.


operator ==(Object other) bool
The equality operator.