Original:http://www.gobosoft.com/eiffel/syntax/index.html

Ейфель: Синтаксис

Описаний тут анотований Ейфелевий синтаксис спрямований на розробників Ейфелевих інструментів, таких як компілятори, інтерпретатори, перевірки синтаксису, короткі та плоскі інструменти, симпатичні принтери тощо, які хочуть скористатися деякими порадами та підказками. Хоча це не офіційна специфікація Ейфелевого синтаксису, що надається Некомерційним міжнародним консорціумом для Ейфеля (NICE), він відходить від нього лише у двох або трьох добре задокументованих випадках. Зокрема, він пояснює, де, а іноді і чому, існуючі компілятори розширили Ейфелева синтаксис.

Конструкції синтаксису Ейфеля перераховані в групи, починаючи з конструкцій високого рівня, таких як Class_declaration, аж до лексичних компонентів, таких як Identifier. Альтернативно, ці конструкції також подаються в алфавітному порядку. Позначення, використовувані для опису Ейфелевого синтаксису, вказані в іншому місці. Можлива реалізація синтаксису Ейфелева в форматі yacc - і lex також подана в якості прикладу.

Ця сторінка також доступна японською (переклад Iizuka Tomio), сербо-хорватською (переклала Йована Мілутінович з WebHostingGeeks.com), португальською (переклала Артур Вебер для домашньої), іспанською (переклала Лера Домартіна) та Угорська (у перекладі Szabolcs Csintalan).


Class_declaration
[ Indexing ]
Class_header
[ Formal_generics ]
[ Obsolete ]
[ Inheritance ]
[ Creators ]
[ Features ]
[ Invariant ]
end [ -- class Class_name ]

Примітка : Більшість компіляторів Ейфеля не перевіряють дійсність необов'язкового коментаря після закінчення ключового слова . SmallEiffel, однак, видає попередження.

Примітка. Файл може містити більше однієї декларації класу. Однак більшість компіляторів Ейфеля мають обмеження на один клас на файл.


Indexing
indexing Index_list
Index_list
{ Index_clause ; ... }
Index_clause
[ Index ] Index_terms
Index
Identifier :
Index_terms
{ Index_value , ... }+
Index_value
Identifier | Manifest_constant

Class_header
[ Header_mark ] class Class_name
Header_mark
deferred | expanded | separate

Примітка. Окреме ключове слово не є частиною Ейфелевого стандарту. Він був введений в ISE Eiffel для підтримки механізму SCOOP . Докладніше читайте в " Об'єктно-орієнтованому програмному забезпечення" , друге видання

Class_name
Identifier

Formal_generics
[ Formal_generic_list ]
Formal_generic_list
{ Formal_generic ,... }

Примітка. Список офіційних дженериків може бути порожнім. Як наслідок, FOO [] є дійсним і означає те саме, що і FOO . Однак це не рекомендований стиль.

Formal_generic
Formal_generic_name [ Constraint ]
Formal_generic_name
Identifier
Constraint
-> Class_type

Obsolete
obsolete Message
Message
Manifest_string

Inheritance
inherit Parent_list
Parent_list
{ Parent ; ... }
Parent
Class_type [ Feature_adaptation ]
Feature_adaptation
[ Rename ]
[ New_exports ]
[ Undefine ]
[ Redefine ]
[ Select ]
end

Примітка : Через цю конструкцію Ейфелева граматика не є LR (1) . Це відбувається в такій ситуації:

class FOO
inherit
    BAR
end

Кінець ключового слова буде розглянуто як частину необов’язкового_призначення Feature_adaptation замість як частина конструкції Class_declaration .

Способом вирішити цю проблему було б дозволити закінчення ключового слова в Feature_adaptation лише тоді, коли хоча б одна з необов'язкових конструкцій, що складають Feature_adaptation присутній.


Rename
rename Rename_list
Rename_list
{ Rename_pair , ... }
Rename_pair
Feature_name as Feature_name

New_exports
export New_export_list
New_export_list
{ New_export_item ; ... }
New_export_item
Clients Feature_set
Feature_set
Feature_list | all
Feature_list
{ Feature_name , ... }

Clients
{ Class_list }
Class_list
{ Class_name , ... }

Redefine
redefine Feature_list
Undefine
undefine Feature_list
Select
select Feature_list

