Az SCXML nyelv

Fő modul

Tartalma

A fő modul tartalmazza az elemeket amik leírják a Harel automatát. A fő modul saját magában is használható de nem képes kommunikállni külső elmekkel és nem tartalmazhat belső adat modellt sem.

Elemek

Az alábbi rész tartalmazza az SCXML fő moduljának elemeit.

<scxml>

A legfelső szintű elem. A többi elem ennek a gyermeke kell legyen.

Főbb attribútumai

Neve Helyes értéke Leírás
initial Állapot vagy párhuzamos állapot azonosítója A dokumentum kezdő állapotának azonosítója. Kiváltható egy <initial> gyermek elemmel
name Akármely helyes NMTOKEN Az automata neve
xmlns "http://www.w3.org/2005/07/scxml" XML dokumentum definíciós fájlja
exmode lax, strict Kiértékelés módja. Szigorú vagy lusta.

Gyermekei lehetnek:

<state>

Az automata egy állapotát reprezentállja.

Főbb attribútumai

Neve Helyes értéke Leírás
id Helyes ID A dokumentum azonosítója
initial Állapot vagy párhuzamos állapot azonosítója Kezdő állapot azonosítója. Kiváltható egy <initial> gyermek elemmel


Gyermekei lehetnek:

<transition>

Egy átmenetet reprezentál két állapot között. Kiválthatja egy esemény és rendelkezhet őrfeltétellel.

Főbb attribútumai

Neve Helyes értéke Leírás
event Bármely event neve, a joker karakter('*') használata engedélyezett Az esemény hatására jön létre az átmenet.
cond Bármely logikai kifejezés Őr feltétel az átmenethez.
target Szóközzel elválasztott listája állapotok azonosítójának. Az automata átkerül ezekbe az állapotokba az átmenet után. Ha több állapot van felsorolva, mindegyiknek ugyanazon paralell csúcs leszármazottja kell legyen.


Gyermekei lehetnek:
Csak futattható tartalmak lehetnek a gyermekei, amelyek az átmenet <onexit> állapota után futnak le a cél <onentry> állapota előtt.

Példa kód az scxml működésének személtetésére:
<state id="S" initial="s1"> <state id="s1" initial="s11"> <onexit> <log expr="'leaving s1'"/> </onexit> <state id="s11"> <onexit> <log expr="'leaving s11'"/> </onexit> </state> <transition event="e" target="s21"> <log expr="'executing transition'"/> </transition> </state> <state id="s2" initial="s21"> <state id="s21"> <onentry> <log expr="'entering s21'"/> </onentry> </state> <onentry> <log expr="'entering s2'"/> </onentry> </state> <onentry> <log expr="'entering S'"/> <onentry> <onexit> <log expr="'leaving S'"/> <onexit> </state> ==== log output will be ======> leaving s11 leaving s1 executing transition entering s2 entering s21

<parallel>

Olyan állapot ami egységbe zár több állapotot. A parallel elem tartalmazhat <onentry> <onexit> <transition> elemeket melyek működése teljesen analóg a <state>-nél látottakal. A plusz működése az hogy összekapcsol valahány állapotot és azokat párhuzamos futtatja, melyek az <onexit>-nél újra összekapcsolódnak. Mikor az összes állapot final-be jut akkor generálódik egy done.state.id esemény.

Amikor egy automata <parallel> állapotba jut, szimultán belép az összes gyermek állapotba is.

Főbb attribútumai

<initial>

Az állapot kezdőállapota. Tegyük fel hogy van egy S1 állapotunk melynek gyermek állapotai S1,S2,S3. Ekkor az initial értéke csak az egyik azonosítója lehet, de a többi állapot is elérhető kívülről. Az egyetlen különbség az initial atribútum és az <initial> elem között az hogy az utóbbi tartalmazhat <transition> elemet amely még az előtt lefut mielőtt az automata a megfelelő kezdőállapotba jutna.
Gyermekei lehetnek:

<final>

Egy öszetett állapot végső állapotát reprezentállja. Akkor jut ide az automata amikor az állapot működését befejezte. Ekkor generálódik egy done.state.parentID esemény is.

<donedata>

Burkoló elem amely olyan adatokat tartalmaz mely akkor lesz beemelve amikor az állapot final státuszba ér.

<history>

A <history> álállapot lehetővé teszi hogy elmentsük egy automata állapotát. Amikor egy összetett állapot kilép akkor a <history> hatására annak állpot konfigurációja elmentődik. Így ha kívülről meghívjuk az <history> célállapotként akkor abba az állapotba kerülünk ami elmentésre került. Ha <parallel> állapotba kerülünk akkor az összes állapotának konfigurációja lementődik ekkor.


Végrehajtható elemek

A végrehatható tartalom akciókat tartalmaz melyek végrehajtódnak amikor a végrehajtás belép egy állapotba vagy kilép onnan. Ilyen elemek blokkokban fordulnak elő, ami azt jelenti amikor egy bekövetkezik, tetszőleges számú elem lehet jelen. A blokk elemei olyan sorrendben futnak le amilyen sorrendben azok a dokumentumban definiállva vannak.

<raise>

Ez az elem arra használható hogy különböző eseményeket váltsunk ki vele. Amikor le fut akkor az esemény bekerül a munkamenet belső várakozási sorában. Csak akkor hajtódik végre az esemény miután az összes végrehajtó elem véget ért, addig azokat eltárolja a sorban.

Gyermekei:

Egy vagy több param gyermeke lehet, vagy egy content gyermeke, egyszerre mindkettő nem.

<if>,<elsif>,<else>

<if> egy tároló elem amely egy elágazást definiál. Ezen belül lehet <else> illetve <elseif> elem. Az <if> és az <elseif> elemeknek tartalmazniuk kell egy cond attribútumot amely egy feltétel definiál. Az elágazás szerkezetéről, illetve a működéséről nézzünk egy közérthető példát:

<if cond="cond1"> <!-- selected when "cond1" is true --> <elseif cond="cond2"/> <!-- selected when "cond1" is false and "cond2" is true --> <elseif cond="cond3"/> <!-- selected when "cond1" and "cond2" are false and "cond3" is true --> <else/> <!-- selected when "cond1", "cond2", and "cond3" are false --> </if>

<log>

Lehetővé teszi hogy az alkalmazás generáljon naplózó vagy hibakeresési információkat. Működése platform függő.
Attribútmai:

Végrehajtható tartalmak kiterjesztése

Mivel a specifikációja az SCXML-nek rugalmas és mégis erős kifejező eszköz ezért lehetőség van hogy a különböző platformok plusz végrehatható elemeket definiálljanak maguk. Ezek viszont nem változtathatják meg az automata állapotát, csak eseményeket válthatnak ki. Mivel a végrehatható utasítások atomiak a modellben így figyelni kell arra hogy blokkolódik az egész gép amíg kiértékelődik a végrehatható elem. A platform specifikus hivások egy másik névtérben kell hogy legyenek definiállva.
Egy példa külső CCXML hívására SCXML-ből:

<transition event="ccxml:connection.alerting"> <ccxml:accept connectionid="_event.data.connectionid"/> </transition>