Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Eiffel: o Sintaksi


Obeležena Eiffel Sintaksa, ovde opisana, ima za cilj da pisce Eiffel alata kao što su kompajleri, prevodioci, syntax checkers, kratki i ravni alati, pretti-štampači, itd, koji žele da imaju koristi od nekih saveta i trikova. Iako ovo nije zvanična specifikacija Eiffel sintakse koju obezbeđuje Neprofitni Međunarodni Konzorcijum za Eiffel (Nica),ona odstupa od nje u samo dve ili tri dobro dokumentovana navrata. Konkretno, ona objašnjava gde, a ponekad i zašto, su postojeći kompajleri produžili Eiffel sintaksu.

Konstrukti Eiffel sintakse su navedeni u grupama, počevši sa konstruktima visokog nivoa kao što su Class_declaration dole do leksičkih komponenti kao što su Identifier. Alternativno, ovi konstrukti su dati u abecednom redu. Oznaka koja se koristi da opiše Eiffel sintaksu je naznačena drugde. Moguća implementacija Eiffel sintakse u Iacc- i leks-like format je takođe data kao primer.

Ova stranica je takođe dostupna na japanskom (preveo Iizuka Tomio).


Class_declaration
[ Indexing ]
Class_header
[ Formal_generics ]
[ Obsolete ]
[ Inheritance ]
[ Creators ]
[ Features ]
[ Invariant ]
end [ -- class Class_name ]
Napomena: Većina Eiffel kompajlera ne proverava ispravnost opcionog komentara posle ključne reči end. SmallEiffel emituje upozorenje.

Napomena: datoteka može da sadrži više od jedne deklaracije klase. Međutim, većina Eiffel kompajlera imaju ograničenje od jedne klase po datoteci.

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
Napomena: Ključna reč separate nije deo Eiffel standarda. Uvedena je u ISE Eiffel da podrži Scoop mehanizam. Pročitajte Object-Oriented Software Construction, drugo izdanje, za detalje.

Class_name
Identifier

Formal_generics
[ Formal_generic_list ]
Formal_generic_list
{ Formal_generic , ... }
Napomena: lista formal generics može biti prazna. Kao posledica toga, FOO[] važi i znači isto što i FOO. Međutim, ovo nije preporučeni stil.

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
Napomena: Zbog ovog konstrukta, Eiffel gramatika nije LR(1). Ovo se dešava u sledećim situacijama:
class FOO
inherit
    BAR
end
Ključna reč end će se smatrati kao deo opcionog Feature_adaptation umesto kao deo Class_declaration konstrukta.

