Eiffel: a szintaxis

Eredeti az http://www.gobosoft.com/eiffel/syntax/index.html

A jegyzet Eiffel szintaxis leírt célja írók az Eiffel eszközök, mint a fordítók, tolmácsok, szintaxis dáma, rövid, lapos eszközök, szép nyomtatók, stb akik hasznot akarnak húzni a tippekből és trükkökből. Bár ez nem a hivatalos Eiffel szintaxis specifikáció által nyújtott Nonprofit nemzetközi konzorcium a Eiffel (Nonprofit International Consortium for Eiffel – NICE), eltér tőle csak két vagy három jól dokumentált alkalom. Különösen azt magyarázza meg, hogy a meglévő fordítók hol és néha miért hosszabbították meg az Eiffel szintaxist.

Az Eiffel szintaxis konstrukciók csoportokba sorolhatók, kezdve a magas szintű konstrukciókkal, mint például a Class_declaration lexikális komponensekre, például az Identifierre. Ezeket a konstrukciókat is ábécé sorrendben adjuk meg. Az Eiffel szintaxis leírására használt jelölés máshol található. Az Eiffel szintaxis yacc- és lex- szerű formátumban történő lehetséges végrehajtása szintén példaként szolgál.


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

Megjegyzés: Legtöbb Eiffel fordítók nem ellenőrzik az érvényességét az opcionális megjegyzés után a kulcsszó vége. SmallEiffel azonban figyelmeztetést bocsát ki.

Megjegyzés: egy fájl egynél több osztálynyilatkozatot is tartalmazhat. Azonban a legtöbb Eiffel fordítók van egy korlátozás egy osztály fájlonként.


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

Megjegyzés:a kulcsszó külön nem része az Eiffel szabvány. Az ISE Eiffel vezették be, hogy támogassa a SCOOP mechanizmust. A részletekért Object-Oriented Software Construction építését a második kiadásban.

Class_name
Identifier

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

Megjegyzés: a lista a formális genetika lehet üres. Ennek következtében a FOO[] érvényes, és ugyanazt jelenti, mint a FOO. Azonban ez nem az ajánlott stílus.

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

Megjegyzés: emiatt a konstrukció, az Eiffel nyelvtan nem LR(1). Ez a következő esetekben fordul elő:

class FOO
inherit
    BAR
end

A kulcsszó vége az opcionális Feature_adaptation részének tekintendő, nem pedig a Class_declaration constructor részének.

A probléma megoldásának egyik módja az lenne, ha a kulcsszó csak akkor fejeződne be a Feature_adaptation-ben, ha a Feature_adaptation alkotó opcionális konstrukciók közül legalább egy jelen van.


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

Megjegyzés: a standard szintaxishoz egy Feature_list szükséges Procedure_list helyett, de a Creation_clause valójában a létrehozási eljárás neveit sorolja fel (lásd a VGCP-2 érvényességi szabályt).

Procedure_list
{ Procedure_name , ... }
Procedure_name
Identifier

