BNF for Parser.jj

NON-TERMINALS

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"> )