Files
gp4/Sources/P4Compiler/Visitor.swift
T
Will Hawkins b9ff228362
Continuous Integration / Grammar Tests (push) Successful in 3m54s
Continuous Integration / Library Format Tests (push) Failing after 4m49s
Continuous Integration / Library Tests (push) Successful in 7m40s
Start Rewrite
Signed-off-by: Will Hawkins <hawkinsw@obs.cr>
2026-06-12 06:24:53 -04:00

55 lines
1.7 KiB
Swift

import Common
public struct ASTVisitorDriver {
public init() {}
public func visit<T>(
expression: any AST.AnExpression, visitor: any ASTVisitor<T>, context: T
) -> Result<T> {
return switch expression {
case let e as AST.BinaryOperatorExpression:
visitor.visit(node: e, driver: self, context: context)
case let e as AST.Literal: visitor.visit(node: e, driver: self, context: context)
default: .Error(Error(withMessage: "AST Expression Element Is Not Visitable"))
}
}
public func visit<T>(
state: any AST.AnState, visitor: any ASTVisitor<T>, context: T
) -> Result<T> {
return switch state {
case let s as AST.ParserStateDirectTransition:
visitor.visit(node: s, driver: self, context: context)
case let s as AST.ParserStateNoTransition:
visitor.visit(node: s, driver: self, context: context)
case let s as AST.ParserStateSelectTransition:
visitor.visit(node: s, driver: self, context: context)
default: .Error(Error(withMessage: "AST State Element (\(state)) Is Not Visitable"))
}
}
public func visit<T>(
statement: any AST.AnStatement, visitor: any ASTVisitor<T>, context: T
) -> Result<T> {
return switch statement {
case let s as AST.Parser: visitor.visit(node: s, driver: self, context: context)
default: .Error(Error(withMessage: "AST Statement Element Is Not Visitable"))
}
}
public func visit<T>(
program: AST.Program, visitor: any ASTVisitor<T>, context: T
) -> Result<T> {
var context = context
for s in program.statements {
switch visit(statement: s, visitor: visitor, context: context) {
case .Ok(let c): context = c
case .Error(let e): return .Error(e)
}
}
return .Ok(context)
}
}