Megjegyzés: Prefix és Infix funkciónevek, nem az eljárásnevek. Számomra nem világos, hogy egy előtag Prefix de határozottan nem eljárásnév (lásd az érvényességi szabály 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
{ New_feature , ... }+
New_feature
[ frozen ] Feature_name

Feature_name
Identifier | Prefix | Infix
Prefix
prefix " Prefix_operator "
Infix
infix " Infix_operator "
Prefix_operator
Unary | Free_operator
Infix_operator
Binary | Free_operator

Megjegyzés: Eiffel compiler mindenelfogadja az előtagot és az infix operátorokat, függetlenül a betűtokozótól, például a “NOT” vagy infix “AnD”.

Megjegyzés: az első vagy az utolsó dupla idézet után semmilyen közbenső karakter nem megengedett. Azonban nem világos, hogy milyen szünetet kell használni a két kulcsszó között, majd, vagy más. Az SmallEiffel tetszőleges számú üres és tab karaktert elfogad, míg a többi compiler egyetlen vakpróbát igényel.


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

Megjegyzés: az egységnyilatkozatok listája üres lehet. Ennek következtében a foo() érvényes, és ugyanazt jelenti, mint a foo. Azonban ez nem ajánlott stílus.


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

Megjegyzés: Legtöbb Eiffel fordítók nem ellenőrzik az érvényességét az opcionális megjegyzés után a kulcsszó vége. Ez nem a stílus irányelvek, hogy ezt a megjegyzést többé.


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

Megjegyzés: Minden Eiffel fordító támogatja a saját mini-szintaxis a nyelvi név, valamint a külső név karakterláncok leírására a felület más programozási nyelvek. Részletekért lásd a különböző fordítók dokumentációját.


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

Megjegyzés: Bár egyes konstrukciókban, mint például a fejléc megjegyzései, például a Rutin vagy Funkciók esetében elvárhatóak, ez az egyetlen hely, ahol a megjegyzés figyelmen kívül hagyása szintaxis hibához vagy helytelen szintaxis fához vezet. Ez a következő esetekben fordul elő:

require
    tag: -- Syntax error when ignored!
do

és

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

További részletekért lásd a Megjegyzés második megjegyzését.


Rescue
rescue Compound

Megjegyzés: a VXRT érvényességi szabály kimondja, hogy az Újratárgyalási utasítás csak mentési záradékban érvényes. Ezt végül érvényre juttathatja a szintaxis.


Type
Class_type |
Class_type_expanded |
Class_type_separate |
Anchored | Bit_type

Megjegyzés: a standard Eiffel szintaxis a Formal_generic_name-et is felsorolja a típus lehetséges alternatívájaként. Azonban kétértelműséget mutatott be a szintaxisban, mivel az azonosítót mind Formal_generic_name ként, mind pedig olyan Class_type ként lehet elismerni, amelynek nincs tényleges generikuma.

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

Megjegyzés: a típusok listája üres lehet. Ennek következtében a FOO[] érvényes, és ugyanazt jelenti, mint a FOO. Azonban ez nem az ajánlott stílus.

Class_type_expanded
expanded Class_type
Class_type_separate
separate Class_type

Megjegyzés: a Class_type_separate nem része az Eiffel-szabványnak. Az ISE Eiffel-ben vezették be, hogy támogassa a SCOOP mechanizmust. A részletekért Object-Oriented Software Construction építését a második kiadásban.

Bit_type
BIT Bit_length

Megjegyzés: a standard szintaxisban az állandó jelenik meg a Bit_length helyett. Az érvényességi VTBT azonban kimondja, hogy a Bit_type nyilatkozat akkor érvényes, ha és csak INTEGER, ha állandó típusa egész, ami azt jelenti, hogy az állandó vagy manifeszt egész állandó, vagy attribútum állandó.

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 ]

Megjegyzés: Ha a típus nincs jelen, a két felkiáltójel írható közbenső szünettel vagy anélkül. A stílus standard, az ajánlott forma az egyik nélkül törések, ami !! jelenjen meg egyetlen lexikális szimbólumként.

Creation_call
. Procedure_name [ Actuals ]

Megjegyzés: a standard Eiffel szintaxis, a Creation_call készült egy Unqualified_call. De az érvényességi szabály VGCC-6 kimondja, hogy ha f a funkciója a Creation_call, az f egy eljárás.


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 , ... }

Megjegyzés: a lehetőségek listája üres lehet. Ennek következtében,

inspect expr
when then
    do_something
...

bár értelmetlen, szintaktikailag helyes. Úgy gondolhatunk rá mint

if False then
    do_something
...

Ez azonban nem része az ajánlott stílusnak.

Choice
Choice_constant | Interval

Megjegyzés: a standard szintaxis Constant ad meg a Choice_constant helyett. Azonban az érvényességi szabály VOMB-1-2 kimondja, hogy az állandó választás és intervallum csak Interval típusú INTEGER vagy CHARACTER.

Interval
Choice_constant .. Choice_constant

Megjegyzés: a lexikális analizátornak elég okosnak kell lennie a következő példában:

inspect expr
when 1..2 then
...

Valóban, ‘1..2’ az Eiffel-szimbólum által elválasztott ‘1’ és ‘2’ egész konstansként kell elismerni ‘..’, ahelyett, hogy két egymást követő valódi állandót ‘1’ és ‘2’. Visual Eiffel hibásan bocsát ki szintaxis hibát a fenti példa elemzésekor.

Choice_constant
Integer_constant | Character_constant | Attribute

Megjegyzés: TowerEiffel elfogadja a” távoli állandó” a Választás ez Intervallum, mint például a:

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

ahol a const a FOO osztályban állandónak nyilvánítják. Ez nem szabványos Eiffel szintaxis.


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

