Statement =
EmptyStatement | AssignmentStatement |
AgentStatement | PortStatement |
InputOutputStatement | IfStatement |
WhileStatement | PollingStatement |
CompoundStatement .
EmptyStatement = .
Egy utasítás egy ágens által végrehajtandó akciót jelöl. Az üres utasítás az üres akciót jelöli.
AssignmentStatement = VariableAccess ":=" Expression .
A következő értékadó utasítás:
v:=e
Egy értéknek egy változóhoz való rendelést jelenti. A v változónak és az e kifejezésnek megegyező típusúnak kell lennie. Az értékadó utasítás három lépésben hajtódik végre:
AgentStatement = AgentName [ "(" ActualParameterList ")" ] .
AgentParameterList = ActualParameter { "," ActualParameter } .
ActualParameter = Expression .
A következő ágenshívás
P(e1, e2, ..., em)
Egy új ágens aktiválását jelenti. P-nek egy ismert ágens eljárásnak kell lennie:
agent P(at:T1; a2:T2; ...; am:Tm);
var x1:U1; x2:U2; ...; xn:Un;
begin SL end;
Az
e1, e2, ..., em
aktuális paraméter listának a
a1:T1; a2:T2; ...; am:Tm
formális paraméter lista minden egyes ai formális paraméteréhez egy aktuális ei paramétert kell rendelnie. A sorrend, ahogyan a paraméter listában a paraméterek szerepelnek, egyértelműen meghatározza, hogy melyik formális paraméternek milyen aktuális érték felel meg. Az ei aktuális paraméter egy kifejezés, aminek a típusa meg kell, hogy egyezzen a megfelelő ai formális paraméter típusával.
Mikor egy ágens meghív egy új ágenst, az új ágens a következő két lépésben aktiválódik:
PortStatement = "+" PortAccess
Egy új csatorna létrehozását a csatorna aktiválásának nevezzük.
A következő port utasítás:
+c
egy új csatorna aktiválását jelöli. A c változónak egy ismert T port típusú változónak kell lennie.
Mikor egy ágens végrehajt egy port utasítást, egy új - a T típussal megadott ABC-jû - csatorna keletkezik, és a c port változóhoz egy erre a csatornára mutató pointer rendelődik. Az ágenset a csatorna létrehozójának, a csatornát az ágens belső csatornájának nevezzük. A csatorna megszűnik, ha a létrehozója terminál. Ezt a csatorna terminálásának nevezzük.
Példa
InputP\OutputCommand = OutputCommand | InputCommand .
OutputCommand = PortAccess "!" OutputSymbol .
OutputSymbol = SymbolName [ "(" OutputExpression ")" ] .
OutputExpression = Expression .
InputCommand = PortAccess "?" InputSymbol .
InputSymol = SymbolName [ "(" InputVariable ")" ] .
InputVariable = VariableAccess .
InputOutputStatement = InputOutputCommand .
A kommunikáció egy szimbólum egyik ágenstől egy másik ágenshez csatornán keresztüli továbbítása. Az ágensek a csatornát lokális port változókon keresztül érik el. Képzeljünk el egy p ágenset, amely egy csatornát egy b port változón keresztül ér el, és egy q ágenset, amely ugyanezt a csatornát egy c port változón keresztül éri el. A port változóknak ugyanolyan típusúnak kell lenniük, esetünkben ez legyen:
T = [s1(T1), s2(T2), ..., sn(Tn)];
A következő output parancs:
b!si(ei)
azt jelenti, hogy a küldő ágens az si(ei) szimbólumot a b port változó által jelölt csatornán küldi keresztül. si-nek a T egyik szimbólum osztályának kell lennie, és az ei kifejezés típusa meg kell, hogy egyezzen a megfelelő Ti típussal.
A következő input parancs:
c?si(vi)
azt jelöli, hogy a fogadó ágens az si(vi) szimbólumot várja a c port változó által jelölt csatornán keresztül. si-nek a T egyik szimbólum osztályának kell lennie, és a v változó típusa meg kell egyezzen a megfelelő Ti típussal. Mikor egy p ágens az si szimbólumot egy csatornán keresztül szeretné küldeni, és egy másik q ágens ugyanezt a szimbólumot ugyanezen a csatornán keresztül várja, azt mondjuk, hogy ez a két ágens megfelel egymásnak, és a kommunikáció megvalósítható közöttük. Ha a kommunikáció megtörténik, a két ágens egyidejűleg végrehajtja az input és output parancsot. Ez az összetett esemény a következő lépések sorozatát jelenti:
IfStatement = "if" BooleanExpression "then" Statement ["else" Statement] .
BooleanExpression = Expression .
A következő if utasítás:
if B then S1 else S2
Az S1 és S2 utasítás közül pontosan az egyiknek a végrehajtását jelenti. A B kifejezésnek logikai típusúnak kell lennie.
Az if utasítás két lépésben hajtódik végre:
WhileStatement = "while" BooleanExpression "do" Statement .
A következő while utasítás:
while B do S
Az S utasítás nulla vagy több végrehajtását jelöli. A B kifejezésnek logikai típusúnak kell lennie.
A while utasítás a következő lépésekben hajtódik végre:
PollingStatement = "poll" GuardedStatementList "end" .
GuardedStatementList = GuardedStatement { "|" GuardedStatement } .
GuardedStatement = Guard "->" StatementList .
Guard = PollingCommand [ "&" PollingExpression ] .
PolingCommand = InputOutputCommand .
PollingExpression = BooleanExpression .
A következő polling utasítás:
poll
C1 & B1 -> SL1 |
C2 & B2 -> SL2 |
...
Cn & Bn -> SLn
end
a
Ci & Bi -> SLi
Az őrfeltétellel ellátott utasítások közül pontosan egynek a végrehajtását jelenti.
Egy ágens egy polling utasítást két fázisban hajt végre, ezek: a választási és a befejezési fázis:
CompoundStatement = "begin" StatementList "end" .
StatementList = Statement { ";" Statement } .
A következõ összetett utasítás
begin SL end
az SL utasításlista végrehajtását jelenti.
Az S1; S2; ...; Sn utasításlista végrehajtása azt jelenti, hogy az S1, S2, ..., Sn utasítások egymás után a leírt sorrendben végrehajtódnak.
Példa