@@ -84,7 +84,9 @@ public func Call<T>(
|
||||
return (.Ok(call_result), updated_execution.replaceScopes(inout_scopes))
|
||||
}
|
||||
|
||||
public typealias ExecuteStatementResultHandler = (ControlFlow, ProgramExecution) -> (ControlFlow, ProgramExecution)
|
||||
public typealias ExecuteStatementResultHandler = (ControlFlow, ProgramExecution) -> (
|
||||
ControlFlow, ProgramExecution
|
||||
)
|
||||
|
||||
public func ExecuteStatement(
|
||||
_ statements: [EvaluatableStatement], handleResult handler: ExecuteStatementResultHandler,
|
||||
@@ -119,7 +121,8 @@ public func ExecuteStatement(
|
||||
|
||||
public func ExecuteStatement(
|
||||
_ statement: EvaluatableStatement, handleResult handler: ExecuteStatementResultHandler,
|
||||
inExecution execution: ProgramExecution) -> (ControlFlow, ProgramExecution) {
|
||||
inExecution execution: ProgramExecution
|
||||
) -> (ControlFlow, ProgramExecution) {
|
||||
return ExecuteStatement([statement], handleResult: handler, inExecution: execution)
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,8 @@ extension SelectExpression: EvaluatableExpression {
|
||||
switch EvaluateExpression(self.selector, inExecution: execution) {
|
||||
case (.Ok(let selector_value), let updated_execution):
|
||||
for sce in self.case_expressions {
|
||||
if case (.Ok(let kse), let updated_execution) = EvaluateExpression(sce.key, inExecution: updated_execution),
|
||||
if case (.Ok(let kse), let updated_execution) = EvaluateExpression(
|
||||
sce.key, inExecution: updated_execution),
|
||||
kse.eq(selector_value)
|
||||
{
|
||||
//let result = sce.evaluate(execution: updated_execution)
|
||||
|
||||
@@ -44,12 +44,12 @@ extension ParserStateDirectTransition: EvaluatableParserState {
|
||||
) -> (any EvaluatableParserState, Common.ProgramExecution) {
|
||||
var program = program.enter_scope()
|
||||
|
||||
|
||||
let (control_flow, next_execution) = ExecuteStatement(statements, handleResult: { (control_flow, execution) in
|
||||
return (control_flow, execution)
|
||||
let (control_flow, next_execution) = ExecuteStatement(
|
||||
statements,
|
||||
handleResult: { (control_flow, execution) in
|
||||
return (control_flow, execution)
|
||||
}, inExecution: program)
|
||||
|
||||
|
||||
switch control_flow {
|
||||
case .Next: program = next_execution
|
||||
case .Error: return (reject, next_execution.exit_scope())
|
||||
@@ -105,11 +105,12 @@ extension ParserStateSelectTransition: EvaluatableParserState {
|
||||
) -> (any EvaluatableParserState, Common.ProgramExecution) {
|
||||
var program = program.enter_scope()
|
||||
|
||||
let (control_flow, next_execution) = ExecuteStatement(statements, handleResult: { (control_flow, execution) in
|
||||
return (control_flow, execution)
|
||||
let (control_flow, next_execution) = ExecuteStatement(
|
||||
statements,
|
||||
handleResult: { (control_flow, execution) in
|
||||
return (control_flow, execution)
|
||||
}, inExecution: program)
|
||||
|
||||
|
||||
switch control_flow {
|
||||
case .Next: program = next_execution
|
||||
case .Error: return (reject, next_execution.exit_scope())
|
||||
@@ -121,7 +122,6 @@ extension ParserStateSelectTransition: EvaluatableParserState {
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
//switch self.selectExpression.evaluate(execution: program) {
|
||||
switch EvaluateExpression(self.selectExpression, inExecution: program) {
|
||||
case (.Ok(let value), let program):
|
||||
|
||||
@@ -55,7 +55,8 @@ public struct ParserRuntime: CustomStringConvertible {
|
||||
|
||||
}
|
||||
|
||||
public func run(withArguments arguments: ArgumentList) -> Result<(ParserState, ProgramExecution)> {
|
||||
public func run(withArguments arguments: ArgumentList) -> Result<(ParserState, ProgramExecution)>
|
||||
{
|
||||
let pe =
|
||||
if let initial = initialValues {
|
||||
ProgramExecution(withGlobalValues: initial)
|
||||
@@ -67,14 +68,16 @@ public struct ParserRuntime: CustomStringConvertible {
|
||||
}
|
||||
|
||||
/// Run the P4 parser on a given packet
|
||||
public func run(withArguments arguments: ArgumentList, inExecution pe: ProgramExecution) -> Result<(ParserState, ProgramExecution)>
|
||||
{
|
||||
public func run(
|
||||
withArguments arguments: ArgumentList, inExecution pe: ProgramExecution
|
||||
) -> Result<(ParserState, ProgramExecution)> {
|
||||
|
||||
let pe = if let globals = initialValues {
|
||||
pe.setGlobalValues(globals)
|
||||
} else {
|
||||
pe
|
||||
}
|
||||
let pe =
|
||||
if let globals = initialValues {
|
||||
pe.setGlobalValues(globals)
|
||||
} else {
|
||||
pe
|
||||
}
|
||||
|
||||
let (end_state, execution) = parser.call(execution: pe, arguments: arguments)
|
||||
if let error = execution.getError() {
|
||||
|
||||
@@ -44,7 +44,8 @@ extension VariableDeclarationStatement: EvaluatableStatement {
|
||||
public func evaluate(execution: ProgramExecution) -> (ControlFlow, ProgramExecution) {
|
||||
guard
|
||||
//case (.Ok(let initial_value), let execution) = self.initializer.evaluate(execution: execution)
|
||||
case (.Ok(let initial_value), let execution) = EvaluateExpression(self.initializer, inExecution: execution)
|
||||
case (.Ok(let initial_value), let execution) = EvaluateExpression(
|
||||
self.initializer, inExecution: execution)
|
||||
else {
|
||||
return (
|
||||
ControlFlow.Error,
|
||||
@@ -61,7 +62,8 @@ extension ConditionalStatement: EvaluatableStatement {
|
||||
public func evaluate(execution: ProgramExecution) -> (ControlFlow, ProgramExecution) {
|
||||
guard
|
||||
//case (.Ok(let evaluated_condition), let execution) = self.condition.evaluate(execution: execution)
|
||||
case (.Ok(let evaluated_condition), let execution) = EvaluateExpression(self.condition, inExecution: execution)
|
||||
case (.Ok(let evaluated_condition), let execution) = EvaluateExpression(
|
||||
self.condition, inExecution: execution)
|
||||
else {
|
||||
return (
|
||||
ControlFlow.Error,
|
||||
|
||||
Reference in New Issue
Block a user