Sintaksa Eiffel

ORIGINAL URL: http://www.gobosoft.com/eiffel/syntax/index.html


Eiffel: Sintaksa

Sintaksa e shënuar e Eiffel-it e përshkruar këtu u drejtohet shkrimtarëve të mjeteve të Eifel-it si përpiluesit, interpretuesit, kontrolluesit e sintaksës, mjetet e shkurtra dhe të sheshta, printerët e bukur, etj., të cilët duan të përfitojnë nga disa këshilla dhe truke. Megjithëse ky nuk është specifikimi zyrtar i sintaksës së Eiffel-it të ofruar nga Konsorciumi Ndërkombëtar Jofitimprurës për Eiffelin ( NICE ), ai largohet prej tij vetëm në dy ose tre raste të dokumentuara mirë. Në veçanti, ai shpjegon se ku dhe ndonjëherë pse, përpiluesit ekzistues e kanë zgjeruar sintaksën Eifel. Konstruktet e sintaksës Eiffel renditen në grupe, duke filluar me konstruktet e nivelit të lartë si Class_declaration deri te komponentët leksikorë të tillë si Identifikuesi . Përndryshe, këto konstruksione jepen gjithashtu sipas rendit alfabetik . Shënimi i përdorur për të përshkruar sintaksën Eifel është specifikuar diku tjetër. Një zbatim i mundshëm i sintaksës Eifel në formatin yacc - dhe lex -si është dhënë gjithashtu si shembull.


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

Shënim : Shumica e përpiluesve Eiffel nuk e kontrollojnë vlefshmërinë e komentit opsional pas përfundimit të fjalës kyçe . Megjithatë, SmallEiffel lëshon një paralajmërim.

Shënim : Një skedar mund të përmbajë më shumë se një deklaratë klase. Sidoqoftë, shumica e përpiluesve Eiffel kanë një kufizim prej një klase për skedar.


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

Shënim : Fjala kyçe veçmas nuk është pjesë e standardit Eiffel. Është futur në ISE Eiffel për të mbështetur mekanizmin SCOOP . Lexoni ndërtimin e softuerit të orientuar drejt objekteve , botimi i dytë, për detaje

Class_name
Identifier

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

Shënim : Lista e gjenerikëve formalë mund të jetë bosh. Si pasojë, FOO [] është e vlefshme dhe do të thotë njësoj si FOO . Megjithatë, ky nuk është stili i rekomanduar

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

Shënim : Për shkak të këtij konstrukti, gramatika Eifel nuk ështëLR(1)Kjo ndodh në situatën e mëposhtme:

Klasa FOO
 trashëgojë
    BAR
fund

Fjala kyçe fundi do të konsiderohet si pjesë e opsionit Feature_adaptation në vend që të konsiderohet si pjesë e konstruksionit Class_declaration .

Një mënyrë për të zgjidhur këtë problem do të ishte lejimi i fjalës kyçe të përfundojë në Përshtatja_Feature vetëm kur të paktën një nga konstruktet opsionale që përbëjnë Veçorinë_përshtatje është i pranishëm.


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

Shënim : Sintaksa standarde kërkon një Feature_list në vend të një Procedure_list , por Creation_clause në fakt liston emrat e procedurave të krijimit (shih rregullin e vlefshmërisëVGCP-2)

Procedure_list
{ Procedure_name , ... }
Procedure_name
Identifier