Creators
creation { Creation_clause creation ... }+
Creation_clause
[ Clients ] [ Header_comment ] Procedure_list

Примітка. Стандартний синтаксис вимагає списку Feature_list замість List_list, але в Creation_clause фактично перелічені назви процедур створення (див. Правило дійсності VGCP-2 ).

Procedure_list
{ Procedure_name , ... }
Procedure_name
Identifier

Примітка : Префікс і Infix - це назви функцій, а не назви процедур. Мені незрозуміло, чи може префікс бути іменем атрибута, але це точно не ім'я процедури (див. Правило дійсності VFFD-5 ).


Features
feature { Feature_clause feature ... }+
Feature_clause
[ Clients ] [ Header_comment ] Feature_declaration_list
Feature_declaration_list
{ Feature_declaration ; ... }

Feature_declaration
New_feature_list Declaration_body
Declaration_body
[ Formal_arguments ] [ Type_mark ] [ Constant_or_routine ]
Constant_or_routine
is Feature_value
Feature_value
Manifest_constant | Unique | Routine
Unique
Unique

New_feature_list
{ Нова_дія , ...} +
Нова_дія
[ заморожений ] Feature_name

New_feature_list
{ New_feature , ... }+
New_feature
[ frozen ] Feature_name

Примітка : Усі компілятори Ейфеля приймають оператори префікса та інфіксації незалежно від регістру букв, наприклад приставка "НЕ" або інфікс "AnD" .

Примітка : жоден втручається символ не допускається після першої або перед останньою подвійною цитатою Однак незрозуміло, яку саме перерву слід використовувати між двома ключовими словами в і потім або або ще . SmallEiffel приймає будь-яку кількість пробілів та символів вкладок, тоді як для інших компіляторів потрібен один порожній.


Unary
not | + | -
Binary
+ | - | * | / | < | > | <= | >= | // | \\ | ^ |
and | or | xor | and then | or else | implies

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

Примітка. Список декларацій суб'єктів може бути порожнім. Як наслідок, foo () є дійсним і означає те саме, що і foo . Однак це стиль не рекомендується.


Routine
[ Obsolete ]
[
Header_comment ]
[
Precondition ]
[
Local_declarations ]
Routine_body
[ Postcondition ]
[
Rescue ]
end [ -- Feature_name ]

Примітка : Більшість компіляторів Ейфеля не перевіряють дійсність необов'язкового коментаря після закінчення ключового слова . Цей коментар більше не вказує на стильові рекомендації.


Routine_body
Effective | Deferred
Effective
Internal | External
Internal
Routine_mark Compound
Routine_mark
do | once
Deferred
deferred

External
external Language_name [ External_name ]
Language_name
Manifest_string
External_name
alias Manifest_string

Примітка : Кожен компілятор Ейфеля підтримує власний міні-синтаксис у назві мови та зовнішніх рядках імен для опису їх інтерфейсу з іншими мовами програмування. Докладніше див. Документацію, яка постачається з різними компіляторами.


Local_declarations
local Entity_declaration_list

Precondition
require [ else ] Assertion
Postcondition
ensure [ then ] Assertion
Invariant
invariant Assertion
Assertion
{ Assertion_clause ; ... }
Assertion_clause
[ Tag_mark ] Unlabeled_assertion_clause
Unlabeled_assertion_clause
Boolean_expression | Comment
Tag_mark
Tag :
Tag
Identifier

Примітка . Хоча такі коментарі, як коментарі до заголовків, очікуються в деяких конструкціях, таких як " Рутинний" або " Особливості" , це єдине місце, де ігнорування коментаря призводить до помилки синтаксису або неправильного дерева синтаксису. Це відбувається в таких ситуаціях:

require
    tag: -- Syntax error when ignored!
do

і

require
    tag: -- If this comment is ignored,
         -- tag will be erroneously
         -- associated with foo.is_valid!
    foo.is_valid

Дивіться другу примітку в коментарі для більш детальної інформації


Rescue
rescue Compound

Примітка : Правило дійсності VXRT вказує, що інструкція Повторити повторно діє лише в рятувальному пункті. Зрештою, це може бути застосовано синтаксисом.


Type
Class_type |
Class_type_expanded |
Class_type_separate |
Anchored | Bit_type