Megjegyzés: az érvényességi szabály a VAVE azt állítja, hogy a Expression egész típusúnak kell INTEGER Ezt a szintaxisban részben végre lehet hajtani az egyenlőség, a Manifest_array, a szalag és az összes nem egész Manifest_constats elvetésével.

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

Megjegyzés: a VXRT érvényességi szabály kimondja, hogy az Retry utasítás csak mentési Rescue érvényes. Ezt végül érvényre juttathatja a szintaxis.


Null_instruction
empty

Megjegyzés: Ez az utasítás tisztán szintaktikai szerepet tölt be: ügyelve arra, hogy a felügyelet által a vegyülethez hozzáadott extra Pontosvesszők ártalmatlanok legyenek, mint pl.

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

TowerEiffel nem támogatja az extra pontosvesszőket a terminátorokon kívül. Minden más fordító a vártnak megfelelően működik. A SmallEiffel figyelmeztetést bocsát ki az extra pontosvesszők feldolgozása során.


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 ]

Megjegyzés:Ez a specifikáció a Call kissé eltér a verzió a szabványban. Azonban a standard szintaxis elfogadja konstrukciók, amelyek nem megfelelő Eiffel, mint például:

foo.Result
Current (5)

míg a fent megadott specifikáció nem.

Megjegyzés: TowerEiffel, funkciók lehet hívni közvetlenül egy Manifest_constat anélkül, hogy zárójel körül az állandó, mint például a:

str := 'a'.out

ami kell, a szabványos szintaxis:

str := ('a').out

Van egy kis lexikális probléma Integer_constant bár, mivel

123.out

elismert mint

123. out

‘123.’egy Real_constant. A programozónak extra törést kell adnia Szünet konstans és a pont között a probléma megoldásához.


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

Megjegyzés: a prekurzor konstrukció nem része a standard Eiffel szintaxisnak. Bemutatásra került az Object-Oriented Software Construction építése, második kiadás, valamint a nizzának benyújtott szabványosítási NICE. ISE Eiffel és Halstenbach valószínűleg támogatja ezt a konstrukciót a következő kiadás.

Megjegyzés: Az Object-Oriented Software Construction a Parent_qualification osztálynév a kettős fogszabályzó között található: {{Class_name}}. A nizzának benyújtott NICE azonban a fent meghatározott szintaxist használja.


Attribute
Identifier

Megjegyzés: az érvényességi szabály szerint a VFFD-5 előtag Attribute is Prefix.

Writable
Identifier | Result

Megjegyzés: a standard szintaxis specifikációból származó entitás szintaxiscsoport nagyon leegyszerűsített, hogy számos kétértelműséget megoldjon. Például:

foo

elismerik, mint egy Attribute, helyi vagy hivatalos? Csak egy szemantikai analízis adhat választ.


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

Megjegyzés: előfordulhat, hogy a működtetés listája üres. Ennek következtében a foo() érvényes, és ugyanazt jelenti, mint a foo. Azonban ez nem ajánlott stílus.

Actual
Expression | Address

Megjegyzés: TowerEiffel a címet Address kifejezésként kezeli (vagyis a kifejezés  Expression konstrukciójának). Ennek következtében egy címnek nem kell csak a tényleges listákon szerepelnie.

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

Megjegyzés: Ez a kifejezés Expression kissé eltér a szabványban megadott verziótól. Először, Current az Result új pályázati kiírás következtében a jelenlegi és az eredmény hozzáadásra Call. Ezután Manifest_constat váltották a listát az alternatívák. Ez a standard szintaxis kétértelműségének megoldására szolgál. A következő kódrészletben:

foo := - 2

hozzárendelés Expression oldali kifejezését Integer_constant vagy Unary_expression Prefix_operator elismerni, amelynek előtagja ‘-‘, és amelynek kifejezése (alulírott) egész? Az Integer_constat és a Real_constat egészre való cseréje megoldja a problémát.

Megjegyzés: a Wide_character_constat, Wide_manifest_string és a Hexadecimal_constant nem része a szabványnak. A TowerEiffel ben széles karakterek és karakterláncok, valamint hexadecimális egész számok támogatására kerültek bevezetésre.

Boolean_expression
Expression

Megjegyzés: Szabály a VWBE érvényességi szerint a logikai kifejezésnek logikai típusúnak kell BOOLEAN. Ez részben végrehajtható a szintaxisban a Manifest_array, Strip and all non-boolean Manifest_constants kidobásával.


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

