// p4rse, Copyright 2026, Will Hawkins // // This file is part of p4rse. // // This file is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . import Common import SwiftTreeSitter extension CST.Program: Parsable { public typealias C = CST.Program public static func Parse( node: Node, withContext context: CSTCompilerContext ) -> Common.Result { var statements: [CST.Statement] = Array() var errors: (any Errorable)? = .none // Try to parse all top-level declarations. node.enumerateNamedChildren { (declaration_node: Node) in let declaration_parsers: [String: ParsableStatement.Type] = [ "declaration": CST.Declaration.self, "instantiation": CST.Instantiation.self, ] if let parser = declaration_parsers[declaration_node.nodeType!] { let r = parser.ParseStatement(node: declaration_node, withContext: context) switch r { case .Ok(let compiled): statements.append(compiled) case .Error(let e): errors = if let errors = errors { errors.append(error: e) } else { e } } } else { let e = ErrorWithLocation( sourceLocation: declaration_node.toSourceLocation(), withError: "\(declaration_node.nodeType!) cannot be at a P4 program top level") errors = if let errors = errors { errors.append(error: e) } else { e } } } if let errors = errors { return .Error(errors) } return Result.Ok(CST.Program(CST.Statements(statements))) } }