-- Sakura.bnf Sakura BNF productions statement ::= WHEN event : statement statement ::= CHOICE { guardcomlist } statement ::= ON event -> statement WITHIN statement statement ::= PAR { parlist } guardcomlist ::= guardcomlist "||" guardcom guardcom ::= WHEN event -> statement guardcomlist ::= guardcom parlist ::= parlist // statement parlist ::= statement transferseries ::= transferseries ; transferexp transferseries ::= transferexp transferseries ::= transferexp ::= lhs ← exp transfermode ::= DEVICE block ::= { IN pairlist OUT pairlist GUARDIAN statement STATE pairlist DATAFLOW transferseries CONTROL statement } event ::= updownsignal event ::= updownsignal AND exp updownsignal ::= lhs UP updownsignal ::= lhs DOWN updownsignal ::= lhs CHANGE Sakura parse tree nodes definitions statement: When[Event, statement] Connector.GetNewUp[lhs]; statement OR DO Connector.GetNewUp[lhs]; IF cond THEN EXIT ENDLOOP; statement statement: Choice[List(Guardedcommand)] DO Connector.PutNewUp[lhs1,u1]; Connector.PutNewUp[lhs2,u2] u←connector.Wait[]; IF u=u1 THEN s1 ELSE IF u=u2 THEN s2 ELSE LOOP ENDLOOP; statement: On[Event, statement, statement] {ENABLE ABORTED => CONTINUE; ons2: PROC = {s2; Process.Abort[p2]}; cond: PROC = {WAIT Event; Process.Abort[p1]; s1}; p1 ← FORK ons2[]; p2 ← FORK cond[]; [] ← JOIN p1; [] ← JOIN p2}; statement: Parallel[List(statement)] p1 ← FORK s1[]; p2 ← FORK s2[]; [] ← JOIN p1; [] ← JOIN p2; Guardedcommand[Event, statement] st body: Deviceblock[List(Decl), List(Decl), statement, List(Decl), List(Transfer), statement] -- used in the context Decl[names, deviceTC, Deviceblock] Decl[names: List(Id), type: DeviceTC[args: List(Decl), rtns: List(Decl)], init: Deviceblock[in: List(Decl), out: List(Decl), guardian: statement, state: List(Decl), body: statement] ] Decl[names: List(Id), type: ProcTC[args: oldDecl.type.args@oldDecl.init.in@oldDecl.init.out, rtns: List(Decl)], init: Guardianblock[guardian: renameports(oldDecl.init.guardian, newDecl.type.args), block: Block[decls: oldDecl.init.state, stmts: renameports(oldDecl.init.body, newDecl.type.args)] Guardianblock[guardian: statement, block: block] Body[opens: NIL, decls: List(Decl[names: FooGuardian, type: ProcTC[args: NIL, rtns: NIL], init: Body[opens: NIL, decls: NIL, stmts: Guardianblock.guardian, locks: NIL], Decl[names: FooBlock, type: ProcTC[args: NIL, rtns: NIL], init: Body[opens: NIL, decls: NIL, stmts: Guardianblock.block, locks: NIL]), stmts: "p1 ← FORK FooGuardian[]; p2 ← FORK FooBlock[]; [] ← JOIN p1; [] ← JOIN p2", locks: NIL] Event[updownsignal, exp] updownsignal: Upsignal[lhs] updownsignal: Downsignal[lhs] updownsignal: Changesignal[lhs]