-- 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]