Laajennettu selkämuoto - Naura

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 20. helmikuuta 2015 tarkistetusta versiosta . tarkastukset vaativat 12 muokkausta .

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] .

Kuvaus

Päätteet ja ei-päätteet

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ä.

Säännöt

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.

Lausekkeet

Mahdollisten RBNF-rakenteiden joukko on hyvin pieni. Näitä ovat ketjuttaminen, valinta, ehdollinen esiintyminen ja toisto.

Tai kaikki edellä mainitut lyhyesti:

Syntaksiasetukset

Jotkut teokset sisältävät muunneltuja muunnelmia RBNF-syntaksista.

Ehdollinen lauseke = "JOS" , Boolen lauseke , "THEN" , Lauseryhmä , { "ELSIF" , Boolen lauseke , " THEN" , Lauseryhmä }, [ "ELSE" , Lauseryhmä ], " LOPPU "

— sääntö, joka määrittää Modula-2- kielen ehdollisen operaattorin kieliopin , jossa "Ehdollinen operaattori" ja "Operaattoriryhmä" ovat ei-terminaalisia symboleja yhdistetyillä nimillä.

  • BSI-standardi. British Standards Institutionin (BSI) vuonna 1981 hyväksymä EBNF-standardi eroaa Wirthin ehdottamasta versiosta seuraavilla tavoilla:
    • ketjuttaminen osoitetaan pilkulla;
    • säännön määritelmän loppu on merkitty puolipisteellä;
    • Muut kuin lainausmerkeissä olevat välilyönnit säännössä katsotaan merkityksettömiksi.

Rakennusesimerkkejä

RBNF:n muodollinen itsemääräämisoikeus

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.

Numero ja tunniste RBNF:ssä

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.

RBNF ja muita tapoja kuvata muodollisia kielioppeja

RBNF ja BNF

BNF:n ja RBNF:n yhtäläisyydet ja erot käyvät ilmi kuvauksesta. Ero koostuu pääosin kahdesta pääkohdasta:

  1. RBNF:ssä kirjoitussääntöjen syntaksia on yksinkertaistettu: määritelmämerkki " ::=" on korvattu " =":llä ja kulmasulujen käyttö ei-päätteiden erottamiseen on poistettu. Tämän seurauksena mahdollisuus nimetä ei-päätteitä monisanaisilla tunnisteilla on kadonnut, mutta tietue on lyhentynyt. RBNF-syntaksin muunnoksessa, joka merkitsee ketjuttamista pilkulla, voidaan käyttää monisanaisia ​​tunnisteita.
  2. RBNF esittelee kaksi uutta syntaktista elementtiä: ehdollinen esiintyminen (lauseke hakasulkeissa) ja toisto (lauseke kihareissa suluissa).

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:

  • BNF:ssä Listan määrittelevässä säännössä on kaksi vaihtoehtoa - tyhjälle listalle ja mille tahansa muulle. RBNF:ssä ehdollisen esiintymän konstruktion vuoksi tarve kuvata kaksi vaihtoehtoa on kadonnut.
  • BNF:ssä vaadittiin keinotekoisen rekursiivisen säännön IdentList kuvaamista pilkuilla eroteltujen tunnisteiden sarjan kuvaamiseksi. RBNF:ssä toiston rakenteesta johtuen tämä syntaksin fragmentti kirjoitetaan suoraan pääsääntöön ja yksinkertaisemmassa muodossa.
  • Koska RBNF-sääntöä on vain yksi, sen pituus on lyhyempi, eikä se sisällä muunnelmia ja rekursiota, se on paljon helpompi ymmärtää. Luettelon muodon palauttamiseksi annettujen kuvausten mukaisesti, RBNF-kuvauksen tapauksessa riittää, että kirjoitat symbolien arvot peräkkäin, ja BNF-kuvaukselle sinun on määritettävä järjestys joita sääntöjä sovelletaan, ja rakentaa luettelot kullekin vaihtoehdolle (ja niitä on kaksi jokaisessa säännössä).

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 ja syntaksikaaviot

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:n sovellukset, edut ja haitat

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.

Muistiinpanot

  1. ↑ ISO/ IEC 14977  . ISO / IEC (15. joulukuuta 1996). Haettu 20. helmikuuta 2015. Arkistoitu alkuperäisestä 11. maaliskuuta 2007.

Linkit