Shënim : Prefiksi dhe Infix janë emra funksionesh, jo emra procedurash. Nuk është e qartë për mua nëse një Prefiks mund të jetë një emër atributi, por definitivisht nuk është një emër procedurash (shih rregullin e vlefshmërisë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

Shënim : Të gjithë përpiluesit Eiffel pranojnë operatorët e prefiksit dhe infiksit pavarësisht nga rasti i shkronjave, të tilla si parashtesa "NOT" ose prapashtesa "Dhe" .

Shënim : Asnjë karakter ndërmjetës nuk lejohet pas kuotës së parë ose para kuotës së dyfishtë. Megjithatë, nuk është e qartë se çfarë lloj ndërprerjeje duhet të përdoret midis dy fjalëve kyçe në dhe pastaj ose ndryshe . SmallEiffel pranon çdo numër boshllëqesh dhe karakteresh skedash, ndërsa përpiluesit e tjerë kërkojnë një bosh të vetëm.


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

Shënim : Lista e deklaratave të subjekteve mund të jetë bosh. Si pasojë, foo () është e vlefshme dhe do të thotë njësoj si foo . Megjithatë, ky stil nuk rekomandohet.


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

Shënim : Shumica e përpiluesve Eiffel nuk e kontrollojnë vlefshmërinë e komentit opsional pas përfundimit të fjalës kyçe . Nuk është më në udhëzimet e stilit për ta vendosur këtë koment.


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

Shënim : Çdo përpilues Eiffel mbështet mini-sintaksën e tij në emrat e gjuhës dhe vargjet e emrave të jashtëm për të përshkruar ndërfaqen e tyre me gjuhë të tjera programimi. Shikoni dokumentacionin që vjen me përpiluesit e ndryshëm për detaje.


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

Shënim : Edhe pse komente të tilla si komentet e kokës priten në disa konstruksione të tilla si Rutina ose Veçoritë , ky është i vetmi vend ku injorimi i një komenti rezulton në një gabim sintaksor ose një pemë sintaksore të pasaktë. Kjo ndodh në situatat e mëposhtme:

kërkojnë 
    tag : -- Gabim sintaksor kur shpërfillet!
bëj

dhe

kërkoj 
    etiketë : -- Nëse ky koment shpërfillet,
         -- etiketa do të jetë gabimisht
         - i lidhur me foo . eshte e vlefshme !
    foo . eshte e vlefshme

Shikoni shënimin e dytë në Koment për më shumë detaje.


Rescue
rescue Compound

Shënim : Rregulli i vlefshmërisëVXRTthotë se instruksioni Riprovoni është i vlefshëm vetëm në një klauzolë shpëtimi. Kjo përfundimisht mund të zbatohet nga sintaksa.


Type
Class_type | Class_type_expanded | Class_type_separate | Anchored | Bit_type

Shënim : Sintaksa standarde Eifel gjithashtu liston Formal_generic_name si një alternativë të mundshme për Type . Sidoqoftë, ai prezantoi një paqartësi në sintaksë pasi një identifikues mund të njihej si një emër_formal_gjenerik dhe një lloj_klase pa gjenerikë aktuale

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

Shënim : Lista e llojeve mund të jetë bosh. Si pasojë, FOO [] është e vlefshme dhe do të thotë njësoj si FOO . Megjithatë, ky nuk është stili i rekomanduar

Class_type_expanded
expanded Class_type
Class_type_separate
separate Class_type

Shënim : Class_type_separate nuk është pjesë e standardit Eiffel. Është futur në ISE Eiffel për të mbështetur mekanizmin SCOOP . Lexoni ndërtimin e softuerit të orientuar drejt objekteve , botimi i dytë, për detaje

Bit_type
BIT Bit_length

Shënim : Në sintaksën standarde, Constant shfaqet në vend të Bit_length . Megjithatë, rregulli i vlefshmërisëVTBT thotë se një deklaratë Bit_type është e vlefshme nëse dhe vetëm nëse Konstanta e saj është e tipit INTEGER , që do të thotë se konstanta është ose një konstante e numrit të plotë manifest ose një konstante atributi

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 ]

Shënim : Nëse lloji mungon, dy pikëçuditjet mund të shkruhen me ose pa ndërprerje. Në standardin e stilit, forma e rekomanduar është ajo pa ndërprerje, e cila bën !! shfaqen si një simbol i vetëm leksikor

Creation_call
. Procedure_name [ Actuals ]

Shënim : Në sintaksën standarde të Eiffel-it, Creation_call është bërë nga një thirrje e pakualifikuar . Por rregulli i vlefshmërisëVGCC-6thotë se nëse f është tipari i Creation_call , f është një procedurë.


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

Shënim : Lista e zgjedhjeve mund të jetë bosh. Si pasoje,

inspekto expr
 kur më pas
     bëj_diçka
...

edhe pse e pakuptimtë, është sintaksisht e saktë. Mund të mendohet si

nëse e rreme atëherë
    bej dicka
...

Megjithatë, kjo nuk është pjesë e stilit të rekomanduar.

Choice
Choice_constant | Interval

Shënim : Sintaksa standarde specifikonConstantnë vend të Choice_constant . Megjithatë, rregulli i vlefshmërisëVOMB-1-2thotë seKonstantja në Zgjedhje dhe Interval është vetëm e tipit INTEGER ose KARAKU 