Примітка : У стандартному синтаксисі Ейфеля також вказано Formal_generic_name як можливу альтернативу типу . Однак вона внесла неоднозначність у синтаксис, оскільки ідентифікатор може бути розпізнаний як Formal_generic_name, так і Class_type без фактичних дженериків.

Class_type
Class_name [ Actual_generics ]
Actual_generics
[ Type_list ]
Type_list
{ Type , ... }

Примітка. Список типів може бути порожнім. Як наслідок, FOO [] є дійсним і означає те саме, що і FOO . Однак це не рекомендований стиль.

Class_type_expanded
expanded Class_type
Class_type_separate
separate Class_type

Примітка : Class_type_separate не є частиною Ейфелевого стандарту. Він був введений в ISE Eiffel для підтримки механізму SCOOP . Докладніше читайте в " Об'єктно-орієнтованому програмному забезпеченні" , друге видання.

Bit_type
BIT Bit_length

Примітка . У стандартному синтаксисі з’являється Constant замість довжини Bit_length. Однак правило дійсності VTBT стверджує, що декларація Bit_type є дійсною лише тоді, коли її Константа має тип INTEGER , а це означає, що константа є або явною цілою постійною чи постійною ознакою.

Bit_length
Integer_constant | Attribute
Anchored
like Anchor
Anchor
Identifier | Current

Compound
{ Instruction ; ... }
Instruction
Creation | Call | Assignment |
Assignment_attempt | Conditional |
Multi_branch | Loop | Debug |
Check | Retry | Null_instruction

Creation
! [ Type ] ! Writable [ Creation_call ]

Примітка : Якщо тип відсутній, два знаки оклику можуть бути написані з перервою або без втручання. У стандартному стилі рекомендованою формою є та без перерв, яка робить !! постають як єдиний лексичний символ.

Creation_call
. Procedure_name [ Actuals ]

Примітка . У стандартному синтаксисі Ейфеля Creation_call складається з виклику Unqulified_call. Але правило дійсності VGCC-6 зазначає, що якщо f є особливістю Creation_call , f це процедура.


Assignment
Writable := Expression
Assignment_attempt
Writable ?= Expression

Conditional
if Then_part_list [ Else_part ] end
Then_part_list
{ Then_part elseif ... }+
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
Choices then Compound
Choices
{ Choice , ... }

Примітка . Список варіантів може бути порожнім. Як наслідок,

inspect expr
when then
    do_something
...

хоча безглуздий, але синтаксично правильний. Це можна думати як

if False then
    do_something
...

Однак це не є частиною рекомендованого стилю.

Choice
Choice_constant | Interval

Примітка : Стандартний синтаксис визначає Констант замість Choice_constant. Однак правило дійсності VOMB-1-2 стверджує, що константа у виборі та інтервалі лише типу INTEGER або CHARACTER.

Interval
Choice_constant .. Choice_constant

Примітка. Лексичний аналізатор повинен бути досить розумним у наступному прикладі:

inspect expr
when 1..2 then
...

Дійсно, " 1..2 " слід визнати двома цілими константами " 1 " і " 2 ", розділеними символом Ейфеля " .. ", а не двома послідовними реальними константами " 1. " і " .2 ". Visual Eiffel помилково видає синтаксичну помилку під час розбору наведеного вище прикладу.

Choice_constant
Integer_constant | Character_constant | Attribute

Примітка : TowerEiffel приймає "віддалену константу" у виборі та інтервалі , наприклад у:

foo: FOO
inspect i
when foo.const then
     do_something
end

де const оголошується постійним у класі FOO. Це не стандартний Ейфелевий синтаксис.


Loop
Initialization
[ Invariant ]
[ Variant ]
Loop_body
end
Initialization
from Compound
Variant
variant [ Tag_mark ] Expression

Примітка : Правило дійсності VAVE зазначає, що вираз повинен бути типу INTEGER . Зрештою, це може бути частково застосовано в синтаксисі, відкинувши рівність , Manifest_array , Strip та всі не цілі числа Manifest_constant s.

Loop_body
Exit loop Compound
Exit
until Boolean_expression

Debug
debug [ Debug_keys ] Compound end
Debug_keys
( Debug_key_list )
Debug_key_list
{ Debug_key , ... }
Debug_key
Manifest_string