Način da se reši ovaj problem bio bi da se dozvoli ključna reča end u Feature_adaptation samo kada je barem jedan od opcionih konstrukta koji čine Feature_adaptation prisutan.

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
Napomena: Standardna sintaksa zahteva Feature_list umesto Procedure_list ali Creation_clause zapravo navodi kreiranje imena procedura (videti validnost pravila VGCP-2).
{ Procedure_name , ... }
Procedure_name
Identifier
Napomena: Prefiks i infiks su imena funkcija, a ne imena postupaka . Nije mi jasno da li prefiks može da bude ime atributa , ali to definitivno nije ime postupka (videti validnost pravila 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
Napomena: Svi Eiffel kompajleri prihvataju prefiks i infiks operatora, bez obzira na slučaj pisma , kao što su prefiks "NOT" ili infiks "AnD".

Napomena: Intervencija karaktera nije dozvoljena posle prvog ili pre poslednjeg dvostrukog citata. Međutim, nije jasno kakve pauze bi trebalo da se koriste između dve ključne reči and then ili or else. SmallEiffel prihvata bilo koji broj praznih polja i tab znakova, dok ostali kompajleri zahtevaju jedno prazno.

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
Napomena: Lista deklaracija entiteta može biti prazna. Kao posledica toga, foo() je validna i znači isto što i foo. Međutim, ovo nije preporučeni stil.

Routine
[ Obsolete ]
[
Header_comment ]
[
Precondition ]
[
Local_declarations ]
Routine_body
[ Postcondition ]
[
Rescue ]
end [ -- Feature_name ]
Napomena: Većina kompajlera ne proverava ispravnost opcionog komentara posle ključne reči end. Nije u skladu sa smernicama staviti više ovakvih komentara.

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
Napomena: Svaki Eiffel kompajler podržava svoju mini-sintaksu na jeziku imena i spoljnih imena nizova da opiše svoj interfejs sa drugim programskim jezicima. Pogledajte dokumentaciju, koju ste dobili sa različitim kompajlerima, za detalje.

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
Napomena: Iako se komentari poput komentara zaglavlja očekuju u nekim konstruktima kao što su Routine ili Features, ovo je jedino mesto gde ignorisanje komentara rezultuje greškom sintakse ili netačnim stablom sintakse . Ovo se dešava u sledećim situacijama:
require
    oznaka:- greška sintakse kada je ignorisana
do
i
require
    oznaka:-.ako je ovaj komentar ignorisan,
    - oznaka će biti pogrešna
    - povezana sa foois_valid!
foo.is_valid
Pogledajte drugu napomenu u Comment za više detalja.

Rescue
rescue Compound
Napomena: Validnost pravila VKSRT navodi da je Retry uputstvo važi samo u spasilačkoj odredbi. To bi moglo eventualno da se primenjuju od strane sintakse.

Type
Class_type |
Class_type_expanded |
Class_type_separate |
Anchored | Bit_type
Napomena: Standardna Eiffel sintaksa takođe navodi Formal_generic_name kao moguću alternativu za Tipe. Međutim, to je uvelo nejasnoću u sintaksi jer se identifikator može prepoznati i kao Formal_generic_name i Class_tipe bez stvarnih genericks.
Class_type
Class_name [ Actual_generics ]
Actual_generics
[ Type_list ]
Type_list
{ Type , ... }
Napomena: Spisak tipova može biti prazan. Kao posledica toga, FOO[] važi i znači isto što i FOO. Međutim, ovo nije preporučeni način.
Class_type_expanded
expanded Class_type
Class_type_separate
separate Class_type
Napomena: Class_tipe_separate nije deo Eiffel standarda. Uvedena je u ISE Eiffel da podrži Scoop. mehanizam. Pročitajte Object-Oriented Software Construction,drugo izdanje, za detalje.
Bit_type
BIT Bit_length
Napomena: U standardnoj sintaksi, Constant se pojavljuje umesto Bit_length. Međutim, validnost pravila VTBT navodi da Bit_tipe deklaracija važi ako i samo ako je njen Constant je vrste integer, što znači da konstanta ili manifestuje integer constant ili atribut constant.
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 ]
Napomena: Ako vrsta nije prisutna, dva znaka uzvika mogu biti napisana sa ili bez interventne pauze. U načinu standard, preporučeni oblik je onaj bez prekida, što čini da !! izgleda kao jedinstveni leksički simbol.
Creation_call
. Procedure_name [ Actuals ]
Napomena: U standardnoj Eiffel sintaksi, Creation_call je napravljen od Unkualified_call. Ali validnost pravila VGCC-6 kaže da ako je f odlika Creation_call, onda je f procedura.

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 , ... }
Napomena: Spisak izbora može biti prazan. Kao posledica pregled
inspect expr
when then
    do_something
...
iako besmisleno, to je sintaksno ispravno. Može se posmatrati kao
if False then
    do_something
...
Međutim, to nije deo preporučenog načina.
Choice
Choice_constant | Interval
Napomena: Standardna sintaksa definiše Constant umesto Choice_constant. Međutim, validnost pravila VOMB-1-2 navodi da je Constant u Choice i Interval samo vrsta Integer ili CHARACTER.
Interval
Choice_constant .. Choice_constant
Napomena: Leksički analizator mora da bude dovoljno pametan u sledećem primeru:.
inspect expr
when 1..2 then
...
Zaista, ’1..2' trebalo bi prepoznati kao dve celobrojne konstante '1' i '2 ' razdvojene Eiffel simbolom' tt class="articlecontainertt">.. ', umesto kao dve uzastopne realne konstante '1'. i ".2 '. Vizuelni Eiffel pogrešno emituje sintaksnu grešku kada analizira primer odozgo.
Choice_constant
Integer_constant | Character_constant | Attribute
Napomena: ToverEiffel prihvata "remote constant" u Choice i Interval, kao što su u:
foo: FOO
inspect i
when foo.const then
do_something
end
gde je const deklarisan kao konstanta u vrsti F00. Ovo nije standardna Eiffel Sintaksa.

