LL(k)-sprog er en klasse af formelle sprog, der kan parses ved hjælp af en top-down-parsingteknik kendt som LL(k)-parsing. Inden for beregningsmæssig kompleksitetsteori spiller LL(k)-parsing en vigtig rolle i analysen og forståelsen af kontekstfri grammatik og sprog.
For at forstå LL(k)-sprog skal vi først forstå begrebet kontekstfri grammatik (CFG'er). En CFG er en formel grammatik, der beskriver syntaksen af et sprog ved at specificere et sæt produktionsregler. Disse regler definerer, hvordan ikke-terminale symboler kan omskrives som sekvenser af terminale og ikke-terminale symboler. En CFG består af et sæt produktionsregler, et startsymbol og et sæt terminal- og ikke-terminalsymboler.
Et LL(k)-sprog er et kontekstfrit sprog, der kan parses ved hjælp af en LL(k)-parser. En LL(k)-parser er en top-down-parser, der læser input fra venstre mod højre, konstruerer en afledning længst til venstre af inputtet og bruger et fast antal (k) af lookahead-symboler til at træffe parsingsbeslutninger. "LL" står for Left-to-right, Leftmost afledning, mens "k" repræsenterer antallet af lookahead-symboler.
LL(k)-parsing er baseret på en forudsigelig parsing-tabel, der er konstrueret ud fra den givne CFG. Denne tabel omtales ofte som en LL(k)-parsing-tabel eller en LL(k)-parsing-automat. Tabellen indeholder produktionsregler og handlinger for hver kombination af ikke-terminal symbol og lookahead symbol. Handlingerne kan enten være en forudsigelse (angiver hvilken produktionsregel der skal anvendes) eller en fejl (der angiver en syntaksfejl i input).
LL(k)-parsingalgoritmen starter med en tom stak og startsymbolet øverst. Den sammenligner gentagne gange lookahead-symbolet med toppen af stakken og udfører den tilsvarende handling fra parsingstabellen. Hvis handlingen er en forudsigelse, erstatter den det ikke-terminale symbol på toppen af stakken med højre side af den valgte produktionsregel. Hvis handlingen er en fejl, signalerer den en syntaksfejl i inputtet.
Parsingsprocessen fortsætter, indtil stakken er tom, og alle inputsymboler er blevet brugt. Hvis parsingen lykkes, betyder det, at inputstrengen tilhører LL(k)-sproget defineret af CFG. Ellers rapporteres en syntaksfejl.
Lad os illustrere dette med et eksempel. Overvej følgende CFG:
S -> aSb | ε
Denne CFG beskriver et sprog, der består af strenge med formen "a^nb^n" (hvor n >= 0). For at parse dette sprog ved hjælp af LL(1)-parsing, konstruerer vi LL(1)-parsingtabellen:
| en | b | $ |
-------
S | aSb| | ε |
Her er det ikke-terminale S forbundet med tre mulige handlinger: aSb (hvis lookahead-symbolet er 'a'), ε (hvis lookahead-symbolet er 'b') og ε (hvis lookahead-symbolet er '$', angiver slutningen af input).
Antag, at vi ønsker at parse inputstrengen "aaabbb". Parsingprocessen ville forløbe som følger:
Stak | Indtastning | Handling
------------
S | aaabbb$ | forudsigelse: aSb
aSb | aaabbb$ | match: 'a'
Sb | aabbb$ | forudsigelse: aSb
aSb | aabbb$ | match: 'a'
Sb | abbb$ | forudsigelse: aSb
aSb | abbb$ | match: 'a'
Sb | bbb$ | forudsigelse: ε
ε | bbb$ | match: 'b'
b | bb$ | match: 'b'
ε | b$ | match: 'b'
ε | $ | match: '$'
I dette eksempel parser LL(1)-parseren med succes inputstrengen "aaabbb" i overensstemmelse med den givne CFG.
LL(k)-sprog er en klasse af kontekstfrie sprog, der kan parses ved hjælp af en LL(k)-parser. LL(k)-parsing er en top-down-parsingteknik, der bruger et fast antal lookahead-symboler til at træffe parsingbeslutninger. Ved at konstruere en LL(k)-parsing-tabel kan parseren forudsige den næste produktionsregel, der skal anvendes, baseret på det aktuelle ikke-terminale symbol og lookahead-symbol. Denne parsingteknik er grundlæggende i analysen og forståelsen af kontekstfri grammatik og sprog.
Andre seneste spørgsmål og svar vedr Kontekstfri grammatik og sprog:
- Kan regulære sprog udgøre en delmængde af kontekstfri sprog?
- Kan ethvert kontekstfrit sprog være i P-kompleksitetsklassen?
- Kan problemet med at to grammatikker er ligeværdige afgøres?
- Er kontekstfrie sprog genereret af kontekstfri grammatikker?
- Hvorfor er LR(k) og LL(k) ikke ækvivalente?
- Hvorfor er det vigtigt at forstå kontekstfri sprog og grammatik inden for cybersikkerhed?
- Hvordan kan det samme kontekstfri sprog beskrives af to forskellige grammatikker?
- Forklar reglerne for det ikke-terminale B i den anden grammatik.
- Beskriv reglerne for det ikke-terminale A i den første grammatik.
- Hvad er et kontekstfrit sprog, og hvordan genereres det?
Se flere spørgsmål og svar i Context Free Grammars and Languages