BNF

Fra Wikipedia, den frie encyklopædi

Backus-Naur form (BNF-form) er en metasyntax, dvs. en formel måde at beskrive formelle sprog.

BNF er en meget udbredt notation til at beskrive grammatikken af programmeringsprog. De fleste lærebøger om teorien bag programmering beskriver programmeringssprog i BNF.

I BNF bruges nogle få simple symboler, som alle kan skrives på en skrivemaskine. Der bruges følgende symboler:

  • < > markerer et begreb, der ikke er beskrevet til bunds.
  • | bruges som "eller".
  •  ::= læses som "består af".

Begreber, der er kendte, skrives som de er.

[redigér] Overblik

BNF er opkaldt efter John Backus og danskeren Peter Naur. De var pionerer i datalogi med speciale i design af compilere. BNF har klare ligheder med Paninis regler for grammatik, og BNF bliver derfor også nogle gange omtalt som Panini-Backus-formen. BNF blev oprindeligt lavet for at kunne beskrive reglerne i ALGOL 60.

[redigér] Eksempler

Beskrivelse af heltal.

<heltal> ::= <positivt heltal> | <nul> | <negativt heltal>
<positivt heltal> ::= <positivt ciffer> | <positivt heltal> <ciffer>
<nul> ::= 0
<negativt heltal> ::= - <positivt heltal>
<ciffer> ::= <positivt ciffer> | <nul>
<positivt ciffer> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Som det fremgår af eksemplet beskrives gentagelser rekursivt. I eksemplet er et positivt heltal beskrevet som et positivt ciffer eller et positivt heltal efterfulgt af et ciffer. Eksempelt viser også nogle af begrænsningerne i BNF. Opremsning af beslægtede værdier er omstændelig, og valgfrie elementer er ikke markerede som sådanne. EBNF løser disse problemer.

Også definitionen af BNF kan opskrives med BNF:

<syntax> ::= <rule> | <rule> <syntax>
<rule> ::= <opt-whitespace> "<" <rule-name> ">" <opt-whitespace> "::=" 
           <opt-whitespace> <expression> <line-end>
<opt-whitespace> ::= " " <opt-whitespace> | ""  
<expression> ::= <list> | <list> "|" <expression>
<line-end> ::= <opt-whitespace> <EOL> | <line-end> <line-end>
<list> ::= <term> | <term> <opt-whitespace> <list>
<term> ::= <literal> | "<" <rule-name> ">"
<literal> ::= '"' <text> '"' | "'" <text> "'" 

Dette understreger virkelig den rekursive natur.

Denne it-artikel er kun påbegyndt. Hvis du ved mere om emnet, kan du hjælpe Wikipedia ved at udvide den.

organisation