Check
check Assertion end

Retry
retry

Примітка : Правило дійсності VXRT вказує, що інструкція " Повторити спробу" є дійсною лише в пункті Rescue . Зрештою, це може бути застосовано синтаксисом.


Null_instruction
empty

Примітка . Ця інструкція виконує суто синтаксичну роль: переконайтесь, що додаткові крапки з комою, додані при нагляді на З'єднання , нешкідливі, як у

if c then ; i1;;; i2; else ;; end

TowerEiffel не підтримує додаткові крапки з комою, крім терміналів. Всі інші компілятори працюють, як очікувалося. SmallEiffel видає попередження під час розбору зайвих крапок.


Call
Qualified_call | Precursor
Qualified_call
[ Call_qualifier ] Call_chain
Call_qualifier
Call_target .
Call_target
Parenthesized | Result | Current | Precursor
Call_chain
{ Unqualified_call . ... }+
Unqualified_call
Identifier [ Actuals ]

Примітка . Ця специфікація Call дещо відрізняється від версії, що постачається у стандарті. Однак стандартний синтаксис приймає конструкції, які не відповідають правилам Ейфеля, такі як:

foo.Result
Current (5)

тоді як специфікація, наведена вище, не відповідає.

Примітка . У TowerEiffel функції можна викликати безпосередньо на Manifest_constant без розміщення дужок навколо константи, наприклад у:

str := 'a'.out

що має бути, використовуючи стандартний синтаксис:

str := ('a').out

Однак з Integer_constant існує незначна лексична проблема , оскільки

123.out

визнається як

123. out

'123.' будучи Real_constant . Програміст повинен додати додатковий перерву між цілою константою та крапкою, щоб обійти цю проблему.


Precursor
[ Parent_qualification ] Precursor [ Actuals ]
Parent_qualification
{ Class_name }

Примітка : Конструкція попередника не є частиною стандартного Ейфелевого синтаксису. Він був представлений у другій редакції об'єктно-орієнтованого програмного забезпечення , і пропозиція щодо його стандартизації надійшла до NICE . ISE Eiffel та Halstenbach, швидше за все, підтримають цю конструкцію у наступному випуску.

Примітка . У другому виданні в " Об'єктно-орієнтованому програмному забезпеченні" ім'я класу в Parent_qualification додається між подвійними дужками: {{ Class_name }}. Однак пропозиція, подана до NICE, використовує синтаксис, зазначений вище.


Attribute
Identifier

Примітка : Відповідно до правила дійсності VFFD-5 , атрибут також може бути префіксом .

Writable
Identifier | Result

Примітка : Група синтаксису Entity зі стандартної специфікації синтаксису дуже спрощена, щоб вирішити багато неясностей. Наприклад, слід:

 
 foo
 

бути визнаним атрибутом , локальним чи формальним ? Лише семантичний аналіз може дати відповідь.


Actuals
( Actual_list )
Actual_list
{ Actual , ... }

Примітка. Список фактичних даних може бути порожнім. Як наслідок, foo () є дійсним і означає те саме, що і foo . Однак це стиль не рекомендується.

Actual
Expression | Address

Примітка : TowerEiffel трактує Address як нормальний вираз (тобто як альтернативу в Expression побудувати). Як наслідок, адресу не потрібно містити лише у фактичних списках.

Address
$ Address_mark
Address_mark
Feature_name | Current | Result

Expression
Current | Result |
Call | Operator_expression |
Equality | Manifest_array |
Old | Strip | Boolean_constant |
Bit_constant | Integer | Real |
Manifest_string | Character_constant |
Wide_character_constant |
Wide_manifest_string |
Hexadecimal_constant

Примітка . Ця специфікація виразу трохи відрізняється від версії, що постачається у стандарті. По-перше, додано поточний та результат як наслідок нової специфікації для виклику . Потім Manifest_constant було замінено списком його альтернатив. Це для усунення неоднозначності в стандартному синтаксисі. У наступному фрагменті коду:

 
 foo : = - 2
 

якщо вираз у правій частині завдання буде визнано цілим константом або як Unary_expression, чий Prefix_operator є ' - ' і чий вираз є цілим (непідписаним) ? Заміна Integer_constant та Real_constant на Integer та Real вирішує проблему.

