[comp.lang.eiffel] Eiffel syntax: Version 2.2 update.

bertrand@eiffel.UUCP (Bertrand Meyer) (06/05/89)

	To help users prepare for the upcoming release of version 2.2, here is
a full syntax description. It replaces the previous description as given
in ``Object-Oriented Software Construction'' (Appendix C) and in the
Eiffel User's Manual. This includes the relatively few syntactic additions
introduced by 2.2 as well as corrections of errors in the previously
published grammars.

	The conventions used are described in the references cited.
They were really designed under the assumption that the
output medium supports boldface (for keywords) and italics (for other
reserved words such as Result). Here of course only one font is
used; there is no ambiguity for keywords (any identifier all in
lower-case, e.g.  deferred, is a keyword); most names beginning
with a capital letter (e.g. Local_entities, Class etc.) denote
non-terminals, with a few exceptions for reserved words such as Result.
My apologies for the resulting ambiguities, which anyone familiar
enough with Eiffel should have no trouble resolving.


	This grammar has been checked but errors or inconsistencies may
remain. If you find one, please e-mail a comment to me; there is still
some time for last-minute documentation updates.

	Note that this is just the grammar, with no explanation. Stay tuned
for a detailed message about the innovations of 2.2.

First, the 11 new reserved words:

	Accept
	BITS
	DOUBLE
	expanded
	implies
	infix
	inspect
	obsolete
	prefix
	unique
	xor

	These may no longer be used as identifiers. A clear message will be
produced if they are.

Now for the grammar itself:

-------------------  SYNTAX OF EIFFEL, VERSION 2.2  --------------------

Copyright (C) Interactive Software Engineering Inc., 1989