Loop
Initialization
[ Invariant ]
[ Variant ]
Loop_body
end
Initialization
from Compound
Variant
variant [ Tag_mark ] Expression
Napomena: Validnost pravila VAVE navodi da Expression mora biti vrste INTEGER. To bi eventualno moglo biti delimično primenjivano u sintaksi odbacivanjem Equality, Manifest_array, Strip i svim non-integer Manifest_constants.
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
Napomena: Validnost pravila VKSRT navodi da je Retry instrukcija važi samo u Rescue članu. To bi eventualno moglo da se primenjuju od strane sintakse.

Null_instruction
empty
Napomena: Ova instrukcija ima čistu sintaksnu ulogu: uveravavši da pomoćni tačka-zarezi dodati za nadzor Compound su bezazleni, kao i da
if c then ; i1;;; i2; else ;; end
ToverEiffel ne podržava dodatne tačka-zareze osim završnog člana. Svi ostali kompajleri rade kao što se očekuje. SmallEiffel emituje upozorenje kada analizira dodatne tačka-zareze.

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 ]
Napomena: Ova specifikacija Call se neznatno razlikuje od verzije koju ste dobili u standardnoj. Međutim, standardna sintaksa prihvata konstrukte koji nisu pravilni Eiffel kao što su:
foo.Result
Current (5)
dok specifikacija data gore to ne prihvata.
Napomena: U ToverEiffel, funkcije mogu biti direktno pozivane na Manifest_constant bez stavljanja zagrada oko konstante, kao što su u :
str := 'a'.out
onim u kojim bi trebalo da budu, koristeći standardnu sintaksu:
str := ('a').out
Postoji mali leksički problem sa Integer_constant, međutim, pošto
123.out
se prepoznaje kao
123. out
'123.'. kao Real_constant. Programer mora staviti dodatni Break između konstante celog broja i tačku da bi rešio ovaj problem.

Precursor
[ Parent_qualification ] Precursor [ Actuals ]
Parent_qualification
{ Class_name }
Napomena: Precursor konstrukt nije deo standardne Eiffel sintakse. Uveden je u Object-Oriented Software Construction Construction, drugo izdanje, i predlog za njegovu standardizaciju je dostavljen NICE.ISE Eiffel i Halstenbach će najverovatnije podržati ovaj konstrukt u svom sledećem izdanju.

Napomena:. U Object-Oriented Software Construction, drugo izdanje, ime klase u Parent_kualification je priložen između duplih zagrada: {{Class_name}}. Međutim, predlog podnet NICE koristi sintaksu navedenu gore.

Attribute
Identifier
Napomena: Prema validnosti pravila VFFD-5, Attribute može biti Prefix.
Writable
Identifier | Result
Napomena: Entity grupa sintakse iz standardne specifikacije sintakse je veoma pojednostavljena da bi rišila mnoge nejasnoće. Na primer, trebalo bi da:
foo
prepozna kao attribute, Local ili Formal? Samo semantička analiza može dati odgovor.

Actuals
( Actual_list )
Actual_list
{ Actual , ... }
Napomena: Lista aktuelnosti može biti prazna Kao posledica toga, Foo() važi i znači isto što i foo. Međutim,ovo nije preporučljiv način.
Actual
Expression | Address
Napomena: ToverEiffel tretira Address kao normalan izraz (tj. kao alternativa u Expression konstruktu). Kao posledica toga, adresa ne mora da se pojavi samo u aktuelnim listama.
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
Napomena: Specifikacija Expression se neznatno razlikuje od standardne verzije koju ste dobili . Prvo, Current i Result su dodati kao posledica nove specifikacije za Call. Zatim, Manifest_constant je zamenjen sa listom svojih alternativa. To je tako da bi se rešile nejasnoće u standardnoj sintaksi. U narednom delu koda:
foo := - 2
treba Expression na desnoj strani zadatka da bude prepoznat kao Integer_constant ili kao Unari_ekpression čiji Prefik_operator je '-' i čiji Expression je (nepotpisan) Integer? Zamena Integer_constant i Real_constant sa Integer i Real rešava problem.

