generate method
Grammar
generate()
Generates a grammar and returns that grammar.
Implementation
Grammar generate() {
const parser = SmartParser();
final state = State(source);
final result = parser.parseStart(state);
if (result == null) {
final file = SourceFile.fromString(source);
throw FormatException(
state
.getErrors()
.map((e) => file.span(e.start, e.end).message(e.message))
.join('\n'),
);
}
final grammar = result.$1;
final productions = grammar.productions;
final productionMap = <String, Production>{};
for (final production in productions) {
final name = production.name;
if (productionMap.containsKey(name)) {
throw StateError('Duplicate production name: $name');
}
productionMap[name] = production;
}
final processed = <String>{};
for (final production in productions) {
final name = production.name;
if (!processed.add(name)) {
throw StateError('Duplicate production name: $name');
}
final expression = production.expression;
final type = production.type;
ExpressionTypeResolver.assignType(expression, type);
final expressionTypeResolver = ExpressionTypeResolver(
productions: productionMap,
);
expressionTypeResolver.resolve(expression);
}
final expressionAnalyzer = ExpressionAnalyzer(productions: productionMap);
expressionAnalyzer.analyze();
return grammar;
}