Примітка : Wide_character_constant , Wide_manifest_string та Hexadecimal_constant не є частиною стандарту. Вони були введені в TowerEiffel для підтримки широких символів, рядкових і шістнадцяткових цілих чисел.

Boolean_expression
Expression

Примітка : Правило дійсності VWBE зазначає, що булевий вираз повинен мати тип BOOLEAN . Зрештою, це може бути частково застосовано в синтаксисі, відкинувши Manifest_array , Strip та всі не булеві Manifest_constant s.


Operator_expression
Parenthesized | Unary_expression | Binary_expression
Parenthesized
( Expression )
Unary_expression
Prefix_operator Expression
Binary_expression
Expression Infix_operator Expression

Примітка : Див. Оператор щодо пріоритетності та асоціативності оператора.


Equality
Expression Comparison Expression
Comparison
= | /=

Примітка : Див. Оператор щодо пріоритетності та асоціативності оператора.


Manifest_constant
Boolean_constant | Character_constant |
Integer_constant | Real_constant |
Manifest_string | Bit_constant |
Wide_character_constant |
Wide_manifest_string |
Hexadecimal_constant

Примітка : Wide_character_constant , Wide_manifest_string та Hexadecimal_constant не є частиною стандарту. Вони були введені в TowerEiffel для підтримки широких символів, рядкових і шістнадцяткових цілих чисел.

Boolean_constant
True | False
Integer_constant
[ Sign ] Integer

Примітка . Тут у стандартному синтаксисі є неоднозначність. У наступному фрагменті коду:

 
 foo : = - 2
 

якщо вираз у правій частині завдання буде визнано цілим константом або як Unary_expression, чий Prefix_operator є ' - ' і чий вираз є цілим (непідписаним) ? Це було вирішено в поточному описі синтаксису шляхом переписання специфікації для Expression .

Real_constant
[ Sign ] Real

Примітка : таку ж неоднозначність, що і для Integer_constant вище.

Sign
+ | -
Wide_character_constant
$ Character_constant

Примітка : Wide_character_constant не є частиною стандарту. Він був представлений в TowerEiffel для підтримки широких персонажів.

Примітка. Між знаком долара та символом_константа не допускається жодного втручається символу .

Wide_manifest_string
$ Manifest_string

Примітка : Wide_manifest_string не є частиною стандарту. Він був введений в TowerEiffel для підтримки широкого характеру в рядках.

Примітка. Між знаком долара та маніфест-ланцюгом не допускається жодного втручального символу .


Manifest_array
<< Expression_list >>
Expression_list
{ Expression , ... }

Old
old Expression

Примітка : Правило дійсності VAOL-1 зазначає, що вираз Old є дійсним лише в Постуслові . Зрештою, це може бути застосовано синтаксисом.


Strip
Strip ( Attribute_list )
Attribute_list
{ Attribute , ... }

Ідентифікатор
Ідентифікатор - це послідовність одного або декількох символів, з яких першою є буква (від a до z та від A до Z), а кожен наступний, якщо такий є, буквою, десятковою цифрою (від 0 до 9) або символ підкреслення (_).
Величина літери не є важливою для літер: два ідентифікатори lInKeD_liST та LINKED_LIST вважаються однаковими.

Примітка . На жаль, SmallEiffel відрізняється від регістру. (Дивно, але для Reserved_word s він не відрізняється від регістру .)

Примітка : Ідентифікатор є дійсним лише тоді, якщо він не є одним із зарезервованих_word s.

Примітка : TowerEiffel не може обробляти суміжні підкреслення в назвах функцій та іменах класів.


Integer
Ціле число - це послідовність символів, кожен з яких повинен бути або:
  1. десяткова цифра (від 0 до 9)
  2. підкреслення (_), яке може бути не першим символом.
Якщо підкреслення присутнє, то праворуч від кожного підкреслення має бути три цифри, і не повинно бути жодної послідовної групи з чотирьох цифр.

Примітка. Останні два обмеження щодо підкреслення можуть бути усунені в майбутньому, дозволяючи групам будь-якої кількості цифр.

Примітка : На відміну від Integer_constant , Integer не має ознаки.

