Eiffel programming language syntax
The syntax specification shown here is a less complete and less formal version of that which is in the Eiffel ISO/ECMA standard document. The format is BNF-E. The Language Specification section of the standard document includes an overview of BNF-E.
There are a few parts of the syntax that are either non-production or non-representable in BNF-E. Some of these have been omitted from the following specification. These omitted parts of the syntax definition add to the precision of the specification, but knowledge of them is not always vital for developers.
In the BNF-E representation, generally non-terminals which are defined in the same group of productions in which they are used are not linked. However when a non-terminal is defined outside a group in which it is used, it is linked to the group in which it is defined.
- Contents
- Eiffel non-production elements
- Eiffel BNF-E Syntax
- Class names
- Class declarations
- Notes
- Class headers
- Obsolete marks
- Feature parts
- Feature declarations
- New feature lists
- Feature bodies
- Feature names
- Operators
- Assigner marks
- Inheritance parts
- Rename clauses
- Clients
- Export adaptation
- Formal argument and entity declarations
- Routine bodies
- Local variable declarations
- Instructions
- Assertions
- "Old" postcondition expressions
- "Only" postcondition clauses
- Check instructions
- Variants
- Precursor
- Redefinition
- Undefine clauses
- Types
- Actual generic parameters
- Formal generic parameters
- Generic constraints
- Manifest arrays
- Tuple types
- Manifest tuples
- Converter clauses
- Select clauses
- Conditionals
- Multi-branch instructions
- Loops
- Debug instructions
- Attribute bodies
- Entities and variables
- Creators parts
- Creation instructions
- Creation expressions
- Equality expressions
- Assignments
- Assigner calls
- Feature calls
- Actual arguments
- Object test
- Rescue clauses
- Agents
- Call agent bodies
- Expressions
- Operator expressions
- Bracket expressions
- Constants
- Manifest constants
- Manifest strings
- External routines
- Registered languages
- External signatures
- External file use
- C externals
- C++ externals
- DLL externals
- Comments
- Integers
The following section contains those non-production elements of the specification that are used later in the BNF-E specification.
Eiffel non-production elements
Identifiers
An identifier is a sequence of one or more alphanumeric characters of which the first is a letter.
The definition is augmented by the rule that Identifiers are not valid if they are the same as one of the language's reserved words.
Characters
Characters are either:
- All 32-bit, corresponding to Unicode and to the Eiffel type CHARACTER_32.
- All 8-bit, corresponding to 8-bit extended ASCII and to the Eiffel type CHARACTER_8
Reals
A real -- specimen of Real -- is made of the following elements, in the order given:
- An optional decimal Integer, giving the integral part.
- A required "." (dot).
- An optional decimal Integer, giving the fractional part.
- An optional exponent, which is the letter e or E followed by an optional Sign and a decimal Integer.
No intervening character (blank or otherwise) is permitted between these elements. The integral and fractional parts may not both be absent.
Strings
A string -- specimen of construct String -- is a sequence of zero or more manifest characters.
Simple strings
A simple string -- specimen of Simple_string -- is a String consisting of at most one line (that is to say, containing no embedded new-line manifest character), possibly containing codes for special characters.
Special characters
Character | Code | Mnemonic name |
---|---|---|
@ | %A | At-sign |
BS | %B | Backspace |
^ | %C | Circumflex |
$ | %D | Dollar |
FF | %F | Form feed |
\ | %H | Backslash |
~ | %L | Tilde |
NL (LF) | %N | Newline |
` | %Q | Backquote |
CR | %R | Carriage return |
# | %S | Sharp |
HT | %T | Horizontal tab |
NUL | %U | Null |
| | %V | Vertical bar |
% | %% | Percent |
' | %' | Single quote |
" | %" | Double quote |
[ | %( | Opening bracket |
] | %) | Closing bracket |
{ | %< | Opening brace |
} | %> | Closing brace |
-
%/123/
represents the character with decimal code123
. - And only for manifest character (for now)
-
'%/0x2200/'
represents the character with hexadecimal code U+2200 = '∀' (note'%/0x2200/' = '%/8704/'
) -
'%/0c21000/'
in octal -
'%/0b10001000000000/'
in binary
-
Line wrapping parts
A sequence of characters consisting of the following, in order:
- % (percent character)
- Zero or more blanks or tabs
- New line (Line feed)
- Zero or more blanks or tabs
- % (percent character)
Line wrapping parts are used as separators between one Simple_string and the next in a Basic_manifest_string so that the string can be split across lines.
New line
A specimen of New_line is a New Line.
Eiffel BNF-E Syntax
Class names
Class_name ::= Identifier
Class declarations
Class_declaration ::= [Notes] Class_header [Formal_generics]
[Obsolete]
[Creators]
[Features]
[Notes]
[Notes]
end
Notes
Notes ::= note
Note_list
Note_list ::= {Note_entry ";" ...}*
Note_entry ::= Note_name Note_values
Note_name ::= Identifier ":"
Note_values ::= {Note_item ","...}+
Note_item ::= Identifier | Manifest_constant
Class headers
Class_header ::= [Header_mark] class
Class_name
Header_mark ::= deferred
| expanded
| frozen
Obsolete marks
Obsolete ::= obsolete
Message
Message ::= Manifest_string
Feature parts
Features ::= Feature_clause+
Feature_clause ::= feature
[Clients] [Header_comment] Feature_declaration_list
Feature_declaration_list ::= {Feature_declaration ";" ...}*
Header_comment ::= Comment
Feature declarations
Feature_declaration ::= New_feature_list Declaration_body
Declaration_body ::= [Formal_arguments] [Query_mark] [Feature_value]
Query_mark ::= Type_mark [Assigner_mark]
Type_mark ::= ":" Type
Feature_value ::= [Explicit_value] [Obsolete] [Header_comment] [Attribute_or_routine]
Explicit_value ::= "=" Manifest_constant
New feature lists
New_feature_list ::= {New_feature "," ...}+
New_feature ::= [frozen
] Extended_feature_name
Feature bodies
Attribute_or_routine ::= [Precondition] [Local_declarations] Feature_body [Postcondition] [Rescue] end
Feature_body ::= Deferred | Effective_routine | Attribute
Feature names
Extended_feature_name ::= Feature_name [Alias]
Feature_name ::= Identifier
Alias ::= alias
'"' Alias_name '"' [convert
]
Alias_name ::= Operator | Bracket
Bracket ::= "[ ]"
Operators
Operator ::= Unary | Binary
Unary ::= not
| "+" | "-" | Free_unary
Binary ::= "+" | "-" | "*" | "/" | "//" | "\\" | "^" | ".." | "<" | ">" | "<=" | ">=" | and
| or
| xor
| and
then
| or
else
| implies
| Free_binary
Assigner marks
Assigner_mark ::= assign
Feature_name
Inheritance parts
Inheritance ::= Inherit_clause+
Inherit_clause ::= inherit
[Non_conformance] Parent_list
Non_conformance ::= "{" NONE "}"
Parent_list ::= {Parent ";" ...}+
Parent ::= Class_type [Feature_adaptation]
Feature_adaptation ::= [Undefine] [Redefine] [Rename] [New_exports] [Select] end
Rename clauses
Rename ::= rename
Rename_list
Rename_list ::= {Rename_pair "," ...}+
Rename_pair ::= Feature_name as
Extended_feature_name
Clients
Clients ::= "{" Class_list "}"
Class_list ::= {Class_name "," ...}+
Export adaptation
New_exports ::= export
New_export_list
New_export_list ::= {New_export_item ";" ...}+
New_export_item ::= Clients [Header_comment] Feature_set
Feature_set ::= Feature_list | all
Feature_list ::= {Feature_name "," ...}+
Formal argument and entity declarations
Formal_arguments ::= "(" Entity_declaration_list ")"
Entity_declaration_list ::= {Entity_declaration_group ";" ...}+
Entity_declaration_group ::= Identifier_list Type_mark
Identifier_list ::= {Identifier "," ...}+
Routine bodies
Deferred ::= deferred
Effective_routine ::= Internal | External
Internal ::= Routine_mark Compound
Routine_mark ::= do
| Once
Once ::= once
[ "("Key_list ")" ]
Key_list ::= {Manifest_string "," ...}+
Local variable declarations
Local_declarations ::= local
[Entity_declaration_list]
Instructions
Compound ::= {Instruction ";" ...}*
Instruction ::= Creation_instruction | Call | Assignment | Assigner_call | Conditional | Multi_branch | Loop | Debug | Precursor | Check | Retry
Assertions
Precondition ::= require
[else
] Assertion
Postcondition ::= ensure
[then
] Assertion [Only]
Invariant ::= invariant
Assertion
Assertion ::= {Assertion_clause ";" ...}*
Assertion_clause ::= [Tag_mark] Unlabeled_assertion_clause
Unlabeled_assertion_clause ::= Boolean_expression | Comment | class
Tag_mark ::= Tag ":"
Tag ::= Identifier
"Old" postcondition expressions
Old ::= old
Expression
"Only" postcondition clauses
Only ::= only
[Feature_list]
Check instructions
Check ::= check
Assertion [Notes] end
Variants
Variant ::= variant
[Tag_mark] Expression
Precursor
Precursor ::= Precursor
[Parent_qualification] [Actuals]
Parent_qualification ::= "{" Class_name "}"
Redefinition
Redefine ::= redefine
Feature_list
Undefine clauses
Undefine ::= undefine
Feature_list
Types
Type ::= Class_or_tuple_type | Formal_generic_name | Anchored
Class_or_tuple_type ::= Class_type | Tuple_type
Class_type ::= [Attachment_mark] Class_name [Actual_generics]
Attachment_mark ::= "?" | "!"
Anchored ::= [Attachment_mark] like
Anchor
Anchor ::= Feature_name | Current
Actual generic parameters
Actual_generics ::= "[" Type_list "]"
Type_list ::= {Type "," ...}+
Formal generic parameters
Formal_generics ::= "[" Formal_generic_list "]"
Formal_generic_list ::= {Formal_generic ","...}+
Formal_generic ::= [frozen
] Formal_generic_name [Constraint]
Formal_generic_name ::= [?] Identifier
Generic constraints
Constraint ::= "->" Constraining_types [Constraint_creators]
Constraining_types ::= Single_constraint | Multiple_constraint
Single_constraint ::= Type [Renaming]
Renaming ::= Rename end
Multiple_constraint ::= "{" Constraint_list "}"
Constraint_list ::= {Single_constraint "," ...}+
Constraint_creators ::= create
Feature_list end
Manifest arrays
Manifest_array ::= [Manifest_array_type] <<
Expression_list >>
Manifest_array_type ::= {
Type }
Expression_list ::= {Expression ,
...}*
Tuple types
Tuple_type ::= TUPLE
[Tuple_parameter_list]
Tuple_parameter_list ::= "[" Tuple_parameters "]"
Tuple_parameters ::= Type_list | Entity_declaration_list
Manifest tuples
Manifest_tuple ::= "[" Expression_list "]"
Converter clauses
Converters ::= convert
Converter_list
Converter_list ::= {Converter ","...}+
Converter ::= Conversion_procedure | Conversion_query
Conversion_procedure ::= Feature_name "(" "{" Type_list "}" ")"
Conversion_query ::= Feature_name ":" "{" Type_list "}"
Select clauses
Select ::= select
Feature_list
Conditionals
Conditional ::= if
Then_part_list [Else_part] end
Then_part_list ::= {Then_part elseif
...}+
Then_part ::= Boolean_expression then
Compound
Else_part ::= else
Compound
Conditional_expression ::= if
Then_part_expression_list else
Expression end
Then_part_expression_list ::= {Then_part_expression elseif
...}+
Then_part_expression ::= Boolean_expression then
Expression
Multi-branch instructions
Multi_branch ::= inspect
Expression [When_part_list] [Else_part] end
When_part_list ::= When_part+
When_part ::= when
Choices then
Compound
Choices ::= {Choice "," ...}+
Choice ::= Constant | Manifest_type | Constant_interval | Type_interval
Constant_interval ::= Constant ".." Constant
Type_interval ::= Manifest_type ".." Manifest_type
Loops
Loop ::=
[Iteration]
[Initialization]
[Invariant]
[Exit_condition]
Loop_body
[Variant]
end
Iteration ::= across
Expression as
Identifier
Initialization ::= from
Compound
Exit_condition ::= until
Boolean_expression
Loop_body ::=
loop
Compound |
all
Boolean_expression |
some
Boolean_expression
Debug instructions
Debug ::= debug
[ "("Key_list ")" ] Compound end
Attribute bodies
Attribute ::= attribute
Compound
Entities and variables
Entity ::= Variable | Read_only
Variable ::= Variable_attribute | Local
Variable_attribute ::= Feature_name
Local ::= Identifier | Result
Read_only ::= Formal | Constant_attribute | Current
Formal ::= Identifier
Constant_attribute ::= Feature_name
Creators parts
Creators ::= Creation_clause+
Creation_clause ::= create
[Clients] [Header_comment] Creation_procedure_list
Creation_procedure_list ::= {Creation_procedure ","...}+
Creation_procedure ::= Feature_name
Creation instructions
Creation_instruction ::= create
[Explicit_creation_type] Creation_call
Explicit_creation_type ::= "{" Type "}"
Creation_call ::= Variable [Explicit_creation_call]
Explicit_creation_call ::= "." Unqualified_call
Creation expressions
Creation_expression ::= create
Explicit_creation_type [Explicit_creation_call]
Equality expressions
Equality ::= Expression Comparison Expression
Comparison ::= "=" | "/=" | "~" | "/~"
Assignments
Assignment ::= Variable ":=" Expression
Assigner calls
Assigner_call ::= Expression ":=" Expression
Feature calls
Call ::= Object_call | Non_object_call
Object_call ::= [Target "."] Unqualified_call
Unqualified_call ::= Feature_name [Actuals]
Target ::= Local | Read_only | Call | Parenthesized_target
Parenthesized_target ::= (
Expression )
Non_object_call ::= "{" Type "}" "." Unqualified_call
Actual arguments
Actuals ::= "(" Actual_list ")"
Actual_list ::= {Expression "," ...}+
Object test
Object_test ::= "{" Identifier ":" Type "}" Expression
Rescue clauses
Rescue ::= rescue
Compound
Retry ::= retry
Agents
Agent ::= Call_agent | Inline_agent
Call_agent ::= agent
Call_agent_body
Inline_agent ::= agent
[Formal_arguments] [Type_mark] [Attribute_or_routine] [Agent_actuals]
Call agent bodies
Call_agent_body ::= Agent_qualified | Agent_unqualified
Agent_qualified ::= Agent_target ". " Agent_unqualified
Agent_unqualified ::= Feature_name [Agent_actuals]
Agent_target ::= Entity | Parenthesized | Manifest_type
Agent_actuals ::= "(" Agent_actual_list ")"
Agent_actual_list ::= {Agent_actual "," ...}+
Agent_actual ::= Expression | Placeholder
Placeholder ::= [Manifest_type] "?"
Expressions
Expression ::= Basic_expression | Special_expression
Basic_expression ::= Read_only | Local | Call | Precursor | Equality | Parenthesized | Old | Operator_expression | Bracket_expression | Creation_expression | Conditional_expression
Special_expression ::= Manifest_constant | Manifest_array | Manifest_tuple | Agent | Object_test | Once_string | Address
Parenthesized ::= "(" Expression ")"
Address ::= "$" Variable
Once_string ::= once
Manifest_string
Boolean_expression ::= Basic_expression | Boolean_constant | Object_test
Operator expressions
Operator_expression ::= Unary_expression | Binary_expression
Unary_expression ::= Unary Expression
Binary_expression ::= Expression Binary Expression
Bracket expressions
Bracket_expression ::= Bracket_target "[" [[#Actual arguments|Actuals]] "]"
Bracket_target ::= Target | Once_string | Manifest_constant | Manifest_tuple
Constants
Constant ::= Manifest_constant | Constant_attribute
Constant_attribute ::= Feature_name
Manifest constants
Manifest_constant ::= [Manifest_type] Manifest_value
Manifest_type ::= "{" Type "}"
Manifest_value ::= Boolean_constant | Character_constant | Integer_constant | Real_constant | Manifest_string | Manifest_type
Sign ::= "+" | "-"
Integer_constant ::= [Sign] Integer
Character_constant ::= " ' " Character " ' "
Boolean_constant ::= True
| False
Real_constant ::= [Sign] Real
Manifest strings
Manifest_string ::= Basic_manifest_string | Verbatim_string
Basic_manifest_string ::= ' " ' String_content ' " '
String_content ::= {Simple_string Line_wrapping_part ...}+
Verbatim_string ::= Verbatim_string_opener Line_sequence Verbatim_string_closer
Verbatim_string_opener ::= ' " ' [Simple_string] Open_bracket
Verbatim_string_closer ::= Close_bracket [Simple_string] ' " '
Open_bracket ::= "[" | "{"
Close_bracket ::= "]" | "}"
Line_sequence ::= {Simple_string New_line ...}+
External routines
External ::= external
External_language [External_name]
External_language ::= Unregistered_language | Registered_language
Unregistered_language ::= Manifest_string
External_name ::= alias
Manifest_string
Registered languages
Registered_language ::= C_external | C++_external | DLL_external
External signatures
External_signature ::= signature
[External_argument_types] [: External_type]
External_argument_types ::= "(" External_type_list ")"
External_type_list ::= {External_type "," ...}*
External_type ::= Simple_string
External file use
External_file_use ::= use
External_file_list
External_file_list ::= {External_file "," ... }+
External_file ::= External_user_file | External_system_file
External_user_file ::= ' " ' Simple_string ' " '
External_system_file ::= "<" Simple_string ">"
C externals
C_external ::= ' " ' C
[inline
] [ External_signature ] [ External_file_use ] ' " '
C++ externals
C++_external ::= ' " ' C++
inline
[ External_signature ] [ External_file_use ] ' " '
DLL externals
DLL_external ::= ' " ' dll
[windows
] DLL_identifier [DLL_index] [[ External_signature ] [ External_file_use ] ' " '
DLL_identifier ::= Simple_string
DLL_index ::= Integer
Comments
Comment ::= "- -" {Simple_string Comment_break ...}*
Comment_break ::= New_line [Blanks_or_tabs] "- -"
Integers
Integer ::= [Integer_base] Digit_sequence
Integer_base ::= "0" Integer_base_letter
Integer_base_letter ::= "b" | "c" | "x" | "B" | "C" | "X"
Digit_sequence ::= Digit+
Digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" | "_"