Megjegyzés: Operator lásd a kezelői rangsort és asszociativitást.


Equality
Expression Comparison Expression
Comparison
= | /=

Megjegyzés: Operator lásd a kezelői rangsort és asszociativitást.


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

Megjegyzés: a Wide_character_constat, Wide_manifest_string és a Hexadecimal_constant nem része a szabványnak. A TowerEiffel ben széles karakterek és karakterláncok, valamint hexadecimális egész számok támogatására kerültek bevezetésre.

Boolean_constant
True | False
Integer_constant
[ Sign ] Integer

Megjegyzés: Itt a standard szintaxis kétértelmű. A következő kódrészletben:

foo := - 2

a hozzárendelés jobb Expression kifejezését Integer_constant vagy Unary_expressiont a Prefix_operator amelynek előtagja ‘-‘, és amelynek kifejezése (alulírott) Integer? Ezt az aktuális szintaxis leírásban a kifejezési forma specifikációjának újraírásával oldottuk meg Expression.

Real_constant
[ Sign ] Real

Megjegyzés: Ugyanaz a kétértelműség, mint az Integer_constat fenti.

Sign
+ | -
Wide_character_constant
Character_constant

Megjegyzés: Wide_character_constat nem része a szabványnak. Ez került bevezetésre a TowerEiffel, hogy támogassa a széles karaktereket.

Megjegyzés: Nincs beavatkozás dollárjel és a Character_constant között tilos közbeavatkozni.

Wide_manifest_string
$ Manifest_string

Megjegyzés: Wide_manifest_string nem része a szabványnak. TowerEiffel-ben vezették be, hogy támogassa a karakterláncok széles karakterét.

Megjegyzés: Nincs beavatkozás dollárjel és a Manifest_string között tilos közbeavatkozni.


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

Old
old Expression

Megjegyzés: az érvényességi szabály VAOL-1 azt állítja, hogy Old kifejezés csak utólagosan érvényes. Ezt végül érvényre juttathatja a szintaxis.


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

Identifier
Az azonosító egy vagy több karakterből álló sorozat, amelyből az első betű (a fel z és A fel Z), és a következő karakterek mindegyike, ha van ilyen, betű, tizedesjegy (0 fel 9) vagy alsó karakter (_).
A leveles ügyek nem jelentősek a betűk esetében: a lInKeD_liST és a LINKED_LIST két azonosítója azonos.

Megjegyzés: Sajnos SmallEiffel érzékeny az esetre. (Meglepő módon a Reserved_words esetében ez nem esetérzékeny.)

Megjegyzés: Az azonosító akkor érvényes, ha és csak akkor, ha az nem a Reserved_words egyike.

Megjegyzés: TowerEiffel nem tudja kezelni az összefüggő underscore okat a funkciónevekben és az osztálynevekben.


Integer

    1. Az egész szám karaktersorozat, mindegyiknek vagy:

1. tizedesjegy (0-9)
2. alulvonás (_), amely nem lehet az első karakter.

Ha bármilyen aláhúzás van jelen, akkor minden aláhúzástól jobbra három számjegynek kell lennie, és nem lehet egymás után négy számjegyű csoport.

Megjegyzés: az alulbecslésre vonatkozó utolsó két megkötés a jövőben megszüntethető, ami lehetővé teszi a számjeggyel rendelkező csoportok számára.

Megjegyzés: Az Integer_constant, ellentétben az egész számnak nincs jele.

Megjegyzés: vegye figyelembe a minimális egész érték problémát! Például azokon a platformokon, ahol az egész számok tárolása 32 bites, a következő Eiffel kód érvényes:

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

de a parser legyen elég okos, különben olvasni fog egy nemary mínusz, majd az egész szám 2147483648, amely nem illeszkedik a 32 bit, így elindítja a túlcsordulás.


Hexadecimal_constant
A hexadecimális állandó két vagy több karakterből álló sorozat, amelynek első karaktere tizedesjegy (0 fel 9), amelynek következő karakterei de az utolsó tizedesjegyek vagy a fel f vagy A fel F betűk, majd x vagy X betűk, más közbenső karakterek nélkül.

Megjegyzés: Hexadecimal_constant nem része a szabványnak. TowerEiffel ben bevezették a hexadecimális egész számok támogatására.

Megjegyzés: Nem egyértelmű, hogy az aláhúzások megengedettek hexadecimális állandókban.


