Az Extended Backus – Naur Form ( EBNF ) egy formális szintaktikai definíciós rendszer, amelyben egyes szintaktikai kategóriák szekvenciálisan vannak meghatározva másokon keresztül . Kontextusmentes formális nyelvtan leírására szolgál . Javasolta : Niklaus Wirth . Ez a Backus-Naur formák kiterjesztett feldolgozása , a BNF-től "terjedtebb" konstrukciókban különbözik, amelyek ugyanazzal a kifejezőképességgel teszik lehetővé a leírás egyszerűsítését és mennyiségi csökkentését.
Az RBNF számos változatát azonban használják. A Nemzetközi Szabványügyi Szervezet elfogadta az RBNF szabványt: ISO/IEC 14977 [1] .
A BNF-hez hasonlóan a nyelvtani leírás az RBNF-ben is a terminális szimbólumok (terminálok) és a nem terminális szimbólumok (nem terminálok) közötti kapcsolatokat meghatározó szabályok halmaza.
Az RBNF szabálya a következő:
идентификатор = выражение.
ahol az azonosító egy nem terminális szimbólum neve, a kifejezés pedig terminális és nem terminális szimbólumok és speciális karakterek kombinációja, amely megfelel az RBNF szabályoknak. A végén lévő pont egy speciális karakter, amely a szabály végét jelzi.
Az RBNF szabály szemantikája az, hogy az egyenlőségjeltől balra lévő azonosító által megadott nem terminális karakter terminális és nem terminális karakterek kombinációja, amelyeket egy kifejezés határoz meg.
A teljes nyelvtani leírás olyan szabálykészlet, amely szekvenciálisan határozza meg a nyelvtan összes nem terminális szimbólumát, így minden nem terminális szimbólum terminális szimbólumok kombinációjára redukálható a szabályok egymást követő (rekurzív) alkalmazásával. Az RBNF definíciójában nincsenek speciális szabályok a szabályok írási sorrendjére vonatkozóan, bár az RBNF használatakor ilyen előírásokat bevezethetnek olyan szoftvereszközök, amelyek az elemzők automatikus generálását biztosítják a nyelvtani leírásból.
A lehetséges RBNF konstrukciók halmaza nagyon kicsi. Ezek az összefűzés, a kiválasztás, a feltételes előfordulás és az ismétlés.
Vagy röviden a fentiek mindegyike:
Egyes művek az RBNF szintaxis módosított változatait tartalmazzák.
— egy szabály, amely meghatározza a Modula-2 nyelv feltételes operátorának nyelvtanát , ahol a "Feltételes operátor" és az "Üzemeltetők csoportja" összetett nevekkel rendelkező, nem terminális szimbólumok.
Az EBNF-leíró nyelvtan általános formája a következőképpen írható le EBNF-ként:
Szintaxis = { SynthOperator }. SynthOperator = Azonosító "=" SynthExpression "." . SyntExpression = SynTerm { "|" SinTerm }. SynTerm = SyntFactor { SyntFactor }. SynthFactor = azonosító | lánc | "(" SynthExpression ")" | "[" SynthExpression "]" | "{" SynthExpression "}" .Ez a leírás feltételezi, hogy az azonosító és a karakterlánc előre meghatározott kifejezések. Ha szükséges, nem nehéz megírni a definíciójukat az RBNF-ben, ehhez csak egy bizonyos ábécét kell megadni, és ha szükséges, további korlátozásokat kell megadni az azonosító típusára vonatkozóan.
A következő nyelvtanok egy általános tizedes szám jelölését határozzák meg (vezető jellel, lehetséges törtrésszel és kitevővel) és egy tipikus programozási nyelv azonosítóját (betűvel kezdődő betűk, számok és aláhúzásjelek sorozata).
Szám = [ "+" | "-" ] NatNumber [ "." [ NatNumber ]][( "e" | "E" )[ "+" | "-" ] NatNumber ]. NatNumber = számjegy { számjegy }. Számjegy = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" . Ident = Letter { Letter | Számjegy | "_" }.A nem terminális betű definícióját itt a nyilvánvalóság és a nehézkesség miatt nem adjuk meg - az elfogadott ábécé közül való választást jelenti.
A leírásból nyilvánvalóak a hasonlóságok és különbségek a BNF és az RBNF között. A különbség nagyjából két fő pontból áll:
Az első változtatás sikerességéről vagy kudarcáról eltérő vélemények születhetnek, de mindenesetre ez nem befolyásolja a forma kifejező lehetőségeit. De a második újítás nagyon jelentős. Szintén nem ad hozzá alapvetően új kifejezési lehetőségeket (minden, ami RBNF-ben le van írva, megfelelően írható a közönséges BNF-ben), de jelentősen csökkenti és egyszerűsíti a jelölést.
Az RBNF fő előnye a BNF-fel szemben, hogy képes meghatározatlan hosszúságú egyszerű ismétlődő konstrukciókat (listák, karakterláncok, sorozatok stb.) leírni rekurzív szabályok nélkül. Az ismétlési konstrukció hiánya a BNF-ben ahhoz a tényhez vezet, hogy minden ismétlést további köztes, nem terminális szimbólumok és rekurzív szabályok bevezetésével kell meghatározni, ami túl nagy és homályossá teszi a definíciót. Az ismétlések leírása az EBNF-ben rövidebbnek és kényelmesebbnek bizonyul az emberi észlelés számára.
Példaként tekintsük a nem terminális "listát" meghatározó szabályokat, amelyek nullától tetszőleges számú azonosítóból állnak, vesszővel elválasztva (feltételezve, hogy a "RightBracket", "LeftBracket", "Comma" és "Ident" karakterek " már definiáltak).
Az RBNF definíciója csak egy szabályt tartalmaz:
Lista = LeftBracket [ Ident { Comma Ident }] RightBracket .A BNF definíciója így néz ki:
<Lista> ::= <Bal zárójel> <Jobb zárójel> | <Bal zárójel> <IdentList> <RightBracket> <IdentList> ::= <Ident> | <Ident> <Comma> <IdentList>Már ebből a példából is láthatóak az űrlapok közötti különbségek:
Természetesen az RBNF BNF-fel szembeni előnyeinek ára az RBNF leírások automatikus értelmezésének bonyolultabbá tétele. A BNF-et használó formális nyelvtani elemző generátorok egyszerűbbek, mint az RBNF-et használók.
Az RBNF egyenértékű a szintaktikai diagramok alosztályával, amelyeket széles körben használnak a nyelvtan leírására. Bármely RBNF nyelvtan megfelelően ábrázolható szintaktikai diagrammal, de általában a szintaktikai diagramok lehetővé teszik olyan leírások létrehozását, amelyek nem ábrázolhatók RBNF-ben (vagy egyébként nem fordíthatók le közvetlenül RBNF-re a grafikus leírás előzetes konvertálása nélkül). .
Az RBNF-t, akárcsak elődjét, a BNF-et, rendkívül széles körben használják mesterséges nyelvek, elsősorban programozási nyelvek és kapcsolódó jelölési rendszerek leírására. Különösen az RBNF feltalálója, Niklaus Wirth használta ezt a formalizmust könyveiben az összes ott tárgyalt programozási nyelv leírására.
Az RBNF nagyobb bonyolultsága a BNF-hez képest azt a tényt eredményezi, hogy lényegesen kevesebb az RBNF alapú elemző generátor, mint a BNF alapú. Ezek azonban léteznek és érvényesek. Az RBNF a Spirit C++ Parser Framework, a Coco/R, az SLK Parser Generator és néhány más alapja. Az ilyen rendszerekben való használathoz az RBNF szintaxist a BNF szintaxissal megegyező irányban kiterjesztik a yacc vagy bison értelmező generátorok használatakor - az azt feldolgozó kód közvetlenül bekerül a nyelvtani leírásba, és a lexikális elemzővel való interakció valamilyen módon meg van szervezve. . A szabályok szerkezetére további korlátozások is vonatkozhatnak – nem minden RBNF-ben leírható szabály konvertálható hatékonyan kóddá.
Az RBNF abszolút előnyei közé tartozik az egyszerűség (maga az RBNF nyelv mindössze 10 speciális karaktert tartalmaz - háromféle zárójelet, függőleges sávot, egyenlőségjelet és idézőjeleket, esetleg vesszőt; szintaxisát öt szabály határozza meg), elegendő teljesítmény, ill. láthatóság, ami kényelmessé teszi nemcsak automatikus értelmezésre, hanem emberi olvasásra is alkalmas leírások készítését. Az RBNF konstrukcióknak a szintaktikai diagramokhoz való közelsége lehetővé teszi, hogy az utóbbiakat közvetlenül az RBNF leírásából levonjuk.
Az RBNF – akárcsak a BNF – hátrányai közé tartozik, hogy a formális nyelv grammatikai szerkezetét a kontextuális függőségek figyelembevétele nélkül írják le, ami azt jelenti, hogy ilyen függőségek jelenlétében az RBNF leírása hiányosnak bizonyul. , és a leírt nyelv egyes szintaktikai szabályait normál szöveges formában kell megadni. Ez ahhoz a tényhez vezet, hogy az RBNF nyelvtannak pontosan megfelelő szöveg szintaktikailag továbbra is hibás lehet. Például egy RBNF nyelvtanban nem lehet természetesen ábrázolni azt a tényt, hogy egy művelethez azonos típusú operandusok szükségesek. Az ilyen ellenőrzéseket kézzel írt nyelvtani elemző kóddal kell elvégezni. Másrészt a kontextusfüggőségek meghatározását tartalmazó nyelvtani leíró rendszerek, például van Wiingaarden nyelvtana , sokkal bonyolultabbnak bizonyulnak, és az értelmezők automatikus generálására való felhasználásuk is bonyolultnak bizonyul.