Napomena: Vide_character_constant, Vide_manifest_string i Hekadecimal_constant nisu deo standarda. Oni su uvedeni u ToverEiffel da podrže široke znakove i niz znakova i celih heksadecimalnih brojeva.
Boolean_expression
Expression
Napomena: Validnost pravila VVBE navodi da logički izraz mora biti vrste BOOLEAN. Ovo bi moglo eventualno moglo biti delimično primenjivano u sintaksi odbacivanjem Manifest_arrai, Strip i svih ne-logičkih Manifest_constants.

Operator_expression
Parenthesized | Unary_expression | Binary_expression
Parenthesized
( Expression )
Unary_expression
Prefix_operator Expression
Binary_expression
Expression Infix_operator Expression
Napomena: Videti Operator za rukovaoca prvenstva i asocijativnosti.

Equality
Expression Comparison Expression
Comparison
= | /=
Napomena: Videti Operator za rukovaoca prvenstva i asocijativnosti.

Manifest_constant
Boolean_constant | Character_constant |
Integer_constant | Real_constant |
Manifest_string | Bit_constant |
Wide_character_constant |
Wide_manifest_string |
Hexadecimal_constant
Napomena: Vide_character_constant, Vide_manifest_string i Hekadecimal_constant nisu deo standarda. Oni su uvedeni u ToverEiffel da podrže široke znakove i niz znakova i celih heksadecimalnih brojeva.
Boolean_constant
True | False
Integer_constant
[ Sign ] Integer
Napomena: Postoji nejasnoća u standardnoj sintaksi ovde. U narednom delu koda:
foo := - 2
treba Expression na desnoj strani zadatka da bude prepoznat kao Integer_constant ili kao Unari_ekpression čiji Prefik_operator je '-' i čiji Expression je (nepotpisan) Integer? To je rešeno u tekućem opisu sintakse prepisivanjem specifikacije za Expression.
Real_constant
[ Sign ] Real
Napomena: Iste nejasnoće kao iznad su i za Integer_constant.
Sign
+ | -
Wide_character_constant
$ Character_constant
Napomena:.. Wide_character_constant nije deo standarda. Uveden je u ToverEiffel za podršku širokim znakovima u nizu znakova.

Napomena: Uplitanje znakova nije dozvoljeno između znaka za dolar i Character_constant.
Wide_manifest_string
$ Manifest_string
Napomena:.. Wide_manifest_string nije deo standarda. Uveden je u ToverEiffel za podršku širokim znakovima u nizu znakova.

Napomena: Uplitanje znakova nije dozvoljeno između znaka za dolar i Manifest_string.

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

Old
old Expression
Napomena: Validnost pravila VAOL-1 navodi da je izraz Old važi samo u Postcondition. To bi eventualno moglo da se sprovodi od strane sintakse.

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

Identifikator
Identifikator je niz od jednog ili više znakova, od kojih prvi predstavlja slovo (a do z i A do Z) i svaki od onaj naredni , ako ih ima, je slovo , decimalni broj (0 do 9) ili znak donje crte(_).
Predmet slova nije značajan za slova: dva identifikatora lInKeD_liST i LINKED_LIST se smatraju istim.
Napomena: Nažalost, SmallEiffel je case-sensitive (Začudo, nije case-sensitive na Reserved_vords.)

Napomena: Identifikator važi ako i samo ako nije jedan od Reserved_vords

Napomena: ToverEiffel ne može da barata sa susednim donjim crtama u karakteristikama imena i imenima klase.

Integer
Integer je niz znakova, od kojih svaki mora biti ili:
  1. decimalan broj (0 do 9)
  2. ili donja crta (_), koja ne može da bude prvi znak.