Примітка . Будьте в курсі проблеми з мінімальним цілим значенням! Наприклад, на платформах, де цілі числа зберігаються в 32 бітах, діє наступний Ейфелевий код:

Minimum_integer: INTEGER is - 2_147_483_648
        -- Smallest supported value of type INTEGER

але аналізатор повинен бути досить розумним, інакше він зчитує одинарний мінус, а за ним - ціле число 2147483648, яке не вміщується в 32 біти і, отже, запускає переповнення.


Hexadecimal_constant
Шістнадцяткова константа - це послідовність з двох або більше символів, першим символом яких є десяткова цифра (від 0 до 9), наступні символи яких, але останні, є десятковими цифрами або літерами від a до f або від A до F , а за ними - x або X , без інших персонажів, що втручаються.

Примітка : Hexadecimal_constant не є частиною стандарту. Він був введений у TowerEiffel для підтримки шістнадцяткових цілих чисел.

Примітка : Незрозуміло, чи допускаються підкреслення в шістнадцяткових константах.


Real
Реальне число складається з таких елементів:
  1. необов'язковий цілий номер , що дає інтегральну частину (Якщо ця відсутність, цілісна частина дорівнює 0.)
  2. потрібна точка (.)
  3. необов'язковий цілий номер, записаний назад, який дає дробову частину (якщо вона відсутня, дробова частина дорівнює 0.)
  4. необов'язковий показник, який є літерою e або E, після якої необов'язковий знак (+ або -) і цілий число. Ціле число потрібно, якщо є e або E. Це вказує на те, що значення, яке виникає перед e або E, слід масштабувати на 10 ^ n, де n - задане ціле число.
Між цими елементами не допускається жодного втручального символу (порожнього чи іншого). Цілі та дробові частини можуть бути відсутніми. Якщо підкреслення використовуються в цілісній або дробовій частині, вони також повинні з’являтися в іншій частині, якщо вона має три цифри або менше.

Примітка. Рекомендованим стилем є використання E, а не e.

Примітка : На відміну від Real_constant , Real не має ознак.

Примітка : обмеження, що вказують на те, що цілі та дробові частини можуть бути відсутніми, є лексично важливими. Інакше наступний фрагмент коду

 
 a.e1
 

можна сканувати як

 
 a .e1
 

замість

 
 a  .  e1
 

'.e1' бути визнаним реальним.