Real
A valódi szám a következő elemekből áll:

1. opcionális egész szám, amely a szerves részét (ha ez hiányzik, a szerves része 0.)
2. a szükséges pont (.)
3. egy opcionális egész szám visszafelé írva, amely megadja a törtrész (ha ez hiányzik, a törtrész 0.)
4. opcionális exponens, amely az e vagy E betű, majd egy opcionális jel (+ vagy -) és egy egész szám. Az egész szám szükséges, ha az e vagy E van jelen. Ez azt jelzi, hogy az e vagy E előtt megjelenő értéket 10^n-nel kell skálázni, ahol n az adott egész szám.

Ezen elemek között közbeavatkozó karakter (üres vagy más) nem megengedett. A szerves és a részegységek nem lehetnek hiányosak. Ha az alpontokat az integrál vagy a törtrészben használják, akkor a másik részben is meg kell jelenniük, kivéve, ha az három vagy kevesebb számjeggyel rendelkezik.

Megjegyzés: az ajánlott stílus az E használja e helyett.

Megjegyzés: ellentétben a Real_constat, Real nincs jele.

Megjegyzés: az a korlátozás, amely szerint az elválasztott és a törtrész nem feltétlenül hiányzik, lexikusan fontos. Ellenkező esetben a következő kód

a.e1

lehet beolvasni mint

a  .e1

ahelyett hogy

a  .  e1

”.e1′ valódinak ismerik el.


Character_constant
A karakter állandója vagy:

1. kinyomtatható karakter, kivéve a százalékot (%) és az egyetlen árajánlatot (‘)
2. egy Special_character

idézőjelek között (‘).

Megjegyzés: Nyomtatható karakterek ebben az esetben üres vagy tab karaktereket tartalmaznak, de nem új sorokat. Hasonlítsd össze Free_operator.


Manifest_string
A manifest sztring egy tetszőleges szekvencia:

1. kinyomtatható karakterek, a százalék (%) és a dupla árajánlat kivételével (“)
2. Special_characters

idézőjelek között (“).
A kiterjesztett űrlap lehetővé teszi, hogy egy manifeszt karakterláncot írjunk két vagy több sorra. Az utolsó sor kivételével minden sornak százalékkal (%) és minden sorral kell végződnie, de az elsőnek egy százalékkal (%) kell kezdődnie, amelyet esetleg vaktöltények ( ) és tab karakterek előznek meg.

Megjegyzés: Nyomtatható karakterek ebben az esetben üres vagy tab karaktereket tartalmaznak, de nem új sorokat. Hasonlítsd össze Free_operator.


Bit_constant
A bit állandó a 0 vagy 1, számjegyek sorozata, amit b vagy B követ, más közbenső karakter nélkül.

Megjegyzés: Az ajánlott stílus, hogy B helyett hogy b.


Free_operator
A szabad operátor egy vagy több karakterből álló sorozat, amelynek első karaktere a @ # | & bármelyike, és amelynek későbbi karakterei, ha vannak ilyenek, bármilyen nyomtatható karakter lehet. A levél esetében a betűk nem jelentősek a szabad üzemeltetők esetében.

Megjegyzés: a nyomtatható karakterek ebben az esetben nem tartalmazzák a szünetekben engedélyezett karaktereket. Hasonlítsd össze Character_constant.

Megjegyzés: A következő kód

a@1

beolvasott

a  @1

ami nem szintaktikailag helyes. Lásd Eiffel gotchas a részleteket.

Megjegyzés: Eiffel: a nyelv, második nyomtatás, lehetővé teszi Special_characters (bár nyomtatható) a szabad operátorok. Egy Eiffel fordító sem támogatja ezt.

Megjegyzés: a SmallEiffel és a Visual Eiffel esettanulmány-érzékeny a szabad operátorok számára.


Comment
A megjegyzés két dash karakterrel (–) kezdődik, és a sor végére nyúlik.
Egy kiterjesztett űrlap lehetővé teszi, hogy egy írjon egy megjegyzést két vagy több sort. Az első sor kivételével minden sornak két dash karakterrel kell kezdődnie, amelyeket esetleg vaktöltények és tab karakterek előznek meg.
Header_comment
Comment

Megjegyzés: Ez nem a megjegyzés hivatalos Comment. Azonban nem értem, hogy a százalékos karakter (%) miért nem volt megengedett a csupasz formában (azaz nem része a Special_character) egy megjegyzésben.

