where |
::= |
java code |
not_implemented |
::= |
java code |
error_action2 |
::= |
java code |
error_action |
::= |
java code |
qualified_name |
::= |
<ID> ( "::" <ID> | ) |
ids |
::= |
<ID> ( "," <ID> )* |
boolean_constant |
::= |
( "true" | "false" ) |
program |
::= |
( decl_global )+ |
decl_global |
::= |
( "yellow" <ID> p_signature "=" block_y_body "end" | "green" <ID> p_signature "=" block_g_body "end" | "table" <ID> t_signature "=" table_body "end" | "type" <ID> "=" type ";" | "synonym" <ID> "=" type ";" | "constant" ids ( <COLON: ":"> type )? <LET: "="> expression ";" | "function" <ID> f_signature "=" ( value_decl )* expression <END: "end"> ) |
value_decl |
::= |
"value" ids ( ":" type )? "=" expression <SEMICOLON: ";"> |
local_y_decl |
::= |
( value_decl | chan_decl | "reg" ids ":" type ( <BECOMES: ":="> expression )? ";" ) |
chan_decl |
::= |
"chan" ids ( ":" type ";" | ";" ) |
type |
::= |
( qualified_name | "integer" | "boolean" | "undefinedtype" | "enum" "(" ids ")" | "union" "(" tagtype ( "," tagtype )+ ")" | "(" ( field ( "," field )+ ")" | type ")" ) ) ( "[" expression "]" )* |
tagtype |
::= |
<ID> ":" type |
field |
::= |
( <ID> ":" type | type ) |
expression |
::= |
( <ID> ":" expression | exp9 ) |
exp9 |
::= |
exp10 ( "/\\" exp10 )* |
exp10 |
::= |
exp11 ( "\\/" exp11 )* |
exp11 |
::= |
( "not" )? exp12 |
exp12 |
::= |
exp13 ( ( ">" | "<" | ">=" | "<=" | "==" | "!=" ) exp13 )* |
exp13 |
::= |
exp14 ( ( "cast" | "fit" ) type )* |
exp14 |
::= |
exp15 ( ( "shl" | "shr" ) exp15 )* |
exp15 |
::= |
exp16 ( ( "+" | "-" ) exp16 )* |
exp16 |
::= |
exp17 ( ( "*" | "div" | "mod" ) exp17 )* |
exp17 |
::= |
( "abs" | "~" )? exp19 |
exp19 |
::= |
exp_atom ( "." <ID> | "[" expression "]" )* |
exp_atom |
::= |
( "(" expression ( "^" expression )? ( "," expression ( "^" expression )? )* ")" | "[" expression ( "^" expression )? ( "," expression ( "^" expression )? )* "]" | "if" guard_expr "then" expression "else" expression "end_if" | <NUMBER> | boolean_constant | qualified_name ( "(" ( expression ( "," expression )* | ) ")" | ) ) |
guard_expr |
::= |
( <ID> "in" <ID> ( "and" <ID> "in" <ID> )* ( "and" expression )? | expression ) |
t_signature |
::= |
"(" t_params ( ";" t_params )* <RBRACKET: ")"> |
p_signature |
::= |
"(" ( p_params ( ";" p_params )* )? ")" |
f_signature |
::= |
"(" ( f_params ( ";" f_params )* )? ")" ( ":" type )? |
p_params |
::= |
( t_params | f_params | "proc" ids ( ":" p_signature )? ) |
t_params |
::= |
( "input" ids ( ":" type )? | "output" ids ( ":" type )? ) |
f_params |
::= |
( "value" ids ( ":" type )? | "function" ids ( ":" f_signature )? ) |
block_y_body |
::= |
( local_y_decl )* command_y ( ( "||" command_y )+ | ( ";" command_y )* ) |
command_y |
::= |
( "{" block_y_body "}" | "loop" guardedchoice <END_LOOP: "end_loop"> | "choice" guardedchoice <END_CHOICE: "end_choice"> | "select" synchronise ( "->" block_y_body )? ( "or" synchronise ( "->" block_y_body )? )* <END_SELECT: "end_select"> | "skip" | qualified_name "(" ( expression ( "," expression )* )? ")" | synchronise | <ID> ( "!" ( expression | "(" ")" ) | ( "." <ID> | "[" expression "]" )* ":=" expression ) ) |
guardedchoice |
::= |
guard_expr "->" block_y_body ( "or" guard_expr "->" block_y_body )* |
synchronise |
::= |
( "sync" ichannel_binding ( "," ichannel_binding )* <DURING: "during"> block_y_body <END_SYNC: "end_sync"> | ichannel_binding ) |
ichannel_binding |
::= |
<ID> "?" ( <ID> | "(" ( <ID> "," ids | ) ")" ) |
block_g_body |
::= |
( chan_decl )* network |
network |
::= |
( <DOLLAR: "$"> )? pipeline ( pipe_separator pipeline )* ( "$" )? |
pipe_separator |
::= |
( "$" ( "||" ( "$" )? | ) | "||" ( "$" )? ) |
pipe_and_ends |
::= |
( "$" )? pipeline ( "$" )? |
labelled_network |
::= |
expression <ARROW: "->"> pipe_and_ends ( <BARS: "||"> expression "->" pipe_and_ends )+ |
pipeline |
::= |
component_g ( ( <CHEVRON: ">>"> | <BAR_CHEVRON: "|>"> ) component_g )* |
table_body |
::= |
( "value" ids ":" type ";" )* t_row ( "or" t_row )* |
t_row |
::= |
i_pattern ( "," i_pattern )* ( "when" guard_expr )? "=>" ( "-" | expression ) ( "," ( "-" | expression ) )* |
i_pattern |
::= |
( "-" | ( <ID> ":" )? ( simple_pattern | ( <ID> "=" | ) "(" simple_pattern ( "," simple_pattern )+ ")" ) ) |
simple_pattern |
::= |
( <ID> | <NUMBER> | boolean_constant | "$" ) |
component_g |
::= |
( qualified_name "(" ( ( expression ( "," expression )* )? ")" | <ID> "=" expression ( "," <ID> "=" expression )* ")" ) | "__SD_arbitrate" "(" <NUMBER> "," <NUMBER> "," <NUMBER> ( "," <ID> )? ")" | "__SD_buffer" "(" ( <NUMBER> "," <NUMBER> "," <NUMBER> ( "," <ID> )? ")" | expression "," <NUMBER> "," <NUMBER> "," <NUMBER> ( "," <ID> )? ")" ) | "__SD_duplicate" "(" <NUMBER> "," <NUMBER> "," <NUMBER> ")" | "__SD_arithmetic_plus" "(" <NUMBER> "," <NUMBER> ")" | "__SD_arithmetic_minus" "(" <NUMBER> "," <NUMBER> ")" | "__SD_arithmetic_multiply" "(" <NUMBER> "," <NUMBER> ")" | "__SD_arithmetic_divide" "(" <NUMBER> "," <NUMBER> ")" | "__SD_compare_equal" "(" <NUMBER> "," <NUMBER> ")" | "__SD_compare_less" "(" <NUMBER> "," <NUMBER> ")" | "__SD_compare_more" "(" <NUMBER> "," <NUMBER> ")" | "__SD_binary_and" "(" <NUMBER> "," <NUMBER> ")" | "__SD_binary_or" "(" <NUMBER> "," <NUMBER> ")" | "__SD_binary_xor" "(" <NUMBER> "," <NUMBER> ")" | "__SD_binary_not" "(" <NUMBER> "," <NUMBER> ")" | "__SD_logical_and" "(" <NUMBER> "," <NUMBER> ")" | "__SD_logical_or" "(" <NUMBER> "," <NUMBER> ")" | "__SD_logical_xor" "(" <NUMBER> "," <NUMBER> ")" | "__SD_logical_not" "(" <NUMBER> "," <NUMBER> ")" | "__SD_merge" "(" <NUMBER> "," <NUMBER> ")" | "__SD_probe" "(" <NUMBER> ( "," <ID> )? ")" | "__SD_sink" "(" <NUMBER> ")" | "__SD_split" "(" <NUMBER> "," <NUMBER> "," <NUMBER> ")" | "__SD_source" "(" expression "," <NUMBER> ")" | "__SD_gensource" "(" expression "," <NUMBER> ")" | "__SD_synchronise" "(" <NUMBER> "," <NUMBER> ")" | "__SD_tuple" "(" <NUMBER> "," <NUMBER> ")" | "__SD_untuple" "(" <NUMBER> "," <NUMBER> "," <NUMBER> ")" | <ID> | "{" block_g_body <CLOSE_CURLY: "}"> | "sink" | "source" expression | "tuple" | "untuple" | "synchronise" | "buffer" "(" expression ( "," expression )? ")" | "using" ( "input" ">>" pipe_and_ends <SPLIT: "split"> labelled_network <END_SPLIT: "end_split"> | pipe_and_ends ( "split" labelled_network "end_split" | <MERGE: "merge"> labelled_network <END_MERGE: "end_merge"> ) ) | "arbitrate" ( "$" )? pipeline ( pipe_separator pipeline )+ ( "$" )? <END_ARBITRATE: "end_arbitrate"> | "case" pipe_and_ends <OF: "of"> labelled_network ( <OTHERWISE: "otherwise"> pipe_and_ends | ) <END_CASE: "end_case"> | "for" expression "do" network <END_FOR: "end_for"> | "if" pipe_and_ends <THEN: "then"> network <ELSE: "else"> network <END_IF: "end_if"> | "while" pipe_and_ends <DO: "do"> network <END_WHILE: "end_while"> ) |