Interval
Choice_constant .. Choice_constant

Shënim : Analizuesi leksikor duhet të jetë mjaft i zgjuar në shembullin e mëposhtëm:

inspektoni expr
 kur 1..2 pastaj 
...

Në të vërtetë, ' 1..2 ' duhet të njihet si dy konstantet e numrave të plotë ' 1 ' dhe ' 2 ' të ndara nga simboli Eiffel ' .. ', në vend të dy konstante reale të njëpasnjëshme ' 1. ' dhe ' .2 '. Visual Eiffel gabimisht lëshon një gabim sintaksor kur analizon shembullin e mësipërm.

Choice_constant
Integer_constant | Character_constant | Attribute

Shënim : TowerEiffel pranon "konstante të largët" në Zgjedhje dhe Interval , si në:

foo : FOO 
inspektoj i
 kur  foo . konst  pastaj
      do_something 
fund

ku const deklarohet si konstante në klasën FOO . Kjo nuk është sintaksë standarde Eifel.


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

Shënim : Rregulli i vlefshmërisëVAVEthotë se Shprehja duhet të jetë e tipit INTEGER . Kjo përfundimisht mund të zbatohet pjesërisht në sintaksë duke hequr Equality , Manifest_array , Strip dhe të gjitha Manifest_constant jo-numër të plotë 

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

Shënim : Rregulli i vlefshmërisëVXRTthotë se instruksioni Riprovoni është i vlefshëm vetëm në njëklauzolë shpëtimi . Kjo përfundimisht mund të zbatohet nga sintaksa.


Null_instruction
empty

Shënim : Ky udhëzim ka një rol thjesht sintaksor: duke u siguruar që pikat shtesë të shtuara nga mbikëqyrja në një Kompleks të jenë të padëmshme, si në

nëse  c  atëherë ; i1 ;;; i2 ; tjetër ;; fund

TowerEiffel nuk mbështet pikëpresje shtesë përveç terminatorëve. Të gjithë përpiluesit e tjerë punojnë siç pritej. SmallEiffel lëshon një paralajmërim kur analizon pikëpresje shtesë.


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 ]

Shënim : Ky specifikim i thirrjes është paksa i ndryshëm nga versioni i dhënë në standard. Sidoqoftë, sintaksa standarde pranon konstruksione që nuk janë të sakta Eiffel, si p.sh.

foo . Rryma e rezultatit
 ( 5 )

ndërsa specifikimi i dhënë më sipër jo.

Shënim : Në TowerEiffel, veçoritë mund të thirren drejtpërdrejt në një Manifest_konstante pa vendosur kllapa rreth konstantës, si p.sh.:

str := 'a' . jashtë

e cila duhet të jetë, duke përdorur sintaksën standarde:

str := ( 'a' ). jashtë

Megjithatë, ekziston një problem i vogël leksikor me Integer_constant , pasi

123.jashtë

njihet si

123.  jashtë

'123.' duke qenë një konstante_Reale . Programuesi duhet të shtojë një ndërprerje shtesë midis konstantës së numrit të plotë dhe pikës për të zgjidhur këtë problem.


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

Shënim : Konstrukti Precursor nuk është pjesë e sintaksës standarde Eiffel. Është prezantuar në Object-Oriented Software Construction , botimi i dytë, dhe një propozim për standardizimin e tij është dorëzuar nëNICEISE Eiffel dhe Halstenbach ka shumë të ngjarë të mbështesin këtë konstruksion në publikimin e tyre të ardhshëm.

Shënim : Në "Ndërtimi i softuerit të orientuar drejt objektit" , botimi i dytë, emri i klasës në " Perent_qualification" është i mbyllur midis kllapave të dyfishta: {{ Klasa_emri }} . Megjithatë propozimi i paraqitur nëNICE përdor sintaksën e specifikuar më sipër.


Attribute
Identifier

Shënim : Sipas rregullit të vlefshmërisëVFFD-5, një atribut mund të jetë gjithashtu një parashtesë 

Writable
Identifier | Result

Shënim : Grupi sintaksor i entitetit nga specifikimi standard i sintaksës është thjeshtuar shumë për të zgjidhur shumë paqartësi. Për shembull, duhet:

foo

