Previous: , Up: Grammar   [Contents][Index]


4.11 Summary of the grammar

The following is the complete grammar for the coNCePTuaL language. The EBNF productions appear here in the order that they were presented in the rest of the chapter.

<expr> ::= <cond_expr>
<cond_expr> ::= <add_expr> IF <rel_expr> OTHERWISE <add_expr>
<add_expr> ::= <mult_expr>
| <add_expr> ‘+ <mult_expr>
| <add_expr> ‘- <mult_expr>
| <add_expr> ‘| <mult_expr>
| <add_expr> XOR <mult_expr>
<mult_expr> ::= <unary_expr>
| <mult_expr> ‘* <unary_expr>
| <mult_expr> ‘/ <unary_expr>
| <mult_expr> MOD <unary_expr>
| <mult_expr> ‘>> <unary_expr>
| <mult_expr> ‘<< <unary_expr>
| <mult_expr> ‘& <unary_expr>
<power_expr> ::= <primary_expr> [‘** <unary_expr>]
<unary_expr> ::= <power_expr>
| <unary_operator> <unary_expr>
<unary_operator> ::= +’ | ‘-’ | NOT
<primary_expr> ::= ( <expr> ‘)
| <ident>
| <integer>
| <func_name> ‘( <enumerated_exprs> ‘)
| REAL( <expr> ‘)
<enumerated_exprs> ::= <expr> [‘, <expr>]*
<func_name> ::= ABS | BITS | CBRT | FACTOR10 | LOG10 | MAX | MIN | ROOT | SQRT
| CEILING | FLOOR | ROUND
| TREE_PARENT | TREE_CHILD
| KNOMIAL_PARENT | KNOMIAL_CHILD | KNOMIAL_CHILDREN
| MESH_NEIGHBOR | MESH_COORDINATE | MESH_DISTANCE
| RANDOM_UNIFORM | RANDOM_GAUSSIAN
| RANDOM_POISSON | RANDOM_PARETO
| PROCESSOR_OF | TASK_OF
| FILE_DATA | STATIC_FILE_DATA
<aggr_expr> ::= [ EACH] <expr>
| THE <expr>
| THE <aggr_func> [ AND THE <aggr_func>]* [ OF [ THE]] <expr>
| A HISTOGRAM OF [ THE] <expr>
<aggr_func> ::= [ ARITHMETIC] MEAN | HARMONIC MEAN | GEOMETRIC MEAN | MEDIAN | STANDARD DEVIATION | VARIANCE | MEDIAN ABSOLUTE DEVIATION | SUM | MINIMUM | MAXIMUM | FINAL | <expr> PERCENTILE
<rel_expr> ::= <rel_disj_expr>
<rel_disj_expr> ::= [ <rel_disj_expr> ‘\/’] <rel_conj_expr>
<rel_conj_expr> ::= [ <rel_conj_expr> ‘/\’] <rel_primary_expr>
<rel_primary_expr> ::= <eq_expr>
| ( <rel_expr> ‘)
<eq_expr> ::= <expr> ‘= <expr>
| <expr> ‘< <expr>
| <expr> ‘> <expr>
| <expr> ‘<= <expr>
| <expr> ‘>= <expr>
| <expr> ‘<> <expr>
| <expr> DIVIDES <expr>
| <expr> IS EVEN
| <expr> IS ODD
| <expr> IS IN <range> [, <range>]*
| <expr> IS NOT IN <range> [, <range>]*
<range> ::= { <expr> [‘, <expr>]* [‘, ... , <expr>] ‘}
| { <expr> [ FOR EACH <ident> IN <range> [‘, <range>]* ]+
    [ WHERE <rel_expr>] ‘}
<restricted_ident> ::= <ident> SUCH THAT <rel_expr>
<source_task> ::= ALL TASKS
| ALL TASKS <ident>
| TASK <expr>
| TASKS <restricted_ident>
| TASK GROUP <ident>
| TASKS <range> [, <range>]*
<target_tasks> ::= ALL OTHER TASKS
| TASK <expr>
| TASKS <restricted_ident>
| TASK GROUP <ident>
| TASKS <range> [, <range>]*
<message_spec> ::= <item_count>
[ NONUNIQUE | UNIQUE]
<item_size>
[ UNALIGNED |
  <message_alignment> ALIGNED |
  <message_alignment> MISALIGNED]
