Udvidet Backus-Naur form: Forskelle mellem versioner

Content deleted Content added
m linkændr
ændrer EBNF beskrivelser - de splittes i leksikalsk analyse og parser
Tag: Flertydige links
Linje 7:
 
Denne artikel anvender EBNF som specificeret af ISO i eksempler, der gælder for alle EBNF'er. Andre EBNF-varianter anvender lidt andre syntaktiske konventioner.
 
EBNF kan både anvendes i den [[leksikalsk analyse]] (splitter tekststrengen op i ''tokens'' ("sprogatomer") og fjerner [[whitespace]]) - og i [[parser]]en.
 
== Eksempler ==
Line 15 ⟶ 17:
 
===EBNF===
====leksikalske analyse====
Selv EBNF kan beskrives ved at anvende EBNF. Betragt den skitserede grammatik herunder baseret på [[ASCII-tegnsæt]]tet (derfor ingen ÆØÅ. "lhs" står for ''left hand side'' - og "rhs" står for ''right hand side'', som faktisk bliver anvendt som et udtryk i syntaksen.):
Selv EBNF kan beskrives ved at anvende EBNF. Den [[leksikalske analyse]] gør følgende: Input (tegn) fås fra en [[tekstfil]]. Output er tokens med metadata (whitespace smides typisk ud):
 
<syntaxhighlight lang="ebnf-lexical-analysis">
letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
Line 26 ⟶ 29:
| "q" | "r" | "s" | "t" | "u" | "v" | "w"
| "x" | "y" | "z" ;
 
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 
symbol = "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">"
| "'" | '"' | "=" | "|" | "." | "," | ";" ;
 
character = letter | digit | symbol | "_" ;
 
white_space = \t | \n | \r | " " ;
identifier = letter , { letter | digit | "_" } ;
 
terminal = "'" , character , { character } , "'"
| '"' , character , { character } , '"' ;
 
token = symbol | identifier | terminal ;
 
grammar = { white_space } , { token , { white_space } } ;
</syntaxhighlight>
 
====Parser====
Betragt den skitserede grammatik herunder baseret på [[ASCII-tegnsæt]]tet (derfor ingen ÆØÅ). Parser: Input (tokens) fås fra den ovenstående leksikalske analyse. Output er et syntakstræ:
 
<syntaxhighlight lang="ebnf-parser">
lhsexpression = identifier ;
rhs = identifier
| terminal
| "[" , rhsexpression , "]"
| "{" , rhsexpression , "}"
| "(" , rhsexpression , ")"
| rhsexpression , "|" , rhsexpression
| rhsexpression , "," , rhsexpression ;
 
rhslhs = identifier ;
 
rule = lhs , "=" , rhsexpression , ";" ;
 
rule = lhs , "=" , rhs , ";" ;
grammar = { rule } ;
</syntaxhighlight>
Line 50 ⟶ 71:
===Pascal===
 
====Leksikalsk analyse====
A [[Pascal (programmeringssprog)|Pascal]]-lignende programmeringssprog, som kun tillader tildelinger, kan defineres i EBNF med ASCII-tegnsættet som følger:
Et [[Pascal (programmeringssprog)|Pascal]]-lignende programmeringssprog, som kun tillader tildelinger, kan defineres i EBNF med ASCII-tegnsættet som følger. [[Leksikalsk analyse]]: Input (tegn) fås fra en [[tekstfil]]. Output er tokens med metadata (whitespace smides typisk ud):
 
<syntaxhighlight lang="ebnf-lexical-analysis">
 
(* a simple program syntax in EBNF - Wikipedia *)
alphabetic characterletter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
program = 'PROGRAM', white space, identifier, white space,
| "H" | "I" | 'BEGIN',"J" white| space,"K" | "L" | "M" | "N"
| "O" | "P" | {"Q" assignment,| ";R", white| space"S" },| "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" ;
 
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 
white_space = \t | \n | \r | " " ;
 
symbol_no_quotes = "[" | "H]" | "I{" | "J}" | "K(" | "L)" | "M<" | "N>"
| "O=" | "P" | "Q" | "R." | "S," | "T;" | "U";
 
symbol = symbol_no_quotes | "'" | '"' ;
 
visible_characters_no_quotes = letter | digit | symbol_no_quotes | " " ;
 
identifier = alphabeticletter character, { alphabetic characterletter | digit } ;
 
number = [ "-" ] , digit , { digit } ;
 
textstring = '"' , { visible_characters_no_quotes | "'" } , '"' ;
 
token = symbol | identifier | number | textstring ;
 
grammar = { , white_space , } , { token , { , white_space } } ;
</syntaxhighlight>
 
====Parser====
AEt [[Pascal (programmeringssprog)|Pascal]]-lignende programmeringssprog, som kun tillader tildelinger, kan defineres i EBNF med ASCII-tegnsættet som følger. Parser: Input (tokens) fås fra den ovenstående leksikalske analyse. Output er et syntakstræ:
 
<syntaxhighlight lang="ebnf-parser">
 
program = 'PROGRAM', white space, identifier, white space,
'BEGIN',
{ assignment, ";",
'END.' ;
 
identifier = alphabetic character, { alphabetic character | digit } ;
numberassignment = [identifier , "-:=" ], digit,( number | identifier {| digitstring }) ;
 
string = '"' , { all characters - '"' }, '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
white space = ? white space characters ? ;
all characters = ? all visible characters ? ;
</syntaxhighlight>