Extended Backus – Naur Form ( EBNF ) on muodollinen syntaksin määritelmäjärjestelmä, jossa jotkin syntaktiset luokat määritellään peräkkäin muiden kautta . Käytetään kuvaamaan yhteydettömiä muodollisia kielioppeja . Ehdotus Niklaus Wirth . Se on laajennettu Backus-Naur-muotojen käsittely , eroaa BNF:stä "tilavammissa" rakenteissa, jotka samalla ilmaisukyvyllä mahdollistavat kuvauksen yksinkertaistamisen ja pienentämisen.
RBNF:stä käytetään kuitenkin monia erilaisia muunnelmia. Kansainvälinen standardointijärjestö on ottanut käyttöön RBNF-standardin: ISO/IEC 14977 [1] .
Kuten BNF:ssä, RBNF:n kielioppikuvaus on joukko sääntöjä, jotka määrittelevät suhteet päätemerkkien (pääte) ja ei-päätemerkkien (ei-pääte) välillä.
RBNF:n sääntö on:
идентификатор = выражение.
jossa tunniste on muun kuin päätemerkin nimi ja lauseke on yhdistelmä pääte- ja ei-päätemerkkejä ja erikoismerkkejä, joka on RBNF-sääntöjen mukainen. Piste lopussa on erikoismerkki, joka osoittaa säännön päättymisen.
RBNF-säännön semantiikka on, että yhtäläisyysmerkin vasemmalla puolella olevan tunnuksen määrittelemä ei-päätemerkki on lausekkeen määrittelemien päätemerkkien ja ei-päätemerkkien yhdistelmä .
Täydellinen kieliopin kuvaus on joukko sääntöjä, jotka määrittelevät peräkkäin kaikki kieliopin ei-päätteiset symbolit siten, että jokainen ei-päätemerkki voidaan pelkistää päätemerkkien yhdistelmäksi sääntöjen peräkkäisellä (rekursiivisella) soveltamisella. RBNF:n määrittelyssä ei ole erityisiä sääntöjä sääntöjen kirjoitusjärjestyksestä, vaikka tällaisia vaatimuksia voidaan ottaa käyttöön käytettäessä RBNF:ää ohjelmistotyökaluilla, jotka tarjoavat automaattisen jäsentimen generoinnin kielioppikuvauksesta.
Mahdollisten RBNF-rakenteiden joukko on hyvin pieni. Näitä ovat ketjuttaminen, valinta, ehdollinen esiintyminen ja toisto.
Tai kaikki edellä mainitut lyhyesti:
Jotkut teokset sisältävät muunneltuja muunnelmia RBNF-syntaksista.
— sääntö, joka määrittää Modula-2- kielen ehdollisen operaattorin kieliopin , jossa "Ehdollinen operaattori" ja "Operaattoriryhmä" ovat ei-terminaalisia symboleja yhdistetyillä nimillä.
EBNF-kuvauskieliopin yleistä muotoa voidaan kuvata nimellä EBNF seuraavasti:
Syntaksi = { SynthOperator }. SynthOperator = Tunniste "=" SynthExpression "." . SyntExpression = SynTerm { "|" SinTerm }. SynTerm = SyntFactor { SyntFactor }. SynthFactor = tunniste | ketju | "(" SynthExpression ")" | "[" SynthExpression "]" | "{" SynthExpression "}" .Tässä kuvauksessa oletetaan, että tunniste ja merkkijono ovat ennalta määritettyjä termejä. Haluttaessa niiden määritelmän kirjoittaminen RBNF:ään ei ole vaikeaa, tätä varten sinun tarvitsee vain määrittää tietty aakkoset ja tarvittaessa lisärajoitukset tunnisteen tyypille.
Seuraavat kieliopit määrittelevät yleisen desimaaliluvun (jossa on etumerkki, mahdollinen murto-osa ja eksponentti) ja tyypillisen ohjelmointikielen tunnisteen (kirjaimella alkava sarja kirjaimia, numeroita ja alaviivoja).
Numero = [ "+" | "-" ] NatNumber [ "." [ NatNumber ]][( "e" | "E" )[ "+" | "-" ] NatNumber ]. NatNumber = Numero { Numero }. Numero = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" . Ident = Letter { Letter | Numero | "_" }.Ei-pääteisen kirjaimen määritelmää ei anneta tässä ilmeisyyden ja hankalia vuoksi - se edustaa valintaa hyväksytyistä aakkosista.
BNF:n ja RBNF:n yhtäläisyydet ja erot käyvät ilmi kuvauksesta. Ero koostuu pääosin kahdesta pääkohdasta:
Ensimmäisen muutoksen onnistumisesta tai epäonnistumisesta voi olla erilaisia mielipiteitä, mutta joka tapauksessa se ei vaikuta muodon ilmaisumahdollisuuksiin. Mutta toinen innovaatio on erittäin merkittävä. Se ei myöskään lisää pohjimmiltaan uusia ilmaisumahdollisuuksia (kaikki, mikä kirjoitetaan RBNF:llä, voidaan kirjoittaa riittävästi tavallisella BNF:llä), mutta se vähentää ja yksinkertaistaa merkittävästi merkintää.
RBNF:n tärkein etu BNF:ään verrattuna on kyky kuvata yksinkertaisia toistuvia, määrittelemättömän pituisia rakenteita (listat, merkkijonot, sekvenssit ja niin edelleen) ilman rekursiivisia sääntöjä. Toistorakenteen puuttuminen BNF:stä johtaa siihen, että kaikki toistot on määriteltävä ottamalla käyttöön ylimääräisiä ei-päätteisiä symboleja ja rekursiivisia sääntöjä, mikä tekee määritelmästä liian suuren ja epäselvän. Toistojen kuvaus EBNF:ssä osoittautuu sekä lyhyemmäksi että helpommaksi ihmisen havainnolle.
Esimerkkinä voidaan harkita sääntöjä, jotka määrittelevät ei-päätteisen "listan", joka on joukko nollasta mihin tahansa pilkuilla erotettuun määrään tunnisteita (olettaen, että merkit "RightBracket", "LeftBracket", "Comma" ja "Ident" " on jo määritelty).
RBNF:n määritelmä sisältää vain yhden säännön:
Lista = Vasen hakasulku [ Ident { Comma Ident }] Right Bracket .BNF:n määritelmä näyttää tältä:
<Lista> ::= <Vasensulku> <Oikeasulku> | <LeftBracket> <IdentList> <RightBracket> <IdentList> ::= <Identti> | <Identti> <Pilkku> <Identiteettiluettelo>Jo tästä esimerkistä erot lomakkeiden välillä näkyvät:
Luonnollisesti hinta RBNF:n eduista BNF:ään verrattuna on RBNF-kuvausten automaattisen tulkinnan monimutkaisempi. BNF:ää käyttävät muodolliset kieliopin jäsennysgeneraattorit ovat yksinkertaisempia kuin RBNF:ää käyttävät.
RBNF vastaavat syntaksikaavioiden alaluokkaa, jota käytetään laajalti kielioppien kuvaamiseen. Mikä tahansa RBNF-kielioppi voidaan esittää riittävästi syntaksikaaviolla, mutta yleensä syntaksikaavioiden avulla voit luoda kuvauksia, joita ei voida esittää RBNF:ssä (tai joka tapauksessa ei voida kääntää suoraan RBNF:ksi muuntamatta ensin graafista kuvausta) .
RBNF:ää, kuten edeltäjäänsä, BNF:ää, käytetään erittäin laajalti keinotekoisten kielten, pääasiassa ohjelmointikielten ja niihin liittyvien merkintäjärjestelmien kuvaamiseen. Erityisesti RBNF:n keksijä Niklaus Wirth käytti tätä formalismia kirjoissaan kuvaamaan kaikkia siellä harkittuja ohjelmointikieliä.
RBNF:n monimutkaisuus BNF:ään verrattuna johtaa siihen, että RBNF:ään perustuvia jäsennysgeneraattoreita on huomattavasti vähemmän kuin BNF:ään perustuvia. Ne ovat kuitenkin olemassa ja pätevät. RBNF on perusta Spirit C++ Parser Frameworkille, Coco/R:lle, SLK Parser Generatorille ja joillekin muille. Tällaisissa järjestelmissä käyttöä varten RBNF-syntaksia laajennetaan samaan suuntaan kuin BNF-syntaksia käytettäessä yacc- tai bison -jäsenningeneraattoreita - sitä käsittelevä koodi lisätään suoraan kieliopin kuvaukseen, ja vuorovaikutus leksikaalisen analysaattorin kanssa on jotenkin järjestetty. . Sääntöjen rakenteeseen voidaan myös asettaa lisärajoituksia - kaikkia RBNF:ssä kuvattavia sääntöjä ei voida tehokkaasti muuntaa koodiksi.
RBNF:n ehdottomiin etuihin kuuluu yksinkertaisuus (itse RBNF-kielessä on vain 10 erikoismerkkiä - kolmen tyyppisiä hakasulkeita, pystypalkki, yhtäläisyysmerkki ja lainausmerkit, mahdollisesti pilkku; sen syntaksi määräytyy viiden säännön mukaan), riittävä teho ja näkyvyys, mikä tekee siitä kätevän kuvausten tekemiseen, jotka on tarkoitettu paitsi automaattiseen tulkintaan myös ihmisen luettavaksi. RBNF-rakenteiden läheisyys syntaktisiin kaavioihin mahdollistaa jälkimmäisen piirtämisen suoraan RBNF-kuvauksesta.
RBNF:n, kuten myös BNF:n, haittoja ovat muun muassa se, että ne kuvaavat muodollisen kielen kieliopillista rakennetta ottamatta huomioon kontekstuaalisia riippuvuuksia, mikä tarkoittaa, että tällaisten riippuvuuksien esiintyessä RBNF-kuvaus osoittautuu epätäydelliseksi. , ja jotkin kuvatun kielen syntaksisäännöt on ilmoitettava normaalissa tekstimuodossa. Tämä johtaa siihen, että teksti, joka täsmälleen vastaa RBNF-kielioppia, voi silti olla syntaktisesti virheellistä. Esimerkiksi RBNF-kieliopissa ei ole mahdollista luonnollisesti esittää sitä tosiasiaa, että operaatio vaatii samantyyppisiä operandeja. Tällaiset tarkastukset on suoritettava käsin kirjoitetulla kieliopin analysaattorikoodilla. Toisaalta kontekstiriippuvuuksien määritelmää sisältävät kieliopin kuvausjärjestelmät, esimerkiksi van Wiingaardenin kielioppi , osoittautuvat paljon monimutkaisemmiksi, ja niiden käyttö jäsentimien automaattiseen generointiin osoittautuu vaikeaksi.