Guideline: Rhapsody Action Language
Brief introduction to Rhapsody's action language.
Relationships
Main Description

Basic Syntax 

The language is case sensitive. That is, “evmove” is different from “evMove”.

Each statement must end with a semi-colon.

All names must start with a letter and cannot contain spaces. Special characters are not permitted in names, except for underscores (_). However, a name should never start with an underscore.

The following words are reserved and should not be used for names: asm, auto, break, case, catch, char, class, const, continue, default, delete, do, double, else, enum, extern, float, for, friend, GEN, goto, id, if, inline, int, IS_IN, IS_PORT, long, new, operator, OPORT, OUT_PORT, params, private, protected, public, register, return, short, signed, sizeof, static, struct, switch, template, this, throw, try, typedef, union, unsigned, virtual, void, volatile, while.  

Assignment and Arithmetic Operators 

X=1;
(Sets X equal to 1)
X=Y;
(Sets X equal to Y)
X=X+5;
(Adds 5 to X)
X=X-3;
(Subtracts 3 from X)
X=X*4;
(Multiplies X by 4)
X=X/2;
(Divides X by 2)
X=X%5;
(Sets X to the remainder of X divided by 5)
X++;
(Increments X by 1)
X--;
(Decrements X by 1)
 

Printing

The “cout” operator prints to the screen. Elements to be printed are separated by the “<<” operator. Text strings are surrounded by double quotes. Attributes are referenced using their names. The “endl” operator prints a carriage return. So, to print out the current value of X, use the following command:

cout << “The value of X is “ << X << endl;

If the current value of X is 5, this statement prints the following message on the screen:

The value of X is 5 


Comparison Operators 

X==5
(X equal to 5)
X!=5
(X not equal to 5)
X<3
(X less than 3)
X<=3
(X less than or equal to 3)
X>4
(X greater than 4)
X>=4
(X greater than or equal to 4)
X>2 && X<7
(X greater than 2 and X less than 7
X<2 || X==7
(X less than 2 or X equal to 7)
 

Conditional Statements

Conditional statements begin with the keyword “if” followed by a conditional expression in parenthesis, followed by the statement to execute if the condition evaluates to true. You can optionally add the “else” keyword to execute a statement if the condition evaluates to false. The “else” clause can contain another nested “if” statement as well. For example:

if (X<=10)

X++;

else

X=0;

Multiple statements can be grouped together by placing them in curly braces.

if (X<=10)

{

X++;

cout << “The value of X is ” << X << endl;

}

else

{

X=0;

cout << “Finished” << endl;


Incremental Looping Statements

Incremental looping is accomplished using the “for” statement. It holds three sections separated by semicolons to specify: 1) an initialization statement, 2) a conditional expression, and 3) an increment statement. For example, to iteratively set the value of X from 0 to 10 while printing out its value:

for (X=0; X<=10; X++)

cout << X << endl; 


Conditional Looping Statements

The “while” statement is used for conditional looping. This statement has a single conditional expression and iterates so long as it evaluates to true. The previous example could be implemented using a “while” statement as follows:

X=0;

while(X<=10)

{

cout << X << endl;

X++;


Invoking Operations

To invoke an operation on a block, use the operation name followed by parenthesis. For example, to invoke the “go” operation:

go();

If an operation takes parameters, place them in a comma-separated list. For example, to invoke the “min” operation with two parameters:

min(X,Y); 


Generating Events

The “OUT_PORT” and “GEN” keywords are used to generate events through ports. For example, to send an event named “evStart” out the port named “p2”, issue the following statement:

OUT_PORT(p2)->GEN(evStart);

To generate an event with parameters, place them into a comma-separated list. For example, to generate an event named “evMove” with two parameters for velocity and direction:

OUT_PORT(p2)->GEN(evMove(10,2));

NOTE: The “OPORT” keyword can be used in place of “OUT_PORT”. 


Referring to Event Parameters in Transitions

The “params” keyword followed by the “->” operator is used to reference the parameters of the event that caused the current transition. For example, if an event named “evMove” has a parameter named “velocity”, that parameter can be referenced using “params->velocity”. This syntax can also be embedded in statements within the action on the transition. For example,

if (params->velocity <= 5)… 


Testing the Port on which an Event Arrives

The “IS_PORT” keyword is used to test whether the event that caused the current transition arrived through a specific port. For example:

if (IS_PORT(p2))… 


Testing the State of a State Machine

The “IS_IN” keyword is used to test whether a state machine is in a specific state. For example, to test whether the state machine of a block is in a state called “Accelerating”:

if (IS_IN(Accelerating))…