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.
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.
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
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
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 fundFjala 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.
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)
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).
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.
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.
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.
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.
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ëjdhe
kërkoj etiketë : -- Nëse ky koment shpërfillet, -- etiketa do të jetë gabimisht - i lidhur me foo . eshte e vlefshme ! foo . eshte e vlefshmeShikoni shënimin e dytë në Koment për më shumë detaje.
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.
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
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
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
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
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
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ë.
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.
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
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.
Shënim : TowerEiffel pranon "konstante të largët" në Zgjedhje dhe Interval , si në:
foo : FOO inspektoj i kur foo . konst pastaj do_something fundku const deklarohet si konstante në klasën FOO . Kjo nuk është sintaksë standarde Eifel.
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ë
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.
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 ;; fundTowerEiffel 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ë.
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.
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ëNICE. ISE 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.
Shënim : Sipas rregullit të vlefshmërisëVFFD-5, një atribut mund të jetë gjithashtu një parashtesë
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:
footë njihet si një atribut , një lokal apo një formal ? Përgjigjen mund ta japë vetëm një analizë semantike.
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
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
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 := - 2A 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.
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 .
Shënim : Shih Operatorin për përparësinë dhe shoqërimin e operatorit.
Shënim : Shih Operatorin për përparësinë dhe shoqërimin e operatorit.
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
Shënim : Këtu ka një paqartësi në sintaksën standarde. Në pjesën e mëposhtme të kodit:
foo := - 2A 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.
Shënim : E njëjta paqartësi si për Integer_constant më sipër
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 .
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 .
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.
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.
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: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.Numri_minimum i plotë : INTEGER është - 2_147_483_648 -- Vlera më e vogël e mbështetur e tipit INTEGER
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.
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 koditmund të skanohej sia.e1
në vend tëa .e1
'.e1' duke u njohur si real.a . e1
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 .
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 .
Shënim : Stili i rekomanduar është të përdoret B në vend të b .
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ëmskanohet sia@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ë.një @1
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 :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.foo është -- Ky është komenti i parë. -- Ky është komenti i dytë. -- Ky është komenti i tretë. bëj ... fund
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.
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 | Në linjë |
` | %Q | prapa Q uote |
CR | %R | kthim ngarkese _ |
# | %S | S harpë |
HT | %T | horizontale T ab |
NUL | %U | n 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ë).
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 .
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: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:foo := 1 < 2 < 3
infix "<" ( i : INTEGER ): SOME_TYPE
në klasën BOOLEAN .
foo ( expr ). bar
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ë.