Note: Eiffel is a trademark of Interactive Software Engineering Inc.


                Class_declaration   =   Class_header
                                        [Formal_generics]
                                        [Exports]
                                        [Inheritance]
                                        [Features]
                                        [Invariant]
                                        end ["--" class Class_name]


                     Class_header   =   [Class_mark] class Class_name
                       Class_mark   =   deferred | expanded
                       Class_name   =   Identifier


                  Formal_generics   =   "[" Formal_generic_list "]"
              Formal_generic_list   =   {Formal_generic ","...}
                   Formal_generic   =   Formal_generic_name [Constraint]
              Formal_generic_name   =   Identifier
                       Constraint   =   "->" Class_type


                          Exports   =   export Export_list
                      Export_list   =   {Export_item "," ...}
                      Export_item   =   Exported_feature | Ancestor_exports
                 Exported_feature   =   Feature_name [Restriction]
                      Restriction   =   "{" Class_list "}"
                       Class_list   =   {Class_name "," ...}
                 Ancestor_exports   =   repeat Class_name


                     Feature_name   =   Feature_identifier | Prefix | Infix
               Feature_identifier   =   Identifier
                           Prefix   =   "prefix" '"' Prefix_operator '"'
                            Infix   =   "infix" '"' Infix_operator '"'
                  Prefix_operator   =   Unary
                   Infix_operator   =   Binary | Multiary
                            Unary   =   not | "+" | "-"
                           Binary   =   div | mod | "^" | "<" | ">" | "<=" | ">="
                         Multiary   =   "+" | "-" | "*" | "/" |
                                        and | and then | or | or else | xor | implies


                      Inheritance   =   inherit Parent_list
                      Parent_list   =   {Parent ";" ...}
                           Parent   =   Class_type
                                        [Renamed]
                                        [Redefined]


                       Class_type   =   Bit_size | Defined_class
                         Bit_size   =   BITS Integer
                    Defined_class   =   Class_name [Actual_generics]
                  Actual_generics   =   "[" Type_list "]"
                        Type_list   =   {Type "," ...}
                             Type   =   Class_type | Formal_generic_name  | Association
                      Association   =   like Anchor
                           Anchor   =   Feature_identifier | Current


                          Renamed   =   rename Rename_list
                      Rename_list   =   {Rename_pair "," ...}
                      Rename_pair   =   Feature_name as Feature_name


                        Redefined   =   redefine Feature_list
                     Feature_list   =   {Feature_name "," ...}


                         Features   =   feature {Feature_declaration ";" ...}
              Feature_declaration   =   Feature_list Declaration_body
                 Declaration_body       [Formal_arguments]
                                        [Type_mark]
                                        [Feature_value_mark]


                     Formal_arguments   =   "(" Entity_declaration_list ")"
              Entity_declaration_list   =   {Entity_declaration_group ";" ...}
             Entity_declaration_group   =   {Identifier "," ...}+ Type_mark
                            Type_mark   =   ":" Type


               Feature_value_mark   =   [Obsolete_mark] is Constant_or_routine
                    Obsolete_mark   =   obsolete Message
                          Message   =   String_constant
              Constant_or_routine   =   Manifest_constant | Unique | Routine
                Manifest_constant   =   Integer_constant | Character_constant |
                                        Boolean_constant | Real_constant | String_constant
                             Sign   =   "+" | "-"
                 Integer_constant   =   [Sign] Integer
               Character_constant   =   "'" Character "'"
                 Boolean_constant   =   true | false
                    Real_constant   =   [Sign] Real
                  String_constant   =   '"' String '"'


                           Unique   =   unique


                          Routine   =   [Precondition]
                                        [Externals]
                                        [Local_entities]
                                        Body
                                        [Postcondition]
                                        [Rescue]
                                        end ["--" Feature_name]


                           Precondition   =   require Assertion
                          Postcondition   =   ensure Assertion
                              Assertion   =   {Assertion_clause ";" ...}
                       Assertion_clause   =   [Tag_mark] Unlabeled_assertion_clause
                               Tag_mark   =   Tag ":"
                                    Tag   =   Identifier
             Unlabeled_assertion_clause   =   Boolean_expression | Comment
                     Boolean_expression   =   Expression
                                Comment   =   "--" String


                        Externals   =   external External_list
                    External_list   =   {External_declaration ";" ...}
             External_declaration   =   Feature_name [Formal_arguments] [Type_mark]
                                        [External_name] Language
                         Language   =   language String_constant
                    External_name   =   name String_constant


                   Local_entities   =   Entity_declaration_list

                             Body   =   Explicit_body | Deferred_mark
                    Explicit_body   =   Body_mark Compound
                        Body_mark   =   do | once
                         Compound   =   {Instruction ";" ...}


                      Instruction   =   Call | Assignment | Conditional | Multi_branch |
                                        Loop | Check | Retry | Debug


                             Call   =   [Qualifier] Unqualified_call
                        Qualifier   =   {Unqualified_expression "." ...}+ "."
                 Unqualified_call   =   Feature_identifier [Actuals]
                          Actuals   =   "(" Actual_list ")"
                      Actual_list   =   {Actual Separator ...}
                           Actual   =   Expression | Address
                          Address   =   "@" Feature_identifier
                        Separator   =   "," | ";"


                       Assignment   =   Entity ":=" Expression
                           Entity   =   Identifier | Result


                         Expression   =   [Qualifier] Unqualified_expression
             Unqualified_expression   =   Constant | Entity | Unqualified_call | Current |
                                          Old_value | Nochange | Operator_expression
                          Old_value   =   old Expression
                           Nochange   =   nochange


                         Constant   =   Manifest_constant | Constant_attribute
               Constant_attribute   =   Identifier


              Operator_expression   =   Parenthesized | Unary_expression |
                                        Binary_expression | Multiary_expression
                    Parenthesized   =   "(" Expression ")"
                 Unary_expression   =   Unary Expression
                Binary_expression   =   Expression Binary_or_equality Expression
               Binary_or_equality   =   Binary | Equality
                         Equality   =   "=" | "/="
              Multiary_expression   =   {Expression Multiary ...}+


                      Conditional   =   if Then_part_list [Else_part] end
                   Then_part_list   =   {Then_part elsif ...}+
                        Then_part   =   Boolean_expression then Compound
                        Else_part   =   else Compound

                     Multi_branch   =   inspect Expression [When_part_list] [Else_part] end
                   When_part_list   =   when {When_part when ...}+
                        When_part   =   Values then Compound
                           Values   =   Constant_list | Interval
                    Constant_list   =   {Constant "," ...}+
                         Interval   =   Integer_interval | Character_interval
                 Integer_interval   =   Integer_constant ".." Integer_constant
               Character_interval   =   Character_constant ".." Character_constant


                             Loop   =   Initialization
                                        [Invariant]
                                        [Variant]
                                        Exit
                                        Loop_body
                                        end


                   Initialization   =   from Compound
                        Invariant   =   invariant Assertion
                          Variant   =   variant [Tag_mark] Integer_expression
               Integer_expression   =   Expression
                             Exit   =   until Boolean_expression
                        Loop_body   =   loop Compound


                            Check   =   check Assertion end


                            Retry   =   retry


                            Debug   =   debug Compound end


                           Rescue   =   rescue Compound
-- 

-- Bertrand Meyer
bertrand@eiffel.com