The Extended Backus – Naur Form ( EBNF ) er et formelt syntaksdefinitionssystem, hvor nogle syntaktiske kategorier er sekventielt defineret gennem andre . Bruges til at beskrive kontekstfri formelle grammatikker . Foreslået af Niklaus Wirth . Det er en udvidet bearbejdning af Backus-Naur formerne , adskiller sig fra BNF i mere "rummelige" konstruktioner, som med samme udtryksevne gør det muligt at forenkle og reducere beskrivelsen i volumen.
Der anvendes dog mange forskellige varianter af RBNF. Den Internationale Standardiseringsorganisation har vedtaget RBNF-standarden: ISO/IEC 14977 [1] .
Som i BNF er en grammatikbeskrivelse i RBNF et sæt regler, der definerer relationer mellem terminalsymboler (terminaler) og ikke-terminale symboler (ikke-terminaler).
Reglen i RBNF er:
идентификатор = выражение.
hvor identifikatoren er navnet på et ikke-terminalt symbol, og udtrykket er en kombination af terminal- og ikke-terminalsymboler og specialtegn, der overholder RBNF-reglerne. Prikken i slutningen er et specialtegn, der angiver slutningen af reglen.
RBNF-reglens semantik er, at det ikke-terminale tegn angivet af identifikatoren til venstre for lighedstegnet er en kombination af terminale og ikke-terminale tegn defineret af et udtryk .
En komplet grammatikbeskrivelse er et sæt regler, der sekventielt definerer alle ikke-terminale symboler i grammatikken, således at hvert ikke-terminalsymbol kan reduceres til en kombination af terminalsymboler ved successiv (rekursiv) anvendelse af reglerne. Der er ingen særlige regler i definitionen af RBNF vedrørende den rækkefølge, reglerne er skrevet i, selvom sådanne forskrifter kan indføres ved brug af RBNF af softwareværktøjer, der giver automatisk generering af parsere fra en grammatikbeskrivelse.
Sættet af mulige RBNF-konstruktioner er meget lille. Disse er sammenkædning, selektion, betinget forekomst og gentagelse.
Eller alt ovenstående kort sagt:
Nogle værker indeholder modificerede varianter af RBNF-syntaksen.
— en regel, der specificerer grammatikken for den betingede operator af Modula-2 sproget , hvor "Betinget operator" og "Group of operators" er ikke-terminale symboler med sammensatte navne.
Den generelle form for en EBNF-beskrivelsesgrammatik kan beskrives som EBNF som følger:
Syntaks = { SynthOperator }. SynthOperator = Identifikator "=" SynthExpression "." . SyntExpression = SynTerm { "|" SinTerm }. SynTerm = SyntFactor { SyntFactor }. SynthFactor = identifikator | kæde | "(" SynthExpression ")" | "[" SynthExpression "]" | "{" SynthExpression "}" .Denne beskrivelse antager, at identifikator og streng er foruddefinerede termer. Hvis det ønskes, er det ikke svært at skrive deres definition i RBNF, for dette behøver du kun at angive et bestemt alfabet og om nødvendigt yderligere begrænsninger for typen af identifikator.
Følgende grammatikker definerer notationen af et generelt decimaltal (med et fortegn, en mulig brøkdel og en eksponent) og en typisk programmeringssprogsidentifikator (en sekvens af bogstaver, tal og understregninger, der starter med et bogstav).
Tal = [ "+" | "-" ] NatNumber [ "." [ NatNumber ]][( "e" | "E" )[ "+" | "-" ] NatNumber ]. NatNumber = Digit { Digit }. Ciffer = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" . Ident = Bogstav { Bogstav | Ciffer | "_" }.Definitionen af det ikke-terminale bogstav er ikke givet her på grund af åbenhed og besværlighed - det repræsenterer et valg fra det accepterede alfabet.
Lighederne og forskellene mellem BNF og RBNF er indlysende fra beskrivelsen. Forskellen består stort set i to hovedpunkter:
Der kan være forskellige meninger om succesen eller fiaskoen af den første ændring, men under alle omstændigheder påvirker det ikke formens udtryksmuligheder. Men den anden innovation er meget vigtig. Det tilføjer heller ikke fundamentalt nye udtryksmuligheder (alt, der er skrevet i RBNF, kan skrives tilstrækkeligt i almindelig BNF), men det reducerer og forenkler notationen markant.
Den største fordel ved RBNF frem for BNF er evnen til at beskrive simple gentagne konstruktioner af ubestemt længde (lister, strenge, sekvenser og så videre) uden rekursive regler. Fraværet af gentagelseskonstruktionen i BNF fører til, at enhver gentagelse skal defineres ved at indføre yderligere mellemliggende ikke-terminale symboler og rekursive regler, hvilket gør definitionen for stor og uklar. Beskrivelsen af gentagelser i EBNF viser sig at være både kortere og mere bekvem for menneskelig perception.
Som et eksempel kan du overveje reglerne, der definerer den ikke-terminale "liste", som er et sæt nul til et vilkårligt antal identifikatorer adskilt af kommaer (forudsat at tegnene "Højre parentes", "Venstre parentes", "Komma" og "Ident" "er allerede defineret).
Definitionen i RBNF omfatter kun én regel:
Liste = Venstre parentes [ Ident { Comma Ident }] Højre parentes .Definitionen i BNF ser sådan ud:
<Liste> ::= <Venstre parentes> <Højre parentes> | <LeftBracket> <IdentList> <RightBracket> <IdentList> ::= <Ident> | <Ident> <Komma> <IdentList>Allerede fra dette eksempel er forskellene mellem formerne synlige:
Naturligvis er prisen for fordelene ved RBNF frem for BNF den større kompleksitet ved automatisk fortolkning af RBNF-beskrivelser. Formelle grammatikparsergeneratorer, der bruger BNF, er enklere end dem, der bruger RBNF.
RBNF svarer til en underklasse af syntaksdiagrammer, der er meget brugt til at beskrive grammatikker. Enhver RBNF-grammatik kan repræsenteres tilstrækkeligt af et syntaksdiagram, men generelt giver syntaksdiagrammer dig mulighed for at oprette beskrivelser, der ikke kan repræsenteres i RBNF (eller under alle omstændigheder ikke kan oversættes direkte til RBNF uden først at konvertere den grafiske beskrivelse) .
RBNF er ligesom sin forgænger, BNF, ekstremt udbredt som et middel til at beskrive kunstige sprog, primært programmeringssprog og relaterede notationssystemer. Især opfinderen af RBNF, Niklaus Wirth, brugte denne formalisme i sine bøger til at beskrive alle de programmeringssprog, der betragtes der.
Den højere kompleksitet af RBNF sammenlignet med BNF fører til, at der er signifikant færre parser-generatorer baseret på RBNF end dem, der er baseret på BNF. Men de eksisterer og gælder. RBNF er grundlaget for Spirit C++ Parser Framework, Coco/R, SLK Parser Generator og nogle andre. Til brug i sådanne systemer udvides RBNF-syntaksen i samme retning som BNF-syntaksen, når du bruger yacc- eller bison -parser-generatorerne - koden, der behandler den, indsættes direkte i grammatikbeskrivelsen, og interaktion med den leksikale analysator er på en eller anden måde organiseret . Yderligere begrænsninger kan også blive pålagt reglernes opbygning - ikke alle regler, der kan beskrives i RBNF, kan effektivt konverteres til kode.
De absolutte fordele ved RBNF omfatter enkelhed (selve RBNF-sproget indeholder kun 10 specialtegn - tre typer parenteser, en lodret streg, et lighedstegn og anførselstegn, muligvis et komma; dets syntaks bestemmes af fem regler), tilstrækkelig styrke og synlighed, hvilket gør det bekvemt at lave beskrivelser, der ikke kun er beregnet til automatisk fortolkning, men også til menneskelig læsning. RBNF-konstruktionernes nærhed til syntaktiske diagrammer gør det muligt at trække sidstnævnte direkte fra RBNF-beskrivelsen.
Ulemperne ved RBNF, som faktisk ved BNF, omfatter det faktum, at de beskriver den grammatiske struktur af et formelt sprog uden at tage hensyn til kontekstuelle afhængigheder, hvilket betyder, at RBNF-beskrivelsen viser sig at være ufuldstændig i nærvær af sådanne afhængigheder. , og nogle syntaksregler for det beskrevne sprog skal angives i normal tekstform. Dette fører til, at tekst, der nøjagtigt matcher RBNF-grammatikken, stadig kan være syntaktisk forkert. For eksempel, i en RBNF grammatik, er det ikke muligt naturligt at repræsentere det faktum, at en operation kræver operander af samme type. Sådanne kontroller skal udføres ved hjælp af håndskrevet grammatikanalysatorkode. På den anden side viser grammatikbeskrivelsessystemer, der omfatter definitionen af kontekstafhængigheder, for eksempel van Wiingaardens grammatik , at være meget mere komplicerede, og deres anvendelse til automatisk generering af parsere viser sig at være vanskelig.