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;
}