të njihet si një atribut , një lokal apo një formal ? Përgjigjen mund ta japë vetëm një analizë semantike.


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

Shënim : Lista e fakteve mund të jetë bosh. Si pasojë, foo () është e vlefshme dhe do të thotë njësoj si foo . Megjithatë, ky stil nuk rekomandohet

Actual
Expression | Address

Shënim : TowerEiffel e trajton Adresën si një shprehje normale (dmth. si një alternativë në konstruktin e Shprehjes ). Si pasojë, një adresë nuk ka nevojë të shfaqet vetëm në listat aktuale

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

Shënim : Ky specifikim i Expression është paksa i ndryshëm nga versioni i dhënë në standard. Së pari, Aktual dhe Rezultati janë shtuar si pasojë e specifikimeve të reja për Call . Më pas, Manifest_constant është zëvendësuar me listën e alternativave të tij. Kjo është për të zgjidhur një paqartësi në sintaksën standarde. Në pjesën e mëposhtme të kodit:

foo := - 2

A duhet që Shprehja në anën e djathtë të detyrës të njihet si një numër i plotë_konstante apo si një shprehje_unary , operatori_prefiks i së cilës është ' - ' dhe shprehja e së cilës është një numër i plotë (i panënshkruar ) ? Zëvendësimi i Integer_constant dhe Real_constant me Integer dhe Real zgjidh problemin.

Shënim : Wide_character_constant , Wide_manifest_string dhe Hexadecimal_constant nuk janë pjesë e standardit. Ato janë futur në TowerEiffel për të mbështetur karaktere dhe vargje të gjera dhe numra të plotë heksadecimal.

Boolean_expression
Expression

Shënim : Rregulli i vlefshmërisëVWBEthotë se një shprehje boolean duhet të jetë e tipit BOOLEAN . Kjo përfundimisht mund të zbatohet pjesërisht në sintaksë duke hedhur poshtë Manifest_array , Strip dhe të gjitha Manifest_constant jo-boolean .


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

Shënim : Shih Operatorin për përparësinë dhe shoqërimin e operatorit.


Equality
Expression Comparison Expression
Comparison
= | /=

Shënim : Shih Operatorin për përparësinë dhe shoqërimin e operatorit.


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

Shënim : Wide_character_constant , Wide_manifest_string dhe Hexadecimal_constant nuk janë pjesë e standardit. Ato janë futur në TowerEiffel për të mbështetur karaktere dhe vargje të gjera dhe numra të plotë heksadecimal

Boolean_constant
True | False
Integer_constant
[ Sign ] Integer

Shënim : Këtu ka një paqartësi në sintaksën standarde. Në pjesën e mëposhtme të kodit:

foo := - 2

A duhet që Shprehja në anën e djathtë të detyrës të njihet si një numër i plotë_konstante apo si një shprehje_unary , operatori_prefiks i së cilës është ' - ' dhe shprehja e së cilës është një numër i plotë (i panënshkruar ) ? Kjo është zgjidhur në përshkrimin aktual të sintaksës duke rishkruar specifikimin për Expression.

Real_constant
[ Sign ] Real

Shënim : E njëjta paqartësi si për Integer_constant më sipër

Sign
+ | -
Wide_character_constant
Character_constant

Shënim : Wide_character_constant nuk është pjesë e standardit. Është prezantuar në TowerEiffel për të mbështetur karaktere të gjera.

Shënim : Nuk lejohet asnjë karakter ndërmjetësues ndërmjet shenjës së dollarit dhe karakterit_konstant .

Wide_manifest_string
$ Manifest_string

Shënim : Wide_manifest_string nuk është pjesë e standardit. Është prezantuar në TowerEiffel për të mbështetur karaktere të gjera në vargje.

Shënim : Nuk lejohet asnjë karakter ndërmjetës midis shenjës së dollarit dhe vargut Manifest .


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

Old
old Expression

Shënim : Rregulli i vlefshmërisëVAOL-1thotë se shprehja eVjetërështë e vlefshme vetëm në një gjendje postare . Kjo përfundimisht mund të zbatohet nga sintaksa.


