diff --git a/src/protocol/ast.rs b/src/protocol/ast.rs index a633ce0c0c9ee19ebf048d71834b28bc23c58200..d13858742e9dfebef5e58077d83232985bbdd954 100644 --- a/src/protocol/ast.rs +++ b/src/protocol/ast.rs @@ -138,6 +138,8 @@ define_new_ast_id!(BreakStatementId, StatementId, index(BreakStatement, Statemen define_new_ast_id!(ContinueStatementId, StatementId, index(ContinueStatement, Statement::Continue, statements), alloc(alloc_continue_statement)); define_new_ast_id!(SynchronousStatementId, StatementId, index(SynchronousStatement, Statement::Synchronous, statements), alloc(alloc_synchronous_statement)); define_new_ast_id!(EndSynchronousStatementId, StatementId, index(EndSynchronousStatement, Statement::EndSynchronous, statements), alloc(alloc_end_synchronous_statement)); +define_new_ast_id!(ForkStatementId, StatementId, index(ForkStatement, Statement::Fork, statements), alloc(alloc_fork_statement)); +define_new_ast_id!(EndForkStatementId, StatementId, index(EndForkStatement, Statement::EndFork, statements), alloc(alloc_end_fork_statement)); define_new_ast_id!(ReturnStatementId, StatementId, index(ReturnStatement, Statement::Return, statements), alloc(alloc_return_statement)); define_new_ast_id!(GotoStatementId, StatementId, index(GotoStatement, Statement::Goto, statements), alloc(alloc_goto_statement)); define_new_ast_id!(NewStatementId, StatementId, index(NewStatement, Statement::New, statements), alloc(alloc_new_statement)); @@ -1035,6 +1037,8 @@ pub enum Statement { Continue(ContinueStatement), Synchronous(SynchronousStatement), EndSynchronous(EndSynchronousStatement), + Fork(ForkStatement), + EndFork(EndForkStatement), Return(ReturnStatement), Goto(GotoStatement), New(NewStatement), @@ -1078,11 +1082,12 @@ impl Statement { Statement::Break(v) => v.span, Statement::Continue(v) => v.span, Statement::Synchronous(v) => v.span, + Statement::Fork(v) => v.span, Statement::Return(v) => v.span, Statement::Goto(v) => v.span, Statement::New(v) => v.span, Statement::Expression(v) => v.span, - Statement::EndBlock(_) | Statement::EndIf(_) | Statement::EndWhile(_) | Statement::EndSynchronous(_) => unreachable!(), + Statement::EndBlock(_) | Statement::EndIf(_) | Statement::EndWhile(_) | Statement::EndSynchronous(_) | Statement::EndFork(_) => unreachable!(), } } pub fn link_next(&mut self, next: StatementId) { @@ -1096,12 +1101,14 @@ impl Statement { Statement::EndIf(stmt) => stmt.next = next, Statement::EndWhile(stmt) => stmt.next = next, Statement::EndSynchronous(stmt) => stmt.next = next, + Statement::EndFork(stmt) => stmt.next = next, Statement::New(stmt) => stmt.next = next, Statement::Expression(stmt) => stmt.next = next, Statement::Return(_) | Statement::Break(_) | Statement::Continue(_) | Statement::Synchronous(_) + | Statement::Fork(_) | Statement::Goto(_) | Statement::While(_) | Statement::Labeled(_) @@ -1271,7 +1278,6 @@ pub struct SynchronousStatement { // Phase 1: parser pub span: InputSpan, // of the "sync" keyword pub body: BlockStatementId, - // Phase 2: linker pub end_sync: EndSynchronousStatementId, } @@ -1283,6 +1289,23 @@ pub struct EndSynchronousStatement { pub next: StatementId, } +#[derive(Debug, Clone)] +pub struct ForkStatement { + pub this: ForkStatementId, + // Phase 1: parser + pub span: InputSpan, // of the "fork" keyword + pub left_body: BlockStatementId, + pub right_body: Option, + pub end_fork: EndForkStatementId, +} + +#[derive(Debug, Clone)] +pub struct EndForkStatement { + pub this: EndForkStatementId, + pub start_fork: ForkStatementId, + pub next: StatementId, +} + #[derive(Debug, Clone)] pub struct ReturnStatement { pub this: ReturnStatementId,