parseProgram method

Program parseProgram()

Implementation

Program parseProgram() {
  final starts = <Statement>[];
  Statement? start;
  final stmts = <Statement>[];
  final env = Env();
  final errors = <ErrorNode>[];

  Node parent = Root();
  while (true) {
    final node = _nextStmt(parent, env);
    if (node == null) {
      if (start == null) {
        if (starts.isNotEmpty) {
          start = starts.first;
        } else if (stmts.isNotEmpty) {
          start = stmts.first;
        }
      }

      return Program(
        stmts,
        env: env,
        errors: errors,
        start: start,
      );
    }

    if (node is ErrorNode) {
      errors.add(node);
      continue;
    }

    final stmt = node as Statement;
    if (stmt.label.isNotEmpty) {
      env.labels[stmt.label] = stmt;
    }
    if (stmt.opecode == 'START') {
      starts.add(stmt);
      if (stmt.label == env.entryLabel) {
        start = stmt;
      }
    }

    stmts.add(stmt);
    parent = stmt;
  }
}