Strip
Strip ( Attribute_list )
Attribute_list
{ Attribute , ... }
Identifier
Një identifikues është një sekuencë e një ose më shumë karaktereve, nga të cilat e para është një shkronjë ( a deri në z dhe nga A në Z ) dhe secila nga ato të mëvonshme, nëse ka, është një shkronjë, një shifër dhjetore ( 0 deri në 9 ) ose një karakter nënvizues ( _ ). Shkronjat nuk janë të rëndësishme për shkronjat: dy identifikuesit lInKeD_liST dhe LINKED_LIST konsiderohen të njëjtë.
Shënim : Fatkeqësisht, SmallEiffel është i ndjeshëm ndaj shkronjave të vogla. (Çuditërisht, nuk është e ndjeshme ndaj shkronjave të vogla për Reserved_word s.) Shënim : Një identifikues është i vlefshëm nëse dhe vetëm nëse nuk është një nga fjalët e rezervuara . Shënim : TowerEiffel nuk mund të trajtojë nënvizat e njëpasnjëshme në emrat e veçorive dhe emrat e klasave.

Integer
Një numër i plotë është një sekuencë karakteresh, secila prej të cilave duhet të jetë ose:
  1. një shifër dhjetore ( 0 deri në 9 )
  2. një nënvizim ( _ ), i cili mund të mos jetë karakteri i parë.
Nëse ka ndonjë nënvizim, atëherë duhet të ketë tre shifra në të djathtë të çdo nënvizimi dhe nuk duhet të ketë asnjë grup të njëpasnjëshëm prej katër shifrash.
Shënim : Dy kufizimet e fundit në lidhje me nënvizat mund të hiqen në të ardhmen, duke lejuar grupe të çdo numri shifrash. Shënim : Ndryshe nga Integer_constant , Integer nuk ka asnjë shenjë. Shënim : Jini të vetëdijshëm për problemin e vlerës minimale të numrit të plotë! Për shembull, në platformat ku numrat e plotë ruhen në 32 bit, kodi i mëposhtëm Eiffel është i vlefshëm:
Numri_minimum i plotë : INTEGER  është - 2_147_483_648 
        -- Vlera më e vogël e mbështetur e tipit INTEGER
por analizuesi duhet të jetë mjaft i zgjuar, përndryshe ai do të lexojë një minus unar të ndjekur nga numri i plotë 2147483648, i cili nuk përshtatet në 32 bit dhe për rrjedhojë shkakton një tejmbushje.

Hexadecimal_constant
Një konstante heksadecimal është një sekuencë prej dy ose më shumë karakteresh, karakteri i parë i së cilës është një shifër dhjetore ( 0 deri në 9 ), karakteret pasuese të së cilës, por të fundit janë shifra dhjetore ose shkronjat a deri në f ose nga A deri në F , dhe pasuar nga x ose X , pa asnjë personazh tjetër ndërhyrës.
Shënim : Hexadecimal_constant nuk është pjesë e standardit. Është futur në TowerEiffel për të mbështetur numrat e plotë heksadecimal. Shënim : Nuk është e qartë nëse nënvizat lejohen në konstante heksadecimal.

Real
Një numër real përbëhet nga elementët e mëposhtëm:
  1. një numër i plotë opsional , duke dhënë pjesën integrale (Nëse kjo mungon, pjesa integrale është 0.)
  2. një pikë e kërkuar ( . )
  3. një numër i plotë opsional i shkruar mbrapsht, i cili jep pjesën thyesore (nëse kjo mungon, pjesa thyesore është 0.)
  4. një eksponent opsional, i cili është shkronja e ose E e ndjekur nga një shenjë opsionale ( + ose - ) dhe një numër i plotë . Numri i plotë kërkohet nëse e ose E janë të pranishme. Kjo tregon se vlera që shfaqet përpara e ose E duhet të shkallëzohet me 10^n, ku n është numri i plotë i dhënë.
Asnjë karakter ndërhyrës (bosh ose ndryshe) nuk lejohet ndërmjet këtyre elementeve. Pjesët integrale dhe fraksionale nuk mund të mungojnë të dyja. Nëse nënvizat përdoren në pjesën integrale ose thyesore, ato duhet të shfaqen edhe në pjesën tjetër, përveç nëse ka tre shifra ose më pak.
Shënim : Stili i rekomanduar është të përdoret E në vend të e . Shënim : Ndryshe nga Real_constant , Real nuk ka asnjë shenjë. Shënim : Kufizimi që thotë se pjesët integrale dhe thyesore mund të mos mungojnë të dyja është i rëndësishëm leksikisht. Përndryshe, pjesa e mëposhtme e kodit
a.e1
mund të skanohej si
a   .e1
në vend të
a   .   e1
'.e1' duke u njohur si real.