Ako je neka donja crta prisutna, onda moraju postojati tri broja sa desne strane svake donje crte, i ne sme biti nijedna uzastopna grupa od četiri cifre.
Napomena: Ova poslednja dva ograničenja u vezi donjih crta mogu se ukloniti u budućnosti, omogućavajući grupe od bilo kog broja cifara.

Napomena:. Nasuprot Integer_constant, Integer nema znak.

Napomena: Budite svesni problema minimalne vrednosti Integer! Na primer, na platformama gde se Integers nalaze na 32 bita, sledeći Eiffel kod važi:
Minimum_integer: INTEGER is - 2_147_483_648
        -najmanja podržana vrednost tipa Integer,
ali parser bi trebalo da bude dovoljno pametan inače će pročitati unarni minus posle kog sledi Integer 2147483648, koji se ne uklapa u 32 bita i time izaziva prekoračenje.

Hekadecimal_constant
Heksadecimalna konstanta je niz od dva ili više znakova, čiji je prvi znak decimalna cifra (0 do 9),čiji su naknadni znakovi, sem poslednjeg, decimalne cifre ili slova a do f ili A do F , ipraćeni sa ks ili KS, bez drugih interventnih znakova.
Napomena: Hekadecimal_constant nije deo standarda. Uvedena je u ToverEiffel da podrži heksadecimalne brojeve

Napomena: Nije jasno da li su donje crte dozvoljene u heksadecimalnoj konstanti.

Real
Realni broj se sastoji od sledećih elemenata:
  1. Opcioni Integer, koji daje sastavni deo (. Ako je ovo odsutno, sastavni deo je 0)
  2. obavezne tačke (.)
  3. Opcioni Integer napisan unazad, što daje razlomački deo (ako je odsutan, razlomački deo je 0).
  4. Opcioni eksponent, čije je slovo e ili E praćeno sa opcioninim Sign (+ili -) i Integer. Integer je potreban ako je e ili E prisutno. Ovo ukazuje na to da vrednost koja se pojavljuje pre e ili E mora biti smanjena za 10 ^ n, gde je n dati ceo broj.
Intervencioni znak (prazno ili drugačije) nije dozvoljen između ovih elemenata. Celobrojni i sastavni delovi razlomka ne mogu zajedno biti odsutni. Ako se donje crte koriste u celobrojnim ili frakcionim delovima, oni se takođe moraju pojaviti u drugom delu, osim ako ima tri cifre ili manje.
Napomena: Preporučuje se da se pre koristi E nego e.

Napomena: Suprotno Real_constant, Real nema znak.

Napomena: Ograničenje navodi da celobrojni i sastavni delovi i frakcioni ne mogu zajedno biti odsutni jer je leksički važno. Inače sledeći deo koda
a.e1
se može skenirati kao
a .e1
umesto.
a . e1
'.e1' se prepoznaje kao realan

