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