Character_constant
Një konstante karakteri është ose:
  1. një karakter të printueshëm përveç përqindjes ( % ) dhe kuotës së vetme ( ' )
  2. një personazh i veçantë
të mbyllura në thonjëza të vetme ( ' ).
Shënim : Karakteret e printueshme përfshijnë, në këtë rast, karaktere bosh dhe skeda, por jo rreshta të rinj. Krahasoni atë me Free_operator .

Manifest_string
Një varg manifest është një sekuencë arbitrare e:
  1. karaktere të printueshme përveç përqindjes ( % ) dhe thonjëzave të dyfishta ( " )
  2. Karakteri i veçantë s
mbyllur në thonjëza të dyfishta ( " ).
Një formë e zgjeruar lejon që dikush të shkruajë një varg manifest në dy ose më shumë rreshta. Çdo rresht përveç të fundit duhet të përfundojë me një përqindje ( % ) dhe çdo rresht përveç të parës duhet të fillojë me një përqindje ( % ) që mund të paraprihet nga boshllëqet ( ) dhe karakteret e skedës.
Shënim : Karakteret e printueshme përfshijnë, në këtë rast, karaktere bosh dhe skeda, por jo rreshta të rinj. Krahasoni atë me Free_operator .

Bit_constant
Një bit konstant është një sekuencë e shifrave 0 ose 1 , e ndjekur nga b ose B , pa karaktere të tjera ndërhyrëse.
Shënim : Stili i rekomanduar është të përdoret B në vend të b .

Free_operator
Një operator i lirë është një sekuencë e një ose më shumë karaktereve, karakteri i parë i të cilit është cilido prej @ # | & dhe karakteret e mëvonshme të të cilit, nëse ka, mund të jenë ndonjë karakter të printueshëm. Rastet e shkronjave nuk janë të rëndësishme për letrat në operatorët falas.
Shënim : Karakteret e printueshme nuk përfshijnë, në këtë rast, karakteret e lejuara në Break s. Krahasoni atë me Character_constant . Shënim : Kodi i mëposhtëm
a@1
skanohet si
një   @1
që nuk është sintaksisht e saktë. Shikoni Eiffel gotchas për detaje. Shënim : Eiffel: Gjuha , shtypja e dytë, lejon karaktere_speciale (edhe pse të printueshme) në operatorë falas. Asnjë përpilues Eiffel nuk e mbështet këtë. Shënim : SmallEiffel dhe Visual Eiffel janë të ndjeshme për operatorët pa pagesë.

Comment
Një koment fillon me dy karaktere vizë ( -- ) dhe shtrihet deri në fund të rreshtit.
Një formë e zgjeruar lejon që dikush të shkruajë një koment në dy ose më shumë rreshta. Çdo rresht, përveç të parës, duhet të fillojë me dy karaktere vize, të paraprira ndoshta nga boshllëqe dhe karaktere skedash.
Header_comment
Komentoni
Shënim : Ky nuk është përshkrimi zyrtar i Komentit . Megjithatë, nuk mund ta kuptoja pse karakteri përqindje ( % ) nuk lejohej në formën e tij të zhveshur (dmth. jo pjesë e një karakteri_Special ) në një koment. Shënim : Ekzistojnë dy lloje komentesh: komente falas dhe komente të pritshme. Komentet falas mund të hidhen poshtë nga disa mjete. Sidoqoftë, komentet e pritshme shfaqen si pjesë e katër konstrukteve: Rutina , Klauzola_Pohimi , Klauzola_Krijimi dhe Klauzola_Feature , dhe duhet të përpunohen nga mjete të tilla si mjeti i shkurtër . Megjithëse, në Rutinë , Creation_clause dhe Feature_clause , komenti i kokës është opsional dhe mund të injorohet pa shumë dëm, ai është i detyrueshëm në Assertion_clause dhe injorimi i tij do të ishte një gabim sintaksor. Një zgjidhje për të zbatuar këto komente të pritshme mund të jetë përdorimi i lidhjeve leksikore. Shënim : TowerEiffel gabimisht lëshon një gabim sintaksor kur shfaqet një koment midis fjalës kyçe të veçorisë dhe Klientëve opsionalënë konstruktin e Veçorive . Ky është ndoshta një efekt dytësor i përdorimit të lidhjeve leksikore të sugjeruara më sipër. Shënim : Në deklaratën rutinë të mëposhtme :
foo  është
        -- Ky është komenti i parë.

        -- Ky është komenti i dytë.

        -- Ky është komenti i tretë.
    bëj
        ...
    fund
nuk është e qartë se cili nga tre komentet është Header_comment i pritur dhe cilët janë dy komentet e tjera falas. TowerEiffel zgjodhi komentin e parë për të qenë komenti i kokës. Disa përpilues të tjerë, si ISE Eiffel, Halstenbach dhe Visual Eiffel, në fakt bashkojnë tre komentet në një që bëhet komenti i kokës. Shënim : Disa përpilues Eiffel injorojnë çdo rresht që fillon me ' - |' në vend të vetëm ' -- ' në komentet e kokës.

Break
Një pushim është bërë nga një sekuencë prej një ose më shumë karaktereve të mëposhtme:
  1. bosh
  2. skedën
  3. linjë e re
Një ndërprerje mund të futet midis dy elementeve ngjitur pa ndikuar në semantikën.
Shënim : Disa platforma të tilla si Windows vendosin një karakter kthimi karroce përpara linjës së re. Në raste të tilla, është më e lehtë të konsiderohet kthimi i karrocës si një karakter i katërt i mundshëm që përbën një pushim.

Special_character
Një karakter i veçantë ka një nga format e mëposhtme:
  1. një sekuencë %/code/ ku kodi është një numër i plotë i panënshkruar që përfaqëson karakterin e kodit të kodit ASCII në vlerë dhjetore
  2. një sekuencë %K e përdorur për të përfaqësuar karakteret speciale të mëposhtme:
    Karakteri Kodi Emri mnemonik
    @ %A Një shenjë t
    BS %B Hapësira B
    ^ %C C ircumflex
    $ %D D ollar
    FF %F Furnizim me formë F
    \ %H prapaslas H
    ~ %L ti L da
    NL (LF) %N  linjë
    ` %Q prapa Q uote
    CR %R kthim ngarkese _
    # %S S harpë
    HT %T horizontale T ab
    NUL %U U ll karakter
    | %V Shirit V vertikal
    % %% për qind
    ' %' citat i vetëm
    " %" citat i dyfishtë
    [ %( kllapa hapëse
    ] %) kllapa mbyllëse
    { %< mbajtëse hapëse
    } %> mbajtëse mbyllëse
Shënim : Shumica e përpiluesve Eiffel lëshojnë një gabim sintaksor kur sekuenca %K nuk është e listuar në tabelën e mësipërme. Megjithatë, Visual Eiffel konsideron se sekuenca %K përfaqëson karakterin K kur sekuenca nuk është e listuar në tabelën e mësipërme. Si pasojë %P qëndron për karakterin P dhe %D qëndron për karakterin $ . Shënim : Të gjithë përpiluesit Eiffel që kam testuar (dmth. ISE Eiffel, Halstenbach, SmallEiffel, Visual Eiffel, TowerEiffel) presin që shkronja K në %K të jetë me shkronja të mëdha, të njihet si një karakter i veçantë nga tabela e mësipërme. Si pasojë %d dhe %D nuk konsiderohen të njëjta. Shënim : Nuk është e qartë për mua nëse nënvizat lejohen në numrin e plotë të kodit (veçanërisht kur është kodi i një karakteri të gjerë).

Reserved_word
Një fjalë e rezervuar është ose:
  1. një fjalë kyçe, e cila shërben për të prezantuar dhe kufizuar përbërësit variant të konstrukteve. Fjalët kyçe Eiffel janë: pseudonimi , të gjitha , dhe , si , kontrolloni , klasë , krijim , korrigjimi , shtyrë , bëj , tjetër , elseif , fund , siguroj , zgjeruar , eksport , jashtme , veçori , nga , ngrirë , nëse , nënkupton indeksimin infix , trashëgoj , inspektoj , invariant , është , si , lokal , lak , jo , i vjetëruar , i vjetër , një herë , ose , parashtesë , ripërcakto , riemërto , kërko , shpëtim , riprovo , zgjidh , veçoje , pastaj , mospërcakto , deri sa . kur , xor .
  2. një emër i paracaktuar, i cili vjen në pozicione ku do të ishin të lejueshme edhe shenjat e ndryshueshme. Emrat e paracaktuar të Eiffel-it janë: BIT , Rryma , False , Pararendës , Rezultati , Strip , True , Unique .
Rasti i shkronjës nuk është i rëndësishëm për fjalët e rezervuara: dy fjalët Rezultat dhe REZULTATE konsiderohen të njëjta.
Shënim : Specifikimi zyrtar i sintaksës rendit emrat e klasave të mëposhtme si fjalë të rezervuara: BOOLEAN , CHARACTER , DOUBLE , INTEGER , NONE , POINTER , REAL , STRING . E kuptoj që këto klasa duhet të njihen nga hartuesit e Eiffel-it, por nuk e kuptoj pse duhet të jenë fjalë të rezervuara. Vini re se ANY , GENERAL , PLATFORM dhe shumë emra të tjerë të klasave nga Standardi i Bibliotekës së Kernelit nuk janë renditur as! Për më tepër, këta emra klasash nuk shfaqen askund në konstruktet sintaksore. Së fundi, vetëm Visual Eiffel i konsideron këta emra klasash si fjalë të rezervuara. Shënim : Në Eiffel: The Language , printimi i dytë, False , Strip , True dhe Unique konsiderohen si fjalë kyçe. Unë nuk e ndaj këtë këndvështrim. Shënim : Edhe pse SmallEiffel është i ndjeshëm ndaj shkronjave të mëdha në lidhje me Identifikuesin , ai e konsideron shkronjat e shkronjave jo të rëndësishme për fjalët e rezervuara! Shënim : Pararendësi nuk është pjesë e sintaksës standarde. Është prezantuar për të mbështetur mekanizmin Pararendës .

Operator
Operatorët në tabelën e mëposhtme janë grupuar sipas nivelit të përparësisë, duke filluar me grupin e përparësisë më të lartë. Operatorët brenda secilit grup kanë të njëjtën përparësi. Për dy ose më shumë dukuri të njëpasnjëshme të operatorëve binarë me të njëjtin nivel përparësie, kolona e asociativitetit specifikon rendin e vlerësimit.
Simboli Asociativiteti
. majtas
vjetër jo unary + unary - Të gjithë operatorët unary falas
Të gjithë operatorët binare falas
^ drejtë
* / / / \\ majtas majtas majtas majtas
binar + binay - majtas majtas
= /= < > <= >= majtas majtas majtas majtas majtas _
dhe dhe pastaj majtas majtas
ose ndryshe xor majtas majtas majtas
nënkupton majtas
Shënim : Arsyeja pse përpiluesit Eiffel refuzojnë pjesën e mëposhtme të kodit:
foo := 1 < 2 < 3
nuk është për shkak se operatorët e krahasimit janë jo-shoqërues. Këta operatorë me të vërtetë janë lënë asociativ. Kodi i mësipërm është sintaksorisht i saktë, por thjesht refuzohet sepse ' 1 < 2 ' është i tipit BOOLEAN dhe nuk ka veçori të tilla si:
infix "<" ( i : INTEGER ): SOME_TYPE
në klasën BOOLEAN .

Semicolon
Pikëpresje përdoren si ndarës në lista të tilla si Index_list ose Compound . Pikëpresje janë opsionale në shumicën e vendeve. Megjithatë, atyre u kërkohet në disa raste për të hequr paqartësitë në Assertion dhe Compound . Paqartësia shfaqet në pjesën e mëposhtme të kodit:
foo ( expr ). bar
ku kjo mund të njihet si " shiriti i aplikuar në rezultatin e funksionit foo me argumentin expr " ose si "një thirrje në foo e ndjekur nga shiriti i aplikuar në expr ". Rregulli për të zgjidhur këtë paqartësi është vendosja e një pikëpresjeje midis ' foo ' dhe ' expr ). bar ' për të marrë interpretimin e dytë, ose për ta lënë ashtu siç është për të marrë të parën.
Shënim : Për disa konstruksione, disa përpilues Eiffel do të konsiderojnë pikëpresje si terminatorë, do t'i konsiderojnë ato të detyrueshme ose thjesht do të lëshojnë një paralajmërim nëse mungojnë.