Character_constant
Znakovna konstanta je ili:
  1. štampajući znak osim procenata (%) i jednog navodnika (')
  2. ili Special_character
zatvoren u jednostrukim navodnicima (').
Napomena: Štampajući znakovi uključuju, u ovom slučaju, praznine i tab znakove, ali ne i nove redove. Uporedite to sa Free_operator.

Manifest_string
Manifest string je proizvoljni niz od:
  1. Štampajućih znakova osim procenata (%) i dvostrukih navodnika (")
  2. Special_character
zatvorenim sa dvostrukim navodnicima (") (").
Produženi oblik omogućava vam da napišete manifest string na dva ili više redova. Svaki red sem poslednjeg se mora završiti sa procentom(%) i svaki red sem prvog mora početi sa procentom (%) koji je verovatno prethodio prazninom ( ) i tab znakom.
Napomena: Štampajući znakovi uključuju, u ovom slučaju, praznine i tab znakove, ali ne i nove redove. Uporedite to sa Free_operator.

Bit_constant
Bit konstanta je niz cifara 0 ili 1, praćena sa b ili B, ili bez drugih znakova intervencije.
Napomena: Preporučuje se da se pre koristi B umesto b.

Free_operator
Slobodni operater je niz od jednog ili više znakova, čiji prvi znak je bilo koji od @ # | & i čiji naknadni znak, ukoliko ih ima, mogu biti bilo koji štampajući znak. Slovni slučaj nije značajan za slova u slobodnim operaterima.
Napomena: Štampajući znakovi ne obuhvataju, u ovom slučaju, znakove dozvoljene u Breaks. Uporedite to sa Character_constant.

Napomena: Sledeći kod:
a@1
je skeniran kao
a @1
što nije sintaksno ispravno. Pogledajte Eiffel gotchas za detalje.

Napomena.: Eiffel: The Language, drugo izdanje, omogućava Special_charactera (iako se mogu štampati) u slobodnim operaterima. Eiffel kompajler ne podržava to.

Napomena: SmallEiffel i Visual Ajfelova su case-sensitive za slobodne operatere.

Comment
Komentar počinje sa znakom dve crtice (--) i prostire se do kraja reda.
Produženi oblik omogućava da napišete komentar na dva ili više redova. Svaki red sem prvog mora početi sa dve crtice kojima su verovatno prethodile praznine i tab znakovi.
Header_comment
Comment
Napomena: Ovo nije zvanični opis Komentara. Međutim, nisam mogao da vidim zašto procentualni znak (%) nije dozvoljen u svom golom obliku (tj. nije deo Special_character) u komentaru.

Napomena: Postoje dve vrste komentara: slobodni komentari i očekivani komentari. Slobodni komentari mogu biti odbačeni od strane nekih alatki. Međutim, očekivani komentari se pojavljuju kao deo od četiri konstrukta: Routine, Assertion_clause, Creation_clause i Feature_clause,i treba da se obrađuje alatkama kao kratak model. Iako je, u Routine, Creation_clause i Feature_clause, komentar zaglavlja nije obavezan i može biti ignorisan bez previše štete, obavezan je u Assertion_clause i ignorisanje bi bilo sintaksna greška. Rešenje za sprovođenje ovih očekivanih komentara može da se koristi za leksičke tie-ins.

Napomena: ToverEiffel greškom emituje sintaksnu grešku kada se komentar pojavljuje između odlike ključne reči i opcionog Clients u Features konstruktu. Ovo je verovatno sekundarni efekat upotrebe leksičkih tie-ins predloženih iznad.

Napomena: U narednoj Routine deklaraciji:
foo is
        - Ovo je prvi komentar.

        - Ovo je drugi komentar.

        - Ovo je treći komentar.
do
...
end
nije jasno koji je od ova tri komentara očekivan Header_comment i šta su druga dva slobodna komentara. ToverEiffel je izabrao prvi komentar da bude komentar zaglavlja. Neki drugi kompajleri, kao što su ISE Eiffel, Halstenbach i Visual Eiffel, zapravo spajaju tri komentara u jedan koji postaje komentar zaglavlja.

Napomena: Neki Eiffel kompajleri ignorišu svaki red koji počinje sa '--|', umesto samo '--' u komentaru zaglavlja.

Break
Pauza je napravljena od niza od jednog ili više pratećih znakova:
  1. Blank
  2. tab
  3. novi red
Pauza može da se umetne između dva susedna elementa bez uticaja na semantiku.
Napomena: Neke platforme, kao što je Vindovs, stavljaju znak carriage return pre novog reda. U takvim slučajevima, lakše je da se razmotri carriage return kao četvrti mogući znak koji čini pauzu.

Special_character
Poseban znak ima jedan od sledećih oblika:
  1. Sekvenca %/code/ gde je code neoznačen ceo broj, predstavlja karakter ASCII koda, koda u decimalnoj vrednosti.
  2. sekvenca %K se koristi za predstavljanje sledećih posebnih znakova:
     
    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
Napomena: Većina Eiffel kompajleri emituju sintaksnu grešku kada je sekvenca %K nije navedena u tabeli iznad. Međutim, Visual Ajfelova smatra da sekvenca %K predstavlja znak K kada sekvenca nije navedena u tabeli. Kao posledica %P predstavlja znak P i %D predstavlja znak $.

Napomena: Svi Eiffel kompajleri koe sam testirao (tj. ISE Ajfelova, Halstenbach, SmallEiffel, Visual Eiffel, ToverEiffel) očekuju slovo K u %K, kao u gornjem slučaju, da bude prepoznato kao poseban znak iz gornje tabele. Kao posledica %d i %D se ne smatra isto.

Napomena: Nije mi jasno da li su donje crte dozvoljene u celobrojnom kodu (posebno kada je kod širokog znaka).

Reserved_vord
Rezervisana reč je ili:
  1. ključna reč, koja služi da uvede i ograniči različite komponente konstrukata. Eiffel reči su: alias, all, and, as, check, class, creation, debug, deferred, do, else, elseif, end, ensure, expanded, export, external, feature, from, frozen, if, implies, indexing, infix, inherit, inspect, invariant, is, like, local, loop, not, obsolete, old, once, or, prefix, redefine, rename, require, rescue, retry, select, separate, then, undefine, until, variant, when, xor.
  2. ili predodređeno ime, koje dolazi na pozicije gde će različiti simboli takođe biti dozvoljeni. Eiffel predodređena imena su: BIT, Current, False, Precursor, Result, Strip, True, Unique.
Slovni slučaj nije značajan za rezervisane reči: dve reči Result i rEsUlT se smatraju istim.
Napomena: Zvanična specifikacija sintakse daje sledeća imena klase kao rezervisane reči: BOOLEAN, CHARACTER, DOUBLE, INTEGER, NONE, POINTER, REAL, STRING. Ja razumem da ove klase moraju biti poznate Eiffel kompajlerima, ali ja ne vidim zašto bi trebalo da budu rezervisane reči. Imajte na umu da ANY, GENERAL, PLATFORM i mnoge druge klase imena iz Kernel Library Standard nisu navedeni! Štaviše, ove imena klase se ne pojavljuju nigde u sintaksnim konstruktima. Konačno, samo Visual Eiffel smatra ove imena klasa kao rezervisane reči.

Napomena: U Eiffel: The Language, drugo izdanje, False, Strip, True i Unique se smatraju ključnim rečima. Ja ne delim ovu tačku gledišta.

Napomena: Iako je SmallEiffel case-sensitive, sa obzirom na Identifier, on smatra da slovni slučaj nije značajan za rezervisane reči!

Napomena: Precursor nije deo standardne sintakse. Uveden je da podrži Precursor mehanizam.

Operator
Operatori u sledećoj tabeli su grupisani po nivou prvenstva , počevši sa grupom sa najvišim prvenstvom. Operateri u okviru svake grupe imaju isti prioritet. Za dva ili više uzastopnih pojavljivanja binarnih operatora sa istim nivoom prvenstva , asocijativnost kolone određuje redosled procene.
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
Napomena: Razlog zašto Eiffel kompajleri odbaci sledeći deo koda:
foo := 1 < 2=""><>
poređeni operateri su ne-asocijativni. Ovi operatori su stvarno ostali asocijativni. Navedeni kod je sintaksno ispravan ali je jednostavno odbačen, jer '1 < 2' je tip BOOLEAN i ne postoji opcija kao što je:
infix "<" (i:="" integer):="">
in class BOOLEAN.

Tačka-zarez
Tačka-zarez se koriste za razdvajanje u spiskovima, kao što su Index_list ili Compound. Tačka-zarez su u većini mesta opcioni. Međutim, neophodni su u nekim slučajevima da bi uklonili nejasnoće u Assertion i Compound. Nejasnoća se pojavljuje u sledeć delu koda:
foo (expr).bar
gde bi ovo moglo da biti prepoznato kao "Bar primenjen na rezultat funkcije foo sa argumentom expr" ili kao "poziv foo praćen sa bar primenjen na expr". Pravilo koje rešava ovu nejasnoću je da se stavi tačka-zarez između 'foo' i '(expr).bar' da bi se dobila druga interpretacija, ili ostaviti ga kao što jeste da bi dobili prvu.
Napomena: Za neke konstrukte, neki Eiffel kompajleri će računati tačka-zarez kao terminators, smatraće ih obaveznim, ili samo slati upozorenje ako su nestali.





Published (Last edited): 24-09-2012 , source: http://www.gobosoft.com/eiffel/syntax/