Megjegyzés: Kétféle megjegyzés van: ingyenes Megjegyzések és várható észrevételek. Az ingyenes megjegyzéseket néhány eszköz elvetheti. A várható megjegyzések azonban négy konstrukció részeként jelennek meg: rutin, Assertion_clause, Creation_clause és Feature_clause, amelyeket olyan eszközökkel kell feldolgozni, mint például a short utility. Bár a rutin, Creation_clause és Feature_clause, a fejléc megjegyzés opcionális, és figyelmen kívül lehet hagyni túl sok kárt, ez kötelező az Assertion_clause és figyelmen kívül hagyása lenne szintaxis hiba. A várt észrevételek végrehajtására megoldás lehet a lexikális megkötések használata.

Megjegyzés: TowerEiffel hibásan bocsát ki szintaxis hibát, amikor egy megjegyzés jelenik meg a funkció kulcsszó és az opcionális ügyfelek között a funkciók konstrukciójában. Ez valószínűleg a másodlagos hatása a használata lexikális megkötések fent javasolt.

Megjegyzés: a következő Routine ilatkozatban:

foo is
        -- This is the first comment.

        -- This is the second comment.

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

nem világos, hogy a három észrevétel közül melyik a várható Header_comment, illetve mi a másik két szabad észrevétel. TowerEiffel úgy döntött, az első megjegyzés, hogy a header comment. Néhány más fordítók, mint például az ISE Eiffel, Halstenbach és Visual Eiffel, ténylegesen egyesítik a három megjegyzést az egyik, amely lesz a fejléc megjegyzés.

Megjegyzés: Egyes Eiffel-fordítók figyelmen kívül hagyják a ‘–|’ vel kezdődő sorokat a fejléc megjegyzéseiben.


Break
A szünet egy vagy több karaktersorozatból áll:

1. üres
2. lap
3. új sor

A szemantika érintése nélkül két szomszédos elem közé is lehet szünetet helyezni.

Megjegyzés: egyes platformok, például a Windows az új sor elé helyez egy kocsiválasztó karaktert. Ilyen esetekben könnyebb úgy tekinteni, hogy a kocsi visszatér, mint a negyedik lehetséges karakter, amely egy szünetet.


Special_character
A különleges karakter az alábbi formák egyikével rendelkezik:

%/kód/ szekvencia, ahol a kód alulíratlan egész szám, amely az ASCII-kód Kód tizedesjegyben kifejezett karakterét ábrázolja
%K szekvencia a következő speciális karakterek megjelenítésére:

  1. Karakter Kód Mnemonikus név
    @ %A At-jel
    BS %B Backspace
    ^ %C Circumflex
    $ %D Dollar
    FF %F Form feed (forma takarmány)
    \ %H backslasH (hátramenet ferde jellemző)
    ~ %L tiLda (tilde)
    NL (LF) %N Newline (Újsor)
    ` %Q back Quote (vissza Idézet)
    CR %R carriage Return (szállítási visszatérés)
    # %S Sharp (Éles)
    HT %T horizontal Tab
    NUL %U nUll karakter
    | %V Vertical bar (Függőleges bar)
    % %% százalék
    %' egyetlen idézet
    %" dupla idézet
    [ %( nyitó konzol
    ] %) záró konzol
    { %< nyitó merevítő
    } %> bezárás merevítő

Megjegyzés: A legtöbb Eiffel-fordító szintaxis hibát bocsát ki, ha %K szekvencia nem szerepel a fenti táblázatban. A Visual Eiffel azonban úgy véli, hogy %K szekvencia a k karaktert jelöli, ha a szekvencia nem szerepel a fenti táblázatban. Ennek következtében a %P karakter P es %D pedig karakter $.

Megjegyzés: Az általam vizsgált összes Eiffel összeállító (pl. ISE Eiffel, Halstenbach, SmallEiffel, Visual Eiffel, TowerEiffel) elvárja, hogy a K betű %K a fenti táblázatból különleges karakterként ismerjék el. Ennek következtében a %d és %D nem azonos.

Megjegyzés: számomra nem világos, hogy az aláhúzások megengedettek a kód egész számában (különösen akkor, ha egy széles karakter kódjáról van szó).


Reserved_word
fenntartott szó vagy:

1. egy kulcsszó, amely a konstrukciók variáns összetevőinek bevezetésére és szűkítésére szolgál. Az Eiffel kulcsszavakaliasallandascheckclasscreationdebugdeferreddoelseelseifendensureexpandedexportexternalfeaturefromfrozenifimpliesindexinginfixinheritinspectinvariantislikelocalloopnotobsoleteoldonceorprefixredefinerenamerequirerescueretryselectseparatethenundefineuntivariantwhenxor.

2. előre meghatározott név, amely olyan pozíciókba kerül, ahol a változó zsetonok is megengedhetők. Az Eiffel előre meghatározott nevek: BITCurrentFalsePrecursorResultStripTrueUnique.

Leveles ügy nem jelentős a fenntartott szavak esetében: a két szó Result és rEsUlT megegyezik.

Megjegyzés: a hivatalos szintaxis specifikáció a következő osztályneveket tartja fenn: BOOLEAN, CHARACTER, DOUBLE, INTEGER, NONE, POINTER, REAL, STRING. Megértem, hogy ezeket az osztályokat az Eiffel fordítók ismerjék meg, de nem értem, miért kellene visszafogottnak lenniük. Ne feledje, hogy a Kernelkönyvtári szabványban szereplő ANY, GENERAL, PLATFORM vagy más osztálynév sem szerepel! Továbbá, ezek az osztálynevek sehol sem jelennek meg a szintaxis konstrukciók. Végül csak a Visual Eiffel tartja ezeket az osztályneveket fenntartott szavaknak.

Megjegyzés: Az Eiffel ben: a nyelv False, Strip, True és Unique kulcsszavaknak minősül. Nem osztom ezt a nézetet.

Megjegyzés: Bár a SmallEiffel esetérzékeny az azonosítóval kapcsolatban, úgy Identifier, hogy a levél esetében nincs jelentősége a fenntartott szavaknak!

Megjegyzés: Precursor nem része a standard szintaxisnak. Bevezették a Precursor mechanizmus támogatására.


Operátorok
Az alábbi táblázatban szereplő operátorok rangsorolása rangsor szerint történik, kezdve a legmagasabb rangsorral. Az egyes csoportokon belüli üzemeltetők elsőbbséget élveznek. Az azonos elsőbbségi szinttel rendelkező bináris operátorok két vagy több egymást követő előfordulása esetén az asszociativitás oszlop határozza meg az értékelés sorrendjét.
Szimbólum Asszociáció
. bal
old
not
monadikus +
monadikus -
Minden szabad monadikus operátor
Minden szabad bináris operátorok
^ rendben
*
/
//
\\
bal
bal
bal
bal
bináris +
bináris -
bal
bal
=
/=
<
>
<=
>=
bal
bal
bal
bal
bal
bal
and
and then
bal
bal
or
or else
xor
bal
bal
bal
implies bal

Megjegyzés: Amiért az Eiffel fordítók elutasítják a következő kódot:

foo := 1 < 2 < 3

nem azért, mert az összehasonlító operátorok nem asszociatívak. Ezek az operátorok valóban bal asszociatív. A fenti kód szintaktikailag helyes, de egyszerűen elutasításra kerül, mert az ‘1 < 2’ típusú BOOLEAN és nincs olyan funkció, mint például:

infix "<" (i: INTEGER): SOME_TYPE

osztály logikai BOOLEAN.


Pontosvessző
A pontosvesszők olyan listák elválasztójaként szolgálnak, mint az Index_list vagy a vegyület. A pontosvesszők a legtöbb helyen opcionálisak. Bizonyos esetekben azonban szükség van rájuk az állítások és a vegyületek kétértelműségének kiküszöböléséhez. A kétértelműség a következő kódrészletben jelenik meg:
foo (expr).bar
ahol ez a “bar alkalmazott to the result of function foo with argumentum expr” vagy “egy hívás a foo, majd a bar applied to expr”. A kétértelműség megoldásának szabálya, hogy pontosvesszőt tegyünk a ‘foo’ és ‘(expr).bar’, hogy a második értelmezés, vagy hagyja, mint az, hogy az első.

Megjegyzés: Egyes konstrukciók esetében egyes Eiffel fordítók a pontosvesszőket Terminátornak tekintik, kötelezőnek tekintik őket, vagy csak figyelmeztetést adnak ki, ha hiányoznak.

 

 

Vissza a főoldalra

Leave a Reply

Your email address will not be published. Required fields are marked *