diff options
-rw-r--r-- | bnfc/modelica33r1_spec.txt | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/bnfc/modelica33r1_spec.txt b/bnfc/modelica33r1_spec.txt new file mode 100644 index 0000000..2df42dd --- /dev/null +++ b/bnfc/modelica33r1_spec.txt @@ -0,0 +1,347 @@ +# These come directly the Modelica 3.3 Spec, Appendix B + +## B.1 Lexical Convetions + +IDENT = NONDIGIT { DIGIT | NONDIGIT } | Q-IDENT +Q-IDENT = "’" ( Q-CHAR | S-ESCAPE ) { Q-CHAR | S-ESCAPE } "’" +NONDIGIT = "_" | letters "a" to "z" | letters "A" to "Z" +STRING = """ { S-CHAR | S-ESCAPE } """ +S-CHAR = any member of the Unicode character set (http://www.unicode.org; see Section 13.2.2 for storing as UTF-8 on files) except double-quote """, and backslash "\" +Q-CHAR = NONDIGIT | DIGIT | "!" | "#" | "$" | "%" | "&" | "(" | ")" | "*" | "+" | "," | "-" | "." | "/" | ":" | ";" | "<" | ">" | "=" | "?" | "@" | "[" | "]" | "^" | "{" | "}" | "|" | "~" | " " +S-ESCAPE = "\’" | "\"" | "\?" | "\\" | "\a" | "\b" | "\f" | "\n" | "\r" | "\t" | "\v" +DIGIT = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" +UNSIGNED_INTEGER = DIGIT { DIGIT } +UNSIGNED_NUMBER = UNSIGNED_INTEGER [ "." [ UNSIGNED_INTEGER ] ] [ ( "e" | "E" ) [ "+" | "-" ] UNSIGNED_INTEGER ] + +## B.2 Grammar + +### B.2.1 + +stored_definition: + [ within [ name ] ";" ] + { [ final ] class_definition ";" } + +### B.2.2 Class Definition + +class_definition : + [ encapsulated ] class_prefixes + class_specifier + +class_prefixes : + [ partial ] + ( class | model | [ operator ] record | block | [ expandable ] connector | type | + package | [ ( pure | impure ) ] [ operator ] function | operator ) + +class_specifier : + long_class_specifier | short_class_specifier | der_class_specifier + +long_class_specifier : + IDENT string_comment composition end IDENT + | extends IDENT [ class_modification ] string_comment composition + end IDENT + +short_class_specifier : + IDENT "=" base_prefix name [ array_subscripts ] + [ class_modification ] comment + | IDENT "=" enumeration "(" ( [enum_list] | ":" ) ")" comment + +der_class_specifier : + IDENT "=" der "(" name "," IDENT { "," IDENT } ")" comment + +base_prefix : + type_prefix + +enum_list : + enumeration_literal { "," enumeration_literal} + +enumeration_literal : + IDENT comment + +composition : + element_list + { public element_list | + protected element_list | + equation_section | + algorithm_section + } + [ external [ language_specification ] + [ external_function_call ] [ annotation ] ";" ] + [ annotation ";" ] + +language_specification : + STRING + +external_function_call : + [ component_reference "=" ] + IDENT "(" [ expression_list ] ")" + +element_list : + { element ";" } + +element : + import_clause | + extends_clause | + [ redeclare ] + [ final ] + [ inner ] [ outer ] + ( ( class_definition | component_clause) | + replaceable ( class_definition | component_clause) + [constraining_clause comment]) + +import_clause : + import ( IDENT "=" name | name ["." ( "*" | "{" import_list "}" ) ] ) comment + +import_list : + IDENT { "," IDENT } + +### B.2.3 Extends + +extends_clause : + extends name [ class_modification ] [annotation] + +constraining_clause : + constrainedby name [ class_modification ] + +### B.2.4 Component Clause + +component_clause: + type_prefix type_specifier [ array_subscripts ] component_list + type_prefix : + [ flow | stream ] + [ discrete | parameter | constant ] [ input | output ] + +type_specifier : + name + +component_list : + component_declaration { "," component_declaration } + +component_declaration : + declaration [ condition_attribute ] comment + +condition_attribute: + if expression + +declaration : + IDENT [ array_subscripts ] [ modification ] + +### B.2.5 Modification + +modification : + class_modification [ "=" expression ] + | "=" expression + | ":=" expression + +class_modification : + "(" [ argument_list ] ")" + +argument_list : + argument { "," argument } + +argument : + element_modification_or_replaceable + | element_redeclaration + element_modification_or_replaceable: + [ each ] [ final ] ( element_modification | element_replaceable) + +element_modification : + name [ modification ] string_comment + +element_redeclaration : + redeclare [ each ] [ final ] + ( ( short_class_definition | component_clause1) | element_replaceable ) + +element_replaceable: + replaceable ( short_class_definition | component_clause1) + [constraining_clause] + +component_clause1 : + type_prefix type_specifier component_declaration1 + +component_declaration1 : + declaration comment + +short_class_definition : + class_prefixes short_class_specifier + +### B.2.6 Equations + +equation_section : + [ initial ] equation { equation ";" } + +algorithm_section : + [ initial ] algorithm { statement ";" } + +equation : + ( simple_expression "=" expression + | if_equation + | for_equation + | connect_clause + | when_equation + | name function_call_args ) + comment + +statement : + ( component_reference ( ":=" expression | function_call_args ) + | "(" output_expression_list ")" ":=" component_reference function_call_args + | break + | return + | if_statement + | for_statement + | while_statement + | when_statement ) + comment + +if_equation : + if expression then + { equation ";" } + { elseif expression then + { equation ";" } + } + [ else + { equation ";" } + ] + end if + +if_statement : + if expression then + { statement ";" } + { elseif expression then + { statement ";" } + } + [ else + { statement ";" } + ] + end if + +for_equation : + for for_indices loop + { equation ";" } + end for + +for_statement : + for for_indices loop + { statement ";" } + end for + +for_indices : + for_index {"," for_index} + +for_index: + IDENT [ in expression ] + while_statement : + while expression loop + { statement ";" } + end while + +when_equation : + when expression then + { equation ";" } + { elsewhen expression then + { equation ";" } } + end when + +when_statement : + when expression then + { statement ";" } + { elsewhen expression then + { statement ";" } } + end when + +connect_clause : + connect "(" component_reference "," component_reference ")" + +### B.2.7 Expressions + +expression : + simple_expression + | if expression then expression { elseif expression then expression } + else expression + +simple_expression : + logical_expression [ ":" logical_expression [ ":" logical_expression ] ] + +logical_expression : + logical_term { or logical_term } + +logical_term : + logical_factor { and logical_factor } + +logical_factor : + [ not ] relation + +relation : + arithmetic_expression [ rel_op arithmetic_expression ] + +rel_op : + "<" | "<=" | ">" | ">=" | "==" | "<>" + +arithmetic_expression : + [ add_op ] term { add_op term } + +add_op : + "+" | "-" | ".+" | ".-" + +term : + factor { mul_op factor } + +mul_op : + "*" | "/" | ".*" | "./" + +factor : + primary [ ("^" | ".^") primary ] + +primary : + UNSIGNED_NUMBER + | STRING + | false + | true + | ( name | der | initial ) function_call_args + | component_reference + | "(" output_expression_list ")" + | "[" expression_list { ";" expression_list } "]" + | "{" function_arguments "}" + | end + +name : + [ "." ] IDENT { "." IDENT } + +component_reference : + [ "." ] IDENT [ array_subscripts ] { "." IDENT [ array_subscripts ] } + +function_call_args : + "(" [ function_arguments ] ")" + function_arguments : + function_argument [ "," function_arguments | for for_indices ] + | named_arguments + +named_arguments: + named_argument [ "," named_arguments ] + +named_argument: + IDENT "=" function_argument + +function_argument : + function name "(" [ named_arguments ] ")" | expression + +output_expression_list: + [ expression ] { "," [ expression ] } + +expression_list : + expression { "," expression } + +array_subscripts : + "[" subscript { "," subscript } "]" + +subscript : + ":" | expression + +comment : + string_comment [ annotation ] + +string_comment : + [ STRING { "+" STRING } ] + +annotation : + annotation class_modification + |