// 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 import TreeSitterExtensions import TreeSitterP4 public struct SpecialParsers { public struct Statement {} } extension SpecialParsers.Statement: Parsable { public typealias C = CST.Statement public static func Parse( node: SwiftTreeSitter.Node, withContext context: CSTCompilerContext ) -> Result { if node.nodeType != "parserStatement" && node.nodeType != "statement" { return Result.Error( ErrorWithLocation( sourceLocation: node.toSourceLocation(), withError: "Missing expected parser statement") ) } let statement = node.child(at: 0)! let statementParsers: [String: ParsableStatement.Type] = [ "assignmentStatement": CST.ParserAssignmentStatement.self, "expressionStatement": CST.ExpressionStatement.self, "variableDeclaration": CST.VariableDeclarationStatement.self, "conditionalStatement": CST.ConditionalStatement.self, "blockStatement": CST.BlockStatement.self, "return_statement": CST.ReturnStatement.self, ] guard let parser = statementParsers[statement.nodeType ?? ""] else { return Result.Error( ErrorWithLocation( sourceLocation: statement.toSourceLocation(), withError: "Unparseable statement type (\(statement.nodeType ?? "Unknown Statement Type"))")) } switch parser.ParseStatement(node: statement, withContext: context) { case Result.Ok(let parsed): return .Ok(parsed) case Result.Error(let e): return .Error( ErrorWithLocation( sourceLocation: node.toSourceLocation(), withError: "Failed to parse a statement element: \(e)")) } } }