Grammar constructor

Grammar(
  1. List<ProductionRule?> rules,
  2. String? globals,
  3. String? members
)

Implementation

Grammar(List<ProductionRule?> rules, this.globals, this.members) {
  if (rules.isEmpty) {
    throw ArgumentError('List of rules should not be empty');
  }

  final duplicates = <String>{};
  var id = 0;
  var terminalId = 0;
  for (var rule in rules) {
    if (rule == null) {
      throw ArgumentError('rules');
    }

    rule.id = id++;
    if (rule.kind == ProductionRuleKind.terminal) {
      rule.terminalId = terminalId++;
    }

    this.rules.add(rule);
    final name = rule.name;
    if (ruleMap.containsKey(name)) {
      duplicates.add(name);
    }

    ruleMap[rule.name] = rule;
  }

  for (final name in duplicates) {
    errors.add('Duplicate rule name: $name');
  }

  _initialize();
}