Character_constant
Константа символів є або:
  1. символ для друку, за винятком відсотків (%) та однієї цитати (')
  2. спеціальний_характер
укладені в одиничні лапки (').

Примітка : символи для друку містять у цьому випадку пробіли та символи вкладок, але не нові рядки. Порівняйте це з Free_operator .


Manifest_string
Рядок маніфесту - це довільна послідовність:
  1. символи для друку, крім відсотків (%) та подвійних цитат (")
  2. Special_character s
укладений у подвійні лапки (").
Розширена форма дозволяє записати рядок-маніфест у двох чи більше рядках. Кожен рядок, крім останнього, повинен закінчуватися відсотком (%), а кожен рядок, але перший повинен починатися з відсотка (%), можливо, передує пробілам ( ) та символи вкладки.

Примітка : символи для друку містять у цьому випадку пробіли та символи вкладок, але не нові рядки. Порівняйте це з Free_operator .


Bit_constant
Бітова константа - це послідовність цифр 0 або 1 , за якою слідує b або B , без інших символів, що втручаються.

Примітка. Рекомендованим стилем є використання B, а не b.


Free_operator
Вільний оператор - це послідовність одного або декількох символів, першим символом якого є будь-який @ # | & і чиї наступні символи, якщо такі є, можуть бути будь-якими символами для друку. Вибір букви не є важливим для листів у вільних операторів.

Примітка . Символи для друку не містять у цьому випадку символів, дозволених у Break s. Порівняйте це з символом_константа .

Примітка : Наступний код

 
 a @ 1
 

сканується як

 
 a @ 1
 

що не синтаксично правильно. Докладні відомості див. У Ейфелевих готчах .

Примітка : Ейфелева: Мова , друга друк, дозволяє Special_character s (хоча і для друку) у вільних операторах. Жоден Ейфелевий компілятор не підтримує це.

Примітка : SmallEiffel та Visual Eiffel залежать від регістру для вільних операторів.


Comment
Коментар починається з двох тире ( - ) і поширюється до кінця рядка.
Розширена форма дозволяє написати коментар у двох чи більше рядках. Кожен рядок, окрім першого, повинен починатися з двох символів тире, можливо, передуючи символам пробілів та вкладок.
Header_comment
Прокоментуйте

Примітка . Це не офіційний опис коментаря . Однак я не міг зрозуміти, чому персонаж відсотка ( % ) не був допущений у голому вигляді (тобто не входить до спеціального_характера ) у коментарі.

Примітка . Існує два види коментарів: безкоштовні коментарі та очікувані коментарі. Безкоштовні коментарі можна відкинути за допомогою деяких інструментів. Однак очікувані коментарі з'являються у складі чотирьох конструкцій: Routine , Assertion_clause , Creation_clause та Feature_clause , і їх слід обробляти інструментами, такими як коротка утиліта. Хоча в рутині , Creation_clause та Feature_clause коментар заголовка є необов’язковим і може бути проігнорований без особливої ​​шкоди, він є обов'язковим у програмі Assertion_clause, і ігнорування цього буде синтаксичною помилкою. Рішенням для реалізації цих очікуваних коментарів може бути використання лексичних зв’язків.

Примітка : TowerEiffel помилково видає помилку синтаксису, коли в структурі функцій з’являється коментар між ключовим словом функції та необов'язковими клієнтами . Це, мабуть, вторинний ефект від використання лексичних зв’язків, запропонованих вище.

Примітка . У наступній звичайній декларації:

foo is
        -- This is the first comment.

        -- This is the second comment.

        -- This is the third comment.
    do
        ...
    end

незрозуміло, який з трьох коментарів є очікуваним коментарем Header_comment та які ще два вільних коментарі. TowerEiffel вибрав перший коментар для коментаря в заголовку. Деякі інші компілятори, такі як ISE Eiffel, Halstenbach і Visual Eiffel, насправді об'єднують три коментарі в один, який стає коментарем у заголовку.

Примітка : Деякі компілятори Ейфеля ігнорують будь-який рядок, починаючи з " - |" замість просто " - " у коментарях заголовка.


Break
Перерва робиться послідовністю одного або декількох з наступних символів:
  1. порожній
  2. вкладка
  3. нова лінія
Перерву можна вставити між двома суміжними елементами, не впливаючи на семантику.

Примітка . Деякі платформи, такі як Windows, перед новим рядком ставлять символ повернення каретки. У таких випадках легше розглядати повернення вагона як четвертого можливого символу, що складає перерву.


Special_character
Спеціальний персонаж має одну з таких форм:
  1. послідовність %/code/ де code - це непідписане ціле число, що представляє символ коду коду ASCII у десятковому значенні
  2. послідовність %K використовується для представлення наступних спеціальних символів:
     
    Character Code Mnemonic name
    @ %A At-sign
    BS %B Backspace
    ^ %C Circumflex
    $ %D Dollar
    FF %F Form feed
    \ %H backslasH
    ~ %L tiLda
    NL (LF) %N Newline
    ` %Q back Quote
    CR %R carriage Return
    # %S Sharp
    HT %T horizontal Tab
    NUL %U nUll character
    | %V Vertical bar
    % %% percent
    ' %' single quote
    " %" double quote
    [ %( opening bracket
    ] %) closing bracket
    { %< opening brace
    } %> closing brace

Примітка : Більшість компіляторів Ейфеля видають синтаксичну помилку, коли послідовність % K не вказана у таблиці вище. Однак Visual Eiffel вважає, що послідовність % K являє собою символ K, коли послідовність не вказана у таблиці вище. Як наслідок, % P означає символ P, а % D означає символ $ .

Примітка : Усі компілятори Ейфелева, які я перевірив (тобто ISE Eiffel, Halstenbach, SmallEiffel, Visual Eiffel, TowerEiffel), очікують, що літера K в % K буде мати верхній регістр, щоб її визнали спеціальним символом з наведеної вище таблиці. Як наслідок, % d і % D не вважаються однаковими.

Примітка . Мені не ясно, чи дозволяється підкреслювати значення в цілому коді (особливо, якщо це код широкого символу).


Зарезервоване_слово
Зарезервоване слово:
  1. ключове слово, яке служить для введення та розмежування варіативних компонентів конструкцій. Ключовими словами Ейфеля є: псевдонім , все , і , як , перевірити , клас , створення , налагодження , відкладено , зробити , ще , elseif , закінчити , забезпечити , розширено , експорт , зовнішній , функція , з , заморожений , якщо , мається на увазі , індексування , інфіксувати , успадкувати , перевірити , інваріант , є , як , локальний , цикл , не , застарілий , старий , один раз , або , префікс , перезначити , перейменувати , вимагати , врятувати , повторити , виберіть , розділити , потім , визначити , до , варіант , коли , xor .
  2. заздалегідь визначене ім'я, яке розміщується в позиціях, де також будуть допустимі змінні лексеми. Заздалегідь визначені назви Ейфеля: BIT , Current , False , Precursor , Result , Strip , True , Unique .
Пропис літери не є важливим для зарезервованих слів: два слова Результат і REsUlT вважаються однаковими.

Примітка : Офіційна специфікація синтаксису перелічує такі імена класів як зарезервовані слова: BOOLEAN , CHARACTER , DOUBLE , INTEGER , NONE , POINTER , REAL , STRING . Я розумію, що ці класи повинні бути відомі компіляторами Ейфеля, але я не бачу, чому вони повинні бути зарезервованими словами. Зауважте, що будь-які , загальні , PLATFORM та багато інших імен класів зі стандарту бібліотеки ядра також не вказані! Більше того, ці назви класів ніде не зустрічаються у синтаксичних конструкціях. Нарешті, лише Visual Eiffel вважає ці назви класів зарезервованими словами.

Примітка . У Ейфелі: Мова , друга друк, помилка , смужка , правда та унікальність вважаються ключовими словами. Я не поділяю цю точку зору.

Примітка . Хоча SmallEiffel відрізняється від регістру щодо ідентифікатора , він вважає, що регістр букви не є значущим для зарезервованих слів!

Примітка : Попередник не є частиною стандартного синтаксису. Він був введений для підтримки механізму попередника .


Оператор
Оператори в наступній таблиці групуються за рівнем пріоритетності, починаючи з групи найвищого пріоритету. Оператори в кожній групі мають однаковий пріоритет. Для двох або більше послідовних подій бінарних операторів з однаковим рівнем пріоритетності стовпець асоціативності вказує порядок оцінки.
Symbol Associativity
. left
old
not
unary +
unary -
All free unary operators
 
All free binary operators  
^ right
*
/
//
\\
left
left
left
left
binary +
binay -
left
left
=
/=
<
>
<=
>=
left
left
left
left
left
left
and
and then
left
left
or
or else
xor
left
left
left
implies left

Примітка. Причина, через яку компілятори Ейфеля відхиляють наступний фрагмент коду:

 
 foo : = 1 < 2 < 3
 

це не тому, що оператори порівняння не асоціативні. Ці оператори справді залишаються асоціативними. Наведений вище код синтаксично правильний, але просто відкидається, оскільки ' 1 <2 ' має тип BOOLEAN і немає такої функції, як:

 
 infix "<" (i : INTEGER): SOME_TYPE
 

у класі БУЛІАН.


Крапка з комою
Точки з комою використовуються як роздільники у списках, таких як Index_list або Compound. Крапки з комою в більшості місць необов’язкові. Однак у деяких випадках вони вимагають усунення неоднозначностей у твердженні та складі . Неоднозначність виявляється в наступному фрагменті коду:
foo (expr).bar
де це може бути розпізнано як " бар, застосований до результату функції foo з аргументом expr ", або як "виклик foo, а потім бар, застосований до expr ". Правило для вирішення цієї неоднозначності - ставити крапку з комою між ' foo ' та '(expr).bar ', щоб отримати другу інтерпретацію або залишити її такою, якою є перша.

Примітка . Для деяких конструкцій деякі компілятори Ейфеля будуть розглядати крапки з комою як термінатори, вважати їх обов'язковими або просто надсилати попередження, якщо вони відсутні.


Авторські права � 1999-2019 рр. , Ерік Безо
mailto: ericb@gobosoft.com
http: //www.gobosoft.com
Останнє оновлення: 25 січня 2019 року
Головна Головна