MESSAGES
[ WITH VERIFICATION | WITH DATA TOUCHING |
  WITHOUT VERIFICATION | WITHOUT DATA TOUCHING]
[ USING TAG
  <expr> | <string>]
[ FROM [ <expr> <data_multiplier> INTO]
  BUFFER <expr> | THE DEFAULT BUFFER]
<recv_message_spec> ::= [ SYNCHRONOUSLY | ASYNCHRONOUSLY]
[ AS [ A| AN]
 [ NONUNIQUE | UNIQUE]
 [ UNALIGNED |
   <message_alignment> ALIGNED |
   <message_alignment> MISALIGNED]
  MESSAGES]
[ WITH VERIFICATION | WITH DATA TOUCHING |
  WITHOUT VERIFICATION | WITHOUT DATA TOUCHING]
[ USING TAG
  <expr> | <string>]
[ INTO [ <expr> <data_multiplier> INTO]
  BUFFER <expr> | THE DEFAULT BUFFER]
<reduce_message_spec> ::= <item_count>
[ NONUNIQUE | UNIQUE]
[ UNALIGNED |
  <message_alignment> ALIGNED |
  <message_alignment> MISALIGNED]
INTEGERS | DOUBLEWORDS
[ WITH DATA TOUCHING | WITHOUT DATA TOUCHING]
[ USING TAG
  <expr> | <string>]
[ FROM [ <expr> <data_multiplier> INTO]
  BUFFER <expr> | THE DEFAULT BUFFER]
<reduce_target_message_spec> ::= [ AS <item_count>
 [ NONUNIQUE | UNIQUE]
 [ <message_alignment> ALIGNED |
   <message_alignment> MISALIGNED]
  INTEGERS | DOUBLEWORDS]
[ WITH DATA TOUCHING | WITHOUT DATA TOUCHING]
[ USING TAG
  <expr> | <string>]
[ INTO [ <expr> <data_multiplier> INTO]
  BUFFER <expr> | THE DEFAULT BUFFER]
