(1) assignment: lhs=rhs; i |
τ[lhs=rhs; i](aeg) = τ[i]((
aeg.Es∪evts(lhs)∪evts(rhs),
aeg.pos∪end(aeg.pos)×(evts(rhs)∪
evts(lhs)\trg(lhs))∪
(evts(rhs)∪evts(lhs)\trg(lhs))
×trg(lhs),
aeg.cmp
)) |  |
|
(2) function call: fun(); i |
τ[fun(); i] = τ[i] ∘ τ[body(fun)] |  |
|
(3) guard: [expr] i1; i2 |
τ[[guard] i1; i2] (aeg) = let
guarded=τ[i1](aeg) in
τ[i2] ((aeg.Es∪ guarded.Es,
aeg.pos∪guarded.pos,aeg.cmp)) |  |
|
(4) forward jump: goto l; |
τ[goto l; i] = τ[follow(l)] |  |
|
(5) backward jump: l: i1;
[cond] goto l; i2 |
τ[l: i1; [cond]goto l; i2] (aeg) = let
local=τ[i1] (aeg) in
τ[i2]((aeg.Es∪local.Es,
aeg.pos∪
local.pos ∪ end(local.pos)×
begin(local.pos),aeg.cmp)) |  |
|
(6) assume / assert / skip:
assume(φ); i / assert(φ); i / skip; i |
τ[assume(φ); i] = τ[i] |  |
|
(7) new thread: start_thread th;
i |
τ [start_thread th; i](aeg) = let
local=τ[body(th)](∅) and
main=τ[i](aeg) and
inter=τ[i](∅) in
(local.Es∪main.Es,
local.pos∪main.pos,
local.Es⊗inter.Es) |  |
|
(8) end of thread / function: end_thread; |
τ[end_thread](aeg) = aeg | |
|
(9) atomic section: atomic_begin;
i1; atomic_end; i2 |
τ[atomic_start; i1; atomic_end; i2](aeg) =
let section=τ[i1]((aeg.Es,aeg.pos∪
end(aeg.pos)×{f}, aeg.cmp)) in
τ[i2]((section.Es,
section.pos∪
end(section.pos)×{f},
section.cmp)) |  |