--------------------------------------
-- YACC Grammar for ParaSail
--------------------------------------
-- Single-character delimiters --
%token ',' ';' ':' '.'
%token '+' '-' '*' '/'
%token '?'
%token '(' ')' '[' ']' '<' '>' ''
%token '|'
%token '=' -- for error recovery only
%token PRIME -- '''
-- Compound delimiters --
%token COMPARE -- "=?"
%token EQ -- "=="
%token NEQ -- "!="
%token GEQ -- ">="
%token LEQ -- "<="
%token POWER -- "**"
%token ASSIGN -- ":="
%token SWAP -- ":=:"
%token DOT_DOT -- ".."
%token OPEN_CLOSED_INTERVAL -- "<.."
%token OPEN_INTERVAL -- "<..<"
%token CLOSED_OPEN_INTERVAL -- "..<"
%token DOUBLE_COLON -- "::"
%token REFERS_TO -- "=>"
%token GIVES -- "->"
%token IMPLIES -- "==>"
%token SEQUENCE -- ";;"
%token PARALLEL -- "||"
%token PLUS_ASSIGN -- "+="
%token MINUS_ASSIGN -- "-="
%token TIMES_ASSIGN -- "*="
%token DIVIDE_ASSIGN -- "/="
%token POWER_ASSIGN -- "**="
%token CONCAT_ASSIGN -- "|="
%token AND_ASSIGN -- "and="
%token OR_ASSIGN -- "or="
%token XOR_ASSIGN -- "xor="
-- Literals --
%token Char_Literal
%token Enum_Literal
%token Integer_Literal
%token Real_Literal
%token String_Literal
-- Identifier --
%token Identifier
-- Reserved words --
%token ABS_kw
%token ABSTRACT_kw
%token ALL_kw
%token AND_kw
%token BEGIN_kw -- used for error recovery only
%token BLOCK_kw
%token CASE_kw
%token CLASS_kw
%token CONCURRENT_kw
%token CONST_kw
%token CONTINUE_kw
%token EACH_kw
%token ELSE_kw
%token ELSIF_kw
%token END_kw
%token EXIT_kw
%token EXPORTS_kw
%token EXTENDS_kw
%token FOR_kw
%token FORWARD_kw
%token FUNCTION_kw
%token GLOBAL_kw
%token IF_kw
%token IMPLEMENTS_kw
%token IMPORT_kw
%token IN_kw
%token INTERFACE_kw
%token IS_kw
%token LAMBDA_kw
%token LOCKED_kw
%token LOOP_kw
%token MOD_kw
%token MUTABLE_kw
%token NEW_kw
%token NOT_kw
%token NULL_kw
%token OF_kw
%token OPERATOR_kw
%token OPTIONAL_kw
%token OR_kw
%token PRIVATE_kw
%token PROCEDURE_kw
%token QUEUED_kw
%token REF_kw
%token REM_kw
%token RETURN_kw
%token REVERSE_kw
%token SELECT_kw
%token SOME_kw
%token THEN_kw
%token TYPE_kw
%token UNTIL_kw
%token VAR_kw
%token WHILE_kw
%token WITH_kw
%token XOR_kw
%start module_list
%%
module_list :
module
| module_list module
;
module :
import_clauses interface_declaration ';'
| import_clauses class_definition ';'
| import_clauses standalone_operation_definition ';'
| import_clauses error ';'
;
import_clauses :
| import_clauses IMPORT_kw qualified_name_list ';'
;
qualified_name_list :
qualified_name
| qualified_name_list ',' qualified_name
;
interface_declaration :
opt_interface_qualifier INTERFACE_kw module_defining_name
formals_and_implemented_interfaces
IS_kw
interface_element_list
END_kw opt_INTERFACE_kw module_defining_name
;
opt_INTERFACE_kw : INTERFACE_kw
|
;
opt_interface_qualifier :
interface_qualifier
|
;
interface_qualifier :
class_qualifier
| ABSTRACT_kw opt_class_qualifier
| PRIVATE_kw opt_class_qualifier
;
opt_class_qualifier :
class_qualifier
|
;
class_qualifier : CONCURRENT_kw ;
standalone_operation_definition :
function_definition
| procedure_definition
| operator_definition
| operation_import
;
formals : '<' opt_module_formal_list '>' ;
formals_and_implemented_interfaces :
opt_formals opt_implements_list
| opt_formals EXTENDS_kw interface_name opt_implements_list
;
opt_formals :
formals
|
;
opt_implements_list :
implements_list
|
;
implements_list : IMPLEMENTS_kw interface_name_list ;
interface_name_list :
interface_name
| interface_name_list ',' interface_name
;
interface_name :
module_name
| module_instantiation
;
module_name : qualified_name ;
module_defining_name :
qualified_name
| qualified_name add_on_label
;
add_on_label :
'[' operation_actual_list ']' ;
opt_module_formal_list :
module_formal_list
| ;
module_formal_list :
annotated_module_formal
| module_formal_list ';' annotated_module_formal
;
annotated_module_formal :
opt_annotation type_formal opt_annotation
| opt_annotation operation_formal
| opt_annotation value_formal opt_annotation
;
opt_annotation :
annotation
|
;
type_formal :
id IS_kw module_instantiation
| module_instantiation
;
operation_formal :
operation_declaration opt_operation_default
;
opt_operation_default :
IS_kw simple_expression
|
;
value_formal :
id_list ':' opt_output_modifier operand_type_specifier
| id_list ':' opt_output_modifier operand_type_specifier
ASSIGN_or_equal simple_expression
| ref_or_global_modifier operand_type_specifier
;
id : Identifier
;
id_list :
id
| id_list ',' id
;
type_name :
qualified_name
| polymorphic_type_name
;
polymorphic_type_name : qualified_name '+' ;
qualified_name :
id_or_string_literal
| qualified_name DOUBLE_COLON id_or_string_literal ;
id_or_string_literal :
id
| String_Literal
;
module_instantiation :
module_name '<' opt_module_actual_list '>'
| name '[' opt_operation_actual_list ']' '<' opt_module_actual_list '>'
;
opt_add_on_label :
add_on_label
|
;
opt_module_actual_list :
module_actual_list
|
;
module_actual_list :
module_actual
| module_actual_list ',' module_actual
;
module_actual :
simple_type_specifier_or_expression
| id REFERS_TO simple_type_specifier_or_expression
;
-- simple_expression subsumes simple type_name in this rule
simple_type_specifier_or_expression :
qualified_name annotation
| qualified_type_specifier opt_annotation
| simple_expression
-- simple_expr to avoid problems with '>'
| lambda_expression
| module_instantiation
;
annotated_type_specifier :
type_specifier
| type_specifier annotation
;
type_specifier :
basic_type_specifier
| qualified_type_specifier
;
basic_type_specifier :
type_name
| module_instantiation
| module_instantiation EXTENDS_kw type_specifier
;
qualified_type_specifier :
type_qualifier type_name
| type_qualifier module_instantiation
| type_qualifier module_instantiation
EXTENDS_kw type_specifier
;
type_qualifier :
OPTIONAL_kw opt_MUTABLE_kw opt_CONCURRENT_kw
| MUTABLE_kw opt_CONCURRENT_kw
| CONCURRENT_kw
;
opt_CONCURRENT_kw :
CONCURRENT_kw
|
;
interface_element_list :
| interface_element_list interface_element ';'
| interface_element_list operation_import ';'
| interface_element_list error ';'
;
interface_element :
operation_declaration
| object_declaration
| interface_declaration
| type_declaration
;
operation_import :
function_declaration IS_kw import_operation
| procedure_declaration IS_kw import_operation
| operator_declaration IS_kw import_operation
;
class_definition :
opt_class_qualifier CLASS_kw module_defining_name
class_formals_and_implemented_interfaces
IS_kw
class_element_list
END_kw opt_CLASS_kw module_defining_name ;
opt_CLASS_kw : CLASS_kw
|
;
class_formals_and_implemented_interfaces :
formals_and_implemented_interfaces
| opt_formals EXTENDS_kw id ':' interface_name opt_implements_list
;
class_element_list :
local_class_element_list
EXPORTS_kw
exported_class_element_list
| local_class_element_list
annotation
EXPORTS_kw
exported_class_element_list
| local_class_element_list
;
local_class_element_list :
| local_class_element_list local_class_element ';'
;
local_class_element :
interface_element
| operation_import
| annotated_exported_class_element
;
exported_class_element_list :
| exported_class_element_list annotated_exported_class_element ';'
| exported_class_element_list operation_import ';'
| exported_class_element_list interface_element ';'
| exported_class_element_list error ';'
;
annotated_exported_class_element :
| exported_class_element
| annotation
| annotation exported_class_element
;
exported_class_element :
operation_definition
| object_definition
| class_definition
;
annotation : ''
| annotation ''
;
annotation_element_list :
annotation_element
| annotation_element_list ';' annotation_element
| annotation_element_list ';' error
;
annotation_element :
interface_element
| operation_import
| condition
| quantified_expression
| annotation
;
condition : expression ;
operation_declaration :
function_declaration
| procedure_declaration
| operator_declaration
;
function_declaration :
opt_ABSTRACT_or_OPTIONAL_kw FUNCTION_kw id_or_string_literal
operation_inputs opt_annotation
GIVES_or_RETURN_kw operation_outputs opt_annotation ;
GIVES_or_RETURN_kw : GIVES
| RETURN_kw
;
procedure_declaration :
opt_ABSTRACT_or_OPTIONAL_kw PROCEDURE_kw id
operation_inputs opt_annotation ;
operator_declaration :
opt_ABSTRACT_or_OPTIONAL_kw OPERATOR_kw operator_designator
operation_inputs opt_annotation
| opt_ABSTRACT_or_OPTIONAL_kw OPERATOR_kw operator_designator
operation_inputs opt_annotation
GIVES_or_RETURN_kw operation_outputs opt_annotation
;
opt_ABSTRACT_or_OPTIONAL_kw :
ABSTRACT_kw
| OPTIONAL_kw
|
;
operator_designator : String_Literal ;
operation_inputs :
simple_operation_input
| '(' opt_annotated_operation_input_list ')'
| '(' id_list ',' id ')'
|
;
simple_operation_input : -- avoids trailing use of "IS"
id ':' opt_input_modifier simple_operand_type_specifier
| input_modifier simple_operand_type_specifier
| simple_operand_type_specifier
;
opt_annotated_operation_input_list :
annotated_operation_input_list
|
;
annotated_operation_input_list :
annotated_operation_input
| annotated_operation_input_list ';' annotated_operation_input
;
annotated_operation_input :
operation_input opt_annotation
| annotation operation_input opt_annotation
| function_declaration opt_operation_default
| annotation function_declaration opt_operation_default
| procedure_declaration opt_operation_default
| annotation procedure_declaration opt_operation_default
;
operation_input :
id_list ':' opt_input_modifier operand_type_specifier opt_ASSIGN_expression
| input_modifier operand_type_specifier opt_ASSIGN_expression
| operand_type_specifier opt_ASSIGN_expression
;
opt_input_modifier :
input_modifier
|
;
simple_operand_type_specifier :
type_name
| module_instantiation
;
operand_type_specifier :
simple_operand_type_specifier
| id IS_kw module_instantiation
;
input_modifier :
output_modifier
| QUEUED_kw mutable_or_var_or_const
| LOCKED_kw mutable_or_var_or_const
;
mutable_or_var_or_const :
MUTABLE_kw opt_VAR_kw
| VAR_kw
| CONST_kw
;
opt_VAR_kw :
VAR_kw
|
;
operation_outputs :
simple_operation_output
| annotation simple_operation_output
| '(' annotated_operation_output_list ')'
| '(' id_list ',' id ')'
;
simple_operation_output : -- avoids trailing use of "IS"
id ':' opt_output_modifier simple_operand_type_specifier
| output_modifier simple_operand_type_specifier
| simple_operand_type_specifier
;
annotated_operation_output_list :
annotated_operation_output
| annotated_operation_output_list ';' annotated_operation_output
;
annotated_operation_output :
operation_output opt_annotation
| annotation operation_output opt_annotation
;
operation_output :
id_list ':' opt_output_modifier operand_type_specifier
| output_modifier operand_type_specifier
| operand_type_specifier
;
opt_output_modifier :
output_modifier
|
;
output_modifier :
OPTIONAL_kw
| ref_or_global_modifier
;
ref_or_global_modifier :
REF_or_GLOBAL_opt_optional_mutable
| REF_or_GLOBAL_opt_optional_mutable VAR_kw
| REF_or_GLOBAL_opt_optional_mutable CONST_kw
;
REF_or_GLOBAL_opt_optional_mutable :
REF_or_GLOBAL_kw
| REF_or_GLOBAL_kw OPTIONAL_kw
| REF_or_GLOBAL_kw MUTABLE_kw
| REF_or_GLOBAL_kw OPTIONAL_kw MUTABLE_kw
;
REF_or_GLOBAL_kw :
REF_kw
| GLOBAL_kw
;
object_declaration :
VAR_kw id ':'
annotated_type_specifier
opt_ASSIGN_expression
| CONST_kw id ':' annotated_type_specifier
opt_ASSIGN_expression
| id ':' annotated_type_specifier
opt_ASSIGN_expression
;
opt_ASSIGN_expression :
ASSIGN_or_equal expression
|
;
object_definition :
CONST_kw id ASSIGN_or_equal expression
| VAR_kw id ASSIGN_or_equal expression
| CONST_kw id REFERS_TO name
| VAR_kw id REFERS_TO name
;
opt_OPTIONAL_kw :
OPTIONAL_kw
|
;
opt_MUTABLE_kw :
MUTABLE_kw
|
;
type_declaration :
TYPE_kw id IS_kw opt_NEW_kw annotated_type_specifier ;
opt_NEW_kw :
NEW_kw
|
;
operation_definition :
function_definition
| procedure_definition
| operator_definition
;
function_definition :
function_declaration IS_kw opt_queued_clause
statement_list_with_semi
END_kw opt_FUNCTION_kw id
;
opt_FUNCTION_kw : FUNCTION_kw
|
;
procedure_definition :
procedure_declaration IS_kw opt_queued_clause
statement_list_with_semi
END_kw opt_PROCEDURE_kw id
;
opt_PROCEDURE_kw : PROCEDURE_kw
|
;
operator_definition :
operator_declaration IS_kw
statement_list_with_semi
END_kw opt_OPERATOR_kw operator_designator
;
opt_OPERATOR_kw : OPERATOR_kw
|
;
opt_queued_clause :
queued_clause
|
;
queued_clause :
QUEUED_kw WHILE_or_UNTIL_kw condition THEN_kw ;
import_operation :
IMPORT_kw '(' opt_operation_actual_list ')' ;
statement_list_with_semi :
parallel_sequence_with_semi
| statement_list_no_semi THEN_kw parallel_sequence_with_semi
| statement_list_with_semi THEN_kw parallel_sequence_with_semi
| statement_list_with_semi use_BEGIN_kw parallel_sequence_with_semi
| use_BEGIN_kw parallel_sequence_with_semi
;
use_BEGIN_kw : BEGIN_kw ;
statement_list_no_semi :
parallel_sequence_no_semi
| statement_list_no_semi THEN_kw parallel_sequence_no_semi
| statement_list_with_semi THEN_kw parallel_sequence_no_semi
;
parallel_sequence_with_semi :
statement_sequence_with_semi
| parallel_sequence_no_semi PARALLEL statement_sequence_with_semi
| parallel_sequence_with_semi PARALLEL statement_sequence_with_semi
;
parallel_sequence_no_semi :
statement_sequence
| parallel_sequence_no_semi PARALLEL statement_sequence
| parallel_sequence_with_semi PARALLEL statement_sequence
;
statement_sequence_opt_semi :
statement_sequence_with_semi
| statement_sequence
;
statement_sequence_with_semi : statement_sequence ';' ;
statement_sequence :
annotated_statement
| statement_sequence SEQUENCE annotated_statement
| statement_sequence ';' SEQUENCE annotated_statement
| statement_sequence ';' annotated_statement
;
annotated_statement :
opt_annotation local_declaration
| opt_annotation statement opt_annotation
| annotation
;
statement :
local_definition
| simple_statement
| label compound_statement
| compound_statement
;
simple_statement :
primitive_statement
| name equal_as_assign expression
| NULL_kw
| name '(' opt_operation_actual_list ')'
| RETURN_kw expression
| RETURN_kw opt_WITH_values
| CONTINUE_kw LOOP_kw opt_id opt_WITH_values
| EXIT_kw compound_statement_kind opt_id opt_WITH_values
;
primitive_statement :
name assign_operator_not_divide expression
| name DIVIDE_ASSIGN expression
| name SWAP name
| '(' opt_operation_actual_list ')' ASSIGN expression
;
opt_operation_actual_list :
operation_actual_list
|
;
opt_WITH_values :
WITH_values
|
;
WITH_values : WITH_kw operation_actual ;
opt_id :
id
|
;
compound_statement_kind :
LOOP_kw
| IF_kw
| CASE_kw
| SELECT_kw
| BLOCK_kw
;
local_declaration :
operation_declaration
| type_declaration
| object_declaration
;
local_definition :
object_definition
| operation_definition
;
label : '*' id '*' ;
compound_statement :
if_statement
| case_statement
| indefinite_loop_statement
| while_until_loop_statement
| for_loop_statement
| block_statement
| select_statement
| error ';'
;
if_statement :
IF_kw condition THEN_kw
statement_list_with_semi
opt_else_part
END_kw IF_kw opt_id opt_WITH_values ;
opt_else_part :
ELSIF_kw condition THEN_kw
statement_list_with_semi
opt_else_part
| ELSE_kw statement_list_with_semi
|
;
case_statement :
CASE_kw expression OF_kw
case_alt_list
opt_default_alt
END_kw CASE_kw opt_id opt_WITH_values ;
case_alt_list :
case_alt
| case_alt_list case_alt
;
case_alt :
'[' simple_expression_opt_named ']' REFERS_TO statement_list_with_semi
;
simple_expression_opt_named :
simple_expression
| id ':' simple_expression
;
opt_default_alt :
'[' dot_dot_opt_named ']' REFERS_TO statement_list_with_semi
|
;
dot_dot_opt_named :
dot_dot_as_interval
| id ':' dot_dot_as_interval
;
dot_dot_as_interval : DOT_DOT ;
indefinite_loop_statement :
LOOP_kw
statement_list_with_semi
END_kw LOOP_kw opt_id opt_WITH_values ;
while_until_loop_statement :
WHILE_or_UNTIL_kw condition LOOP_kw
statement_list_with_semi
END_kw LOOP_kw opt_id opt_WITH_values ;
WHILE_or_UNTIL_kw :
WHILE_kw
| UNTIL_kw
;
for_loop_statement :
FOR_kw iterator_spec opt_direction LOOP_kw
statement_list_with_semi
END_kw LOOP_kw opt_id opt_WITH_values ;
iterator_spec :
iterator
| '(' iterator_list ')'
;
iterator_list :
iterator
| iterator_list ';' iterator
;
iterator :
index_set_iterator
| EACH_kw element_iterator
| initial_next_while_iterator
| initial_value_iterator
;
index_set_iterator :
id opt_COLON_type_specifier IN_kw opt_REVERSE_kw expression ;
opt_REVERSE_kw :
| REVERSE_kw ;
element_iterator :
id opt_COLON_type_specifier OF_kw expression
| '[' id REFERS_TO id ']' OF_kw expression
;
initial_next_while_iterator :
id opt_COLON_type_specifier ASSIGN_or_equal expression
opt_THEN_next_value_list
WHILE_or_UNTIL_kw condition
| id opt_COLON_type_specifier REFERS_TO name
opt_THEN_next_name_list
WHILE_or_UNTIL_kw condition
;
opt_THEN_next_value_list :
THEN_kw next_value_list
|
;
opt_THEN_next_name_list :
THEN_kw next_name_list
|
;
initial_value_iterator :
id opt_COLON_type_specifier ASSIGN_or_equal expression
| id opt_COLON_type_specifier REFERS_TO name
;
opt_COLON_type_specifier :
':' type_specifier
|
;
next_value_list :
expression
| next_value_list PARALLEL expression
;
next_name_list :
name
| next_name_list PARALLEL name
;
opt_direction : direction
|
;
direction :
CONCURRENT_kw
| FORWARD_kw
| REVERSE_kw
;
select_statement :
SELECT_kw
select_alt_list
END_kw SELECT_kw opt_id opt_WITH_values ;
select_alt_list :
select_alt
| select_alt_list PARALLEL select_alt
;
select_alt :
'[' statement_sequence_opt_semi ']' REFERS_TO statement_sequence_with_semi ;
block_statement :
BLOCK_kw
statement_list_with_semi
END_kw opt_BLOCK_kw opt_id opt_WITH_values
;
opt_BLOCK_kw : BLOCK_kw
|
;
expression :
expression_no_err
| expression_no_err divide_assign_as_not_equal expression_no_err
;
divide_assign_as_not_equal :
DIVIDE_ASSIGN
;
expression_no_err :
logical_expression
| logical_expression '?' expression ':' expression_no_err
| lambda_expression
;
lambda_expression :
LAMBDA_kw operation_inputs opt_annotation IS_kw
simple_expression_or_expr_stmt_seq
| LAMBDA_kw operation_inputs opt_annotation
GIVES operation_outputs opt_annotation IS_kw
simple_expression_or_expr_stmt_seq
;
simple_expression_or_expr_stmt_seq :
simple_expression
| '(' expr_statement_seq ')'
;
expr_statement_seq : expr_statement ';' expr_statement
| expr_statement_seq ';' expr_statement
;
expr_statement :
primitive_statement
| expression_no_err
;
logical_expression :
comparison_expression
| logical_expression logical_operator comparison_expression
;
comparison_expression : -- comparisons are non associative
simple_expression
| simple_expression comparison_operator simple_expression
| adding_expression IN_kw simple_expression
| adding_expression NOT_kw IN_kw simple_expression
| adding_expression IS_kw NULL_kw
| adding_expression NOT_kw NULL_kw
;
simple_expression : -- used to avoid use of '>' in module instantiation
simple_expression_component
| simple_expression '|' simple_expression_component
;
simple_expression_component :
adding_expression
| adding_expression interval_operator adding_expression
| adding_expression interval_operator
| interval_operator adding_expression
| adding_expression '+'
;
adding_expression :
term
| adding_expression adding_operator term
;
term :
factor
| term multiplying_operator factor
;
factor :
primary
| primary power_operator factor
| unary_operator factor
;
primary :
name
| literal
| '(' conditional_expression ')'
| '(' quantified_expression ')'
| aggregate
;
literal: -- NOTE: See "name" for String_Literal
Integer_Literal
| Real_Literal
| Char_Literal
| Enum_Literal
| NULL_kw
;
name :
qualified_name_and_property opt_PRIME
| qualified_name DOUBLE_COLON literal
| name '(' opt_operation_actual_list ')'
| name '[' opt_operation_actual_list ']'
| name '.' selector
;
qualified_name_and_property :
qualified_name
| qualified_name_and_property Enum_Literal
;
opt_PRIME :
PRIME
| PRIME Identifier
|
;
operation_actual_list :
operation_actual
| operation_actual_list ',' operation_actual
;
operation_actual :
expression_no_err
| id REFERS_TO expression
;
selector : id ;
unary_operator :
'+'
| '-'
| ABS_kw
| NOT_kw
;
adding_operator :
'+'
| '-'
;
multiplying_operator :
'*'
| '/'
| MOD_kw
| REM_kw
;
power_operator : POWER ;
assign_operator : assign_operator_not_divide
| DIVIDE_ASSIGN
;
assign_operator_not_divide :
ASSIGN
| PLUS_ASSIGN
| MINUS_ASSIGN
| TIMES_ASSIGN
| CONCAT_ASSIGN
| AND_ASSIGN
| OR_ASSIGN
| XOR_ASSIGN
;
ASSIGN_or_equal : ASSIGN
| equal_as_assign
;
equal_as_assign : '='
;
comparison_operator :
COMPARE
| EQ
| NEQ
| '<'
| LEQ
| '>'
| GEQ
| '<' '<'
| '>' '>'
| '='
;
logical_operator :
AND_kw
| OR_kw
| XOR_kw
| AND_kw THEN_kw
| OR_kw ELSE_kw
| IMPLIES
;
interval_operator :
DOT_DOT
| OPEN_INTERVAL
| CLOSED_OPEN_INTERVAL
| OPEN_CLOSED_INTERVAL
;
aggregate :
class_aggregate
| container_aggregate
;
class_aggregate :
'(' opt_operation_actual_list ')'
| '(' name DIVIDE_ASSIGN expression ')'
| qualified_name DOUBLE_COLON '(' opt_operation_actual_list ')'
;
container_aggregate :
'[' opt_container_element_list ']'
| qualified_name DOUBLE_COLON '[' opt_container_element_list ']'
;
opt_container_element_list :
container_element_list
| DOT_DOT
|
;
container_element_list :
container_element
| container_element_list ',' container_element
;
container_element :
expression
| simple_expression REFERS_TO filtered_expression_stream
| DOT_DOT REFERS_TO filtered_expression_stream
| FOR_kw iterator REFERS_TO filtered_expression_stream
;
filtered_expression_stream :
expression
| expression ':' condition
;
conditional_expression :
if_expression
| case_expression
;
if_expression :
IF_kw condition THEN_kw
expression
opt_else_expr ;
opt_else_expr :
ELSIF_kw condition THEN_kw
expression
opt_else_expr
| ELSE_kw expression
|
;
case_expression :
CASE_kw expression OF_kw
case_expr_alt_list ;
case_expr_alt_list :
case_expr_alt
| case_expr_alt_list ';' case_expr_alt
;
case_expr_alt :
'[' simple_expression_opt_named ']' REFERS_TO expression
| '[' dot_dot_opt_named ']' REFERS_TO expression
;
quantified_expression :
FOR_kw ALL_or_SOME_kw quantified_iterator REFERS_TO
condition_or_quantified_expression ;
condition_or_quantified_expression :
condition
| if_expression
| quantified_expression
;
ALL_or_SOME_kw :
ALL_kw
| SOME_kw
;
quantified_iterator :
index_set_iterator
| element_iterator
| initial_next_while_iterator
;
%%
This blog will follow the trials and tribulations of designing a new programming language designed to allow productive development of parallel, high-integrity (safety-critical, high-security) software systems. The language is tentatively named "ParaSail" for Parallel, Specification and Implementation Language.
Monday, May 9, 2011
Updated YACC grammar for ParaSail
Here is a more up-to-date YACC grammar from ParaSail. It uses "--" for comments, but otherwise is pretty vanilla "yacc" syntax.
Subscribe to:
Post Comments (Atom)
Note that there are some productions which are just for handling common syntax errors. In particular, any production using '=' or BEGIN_kw is for error recovery, since '=' is not a ParaSail operator ('==' and ':=' are the related ParaSail operators), and 'begin' is not a ParaSail reserved word.
ReplyDelete