<item_count> ::= A | AN | <expr>
<item_size> ::= <empty>
| <expr> <data_multiplier>
| <data_type> SIZED
<data_multiplier> ::= BIT | BYTE | HALFWORD | WORD | INTEGER | DOUBLEWORD | QUADWORD | PAGE | KILOBYTE | MEGABYTE | GIGABYTE
<data_type> ::= BYTE | HALFWORD | WORD | INTEGER | DOUBLEWORD | QUADWORD | PAGE
<message_alignment> ::= <data_type>
| <expr> <data_multiplier>
<send_stmt> ::= <source_task>
[ ASYNCHRONOUSLY] SENDS
<message_spec>
TO [ UNSUSPECTING] <target_tasks>
| <source_task>
[ ASYNCHRONOUSLY] SENDS
<message_spec>
TO <target_tasks>
WHO RECEIVE IT
<recv_message_spec>
<receive_stmt> ::= <target_tasks>
[ ASYNCHRONOUSLY] RECEIVE
<message_spec>
FROM <source_task>
<wait_stmt> ::= <source_task>
AWAITS COMPLETION
<mcast_stmt> ::= <source_task>
[ ASYNCHRONOUSLY] MULTICASTS
<message_spec>
TO <target_tasks>
<reduce_stmt> ::= <source_task>
REDUCES
<reduce_message_spec>
TO <source_task>
[ WHO RECEIVES THE RESULT <reduce_target_message_spec>]
| <source_task>
REDUCES
<reduce_message_spec>
[ TO <reduce_message_spec>]
<sync_stmt> ::= <source_task>
SYNCHRONIZES
<string_or_log_comment> ::= <string>
| THE VALUE OF <string>
<output_stmt> ::= <source_task>
OUTPUTS
<expr> | <string_or_log_comment>
[ AND    <expr> | <string_or_log_comment>]*
<log_stmt> ::= <source_task>
LOGS
<aggr_expr> AS <string_or_log_comment>
[ AND <aggr_expr> AS <string_or_log_comment>]*
<flush_stmt> ::= <source_task>
COMPUTES AGGREGATES
<reset_stmt> ::= <source_task>
RESETS ITS COUNTERS
<store_stmt> ::= <source_task>
STORES ITS COUNTERS
<restore_stmt> ::= <source_task>
RESTORES ITS COUNTERS
<complex_stmt> ::= <simple_stmt> [ THEN <complex_stmt>]
<simple_stmt> ::= FOR <expr> REPETITIONS [ PLUS <expr> WARMUP REPETITIONS [ AND A SYNCHRONIZATION]] <simple_stmt>
| FOR EACH <ident> IN <range> [‘, <range>]* <simple_stmt>
| FOR <expr> <time_unit> [ PLUS <expr> WARMUP <time_unit> [ AND A SYNCHRONIZATION]] <simple_stmt>
| LET <let_binding> [ AND <let_binding>]* WHILE <simple_stmt>
| IF <rel_expr> THEN <simple_stmt> [ OTHERWISE <simple_stmt>]
| {’ [ <complex_stmt>] ‘}
| <send_stmt>
| <receive_stmt>
| <wait_stmt>
| <mcast_stmt>
| <reduce_stmt>
| <sync_stmt>
| <output_stmt>
| <log_stmt>
| <flush_stmt>
| <reset_stmt>
| <store_stmt>
| <restore_stmt>
| <assert_stmt>
| <delay_stmt>
| <touch_stmt>
| <touch_buffer_stmt>
| <processor_stmt>
| <backend_stmt>
<let_binding> ::= <ident> BE expr
| <source_task>
| A RANDOM TASK [ <random_task_constraints>]
<random_task_constraints> ::= OTHER THAN <expr>
| LESS THAN <expr> [ BUT NOT <expr>]
| GREATER THAN <expr> [ BUT NOT <expr>]
| IN[ <expr> ‘, <expr> ‘]’ [ BUT NOT <expr>]
<if_stmt> ::= IF <rel_expr>
THEN <simple_stmt>
[ OTHERWISE <simple_stmt>]
<assert_stmt> ::= ASSERT THAT <string>
WITH <rel_expr>
<delay_stmt> ::= <source_task>
SLEEPS | COMPUTES
FOR <expr> <time_unit>
<time_unit> ::= MICROSECONDS | MILLISECONDS | SECONDS | MINUTES | HOURS | DAYS
<touch_stmt> ::= <source_task>
TOUCHES
[ <expr> <data_type> OF]
AN <item_size> MEMORY REGION
[ <expr> TIMES]
[ WITH STRIDE <expr> <data_type> | WITH RANDOM STRIDE]
<touch_buffer_stmt> ::= <source_task>
TOUCHES
     ALL MESSAGE BUFFERS
  | MESSAGE BUFFER <expr>
  | THE CURRENT MESSAGE BUFFER
<processor_stmt> ::= <source_task>
IS ASSIGNED TO
PROCESSOR <expr> | A RANDOM PROCESSOR
<backend_stmt> ::= <source_task>
BACKEND EXECUTES
<expr> | <string>
[ AND <expr> | <string>]*
<version_decl> ::= REQUIRE LANGUAGE VERSION <string>
<param_decl> ::= <ident>
IS <string>
AND COMES FROM <string> OR <string>
WITH DEFAULT <expr>
<backend_decl> ::= THE BACKEND DECLARES <string>
<program> ::= ( <version_decl> | <param_decl> | <backend_decl> [‘.’])*
( <top_level_complex_stmt> [‘.’])+
<top_level_complex_stmt> ::= <complex_stmt>

The primitives <ident>, <string>, and <integer> are described in Primitives.


Previous: , Up: Grammar   [Contents][Index]

Scott Pakin, pakin@lanl.gov