The action language syntax is defined by the following abstract grammar:
actions ::= (action ';')*
action ::= (('S' | 'P' | 'X', 'A') stmt)
| ('N' expr8) // expr8 must reference a digital output or a boolean variable
stmt ::= assignment
| callStmt
assignment ::= expr8 '=' expr // expr8 may not reference an input or constant variable
callStmt ::= expr8 // must be a call expression
expr ::= expr1 ('?' expr ':' expr)? // conditional expression
expr1 ::= expr2 ('&' expr2)* // boolean and
expr2 ::= expr3 ('|' expr3)* // boolean or
expr3 ::= expr4 (('==' | '!=') expr4)* // equality, non-equality
// numerical operations: less than, greater than, less than or equal, greater than or equal
expr4 ::= expr5 (('<' | '>' | '<=' | '>=') expr5)*
expr5 ::= expr6 (('+' | '-') expr6)* // addition or string concatenation, subtraction
expr6 ::= expr7 (('*' | '/' | '%') expr7)* // multiplication, division, modulo (a % b = a - int(a / b)*b)
expr7 ::= ('-' | '!') expr7 | expr8 // numerical negation, boolean negation
expr8 ::= expr9 ('.' expr9)*
expr9 ::= string
| number
| function
| idRefs
| '(' expr ')'
// Ordinary strings with support for escape sequences.
string ::= '"' (~['"','\\','\n','\r'] | '\\' (
['n','t','b','r','f','\\','\'','"'] |
['0'-'7'] (['0'-'7'])? | ['0'-'3'] ['0'-'7'] ['0'-'7'])
)* '"'
number ::= (digit)+ ('.' (digit)+)?
function ::= id '(' (argumentList)? ')'
argumentList ::= expr (',' expr)*
idRefs ::= id ('^')*
id = (letter)+ (digit | letter)*
digit = ['0'-'9']
letter = ['a'-'z' | 'A'-'Z' | '_']
where
C++-style line comments are also supported, e.g.
S var = 42; // The answer to life the universe and everything
Comments: