Avatar billede simonvalter Praktikant
12. april 2005 - 10:21 Der er 4 kommentarer og
1 løsning

LALR(1) DFA passer ikke.

Jeg sidder med et meget mystisk problem. Jeg laver en LR(1) DFA for at lave den til LALR(1) men der er ikke nogen states der kan kombineres ud fra hvad jeg kan se.

Problemet her er at ifølge min bog så vil antallet af states i den være det samme som i en LR(0) for den samme grammar efter den er lavet til en LALR(1) men det er den ikke.

Jeg ved det er en del at gå igennem men måske kan i skimte en fejl i fremgangsmåden selv om jeg er ret sikker på den passer ;)

grammar står for oven i en simplificeret udgave.. det er "dangling else problemet"

S'--> S
S --> I
S --> other
I --> if S
I --> if S else S

State 1
S' --> .S, $
S  --> .I, $
S  --> .other, $
I  --> .if S, $
I  --> .if S else S, $

State 2 (from 1, on S)
S' --> S.,$

State 3 (from 1, on I) (from 10, on I)
S --> I., $

State 4 (from 1, on other) (from 10, on other)
S --> other., $

State 5 (from 1, on if) (from 10, on if)
I --> if. S, $
I --> if. S else S, $
S --> .I, $
S --> .other, $
S --> .I, else
S --> .other, else
I --> .if S, $
I --> .if S else S, $
I --> .if S, else
I --> .if S else S, else

State 6 (from 5, on S)
I --> if S.,$
I --> if S. else S, $

State 7 (from 5, on I) (from 9, on I)(from 15, on I)
S --> I.,$
S --> I., else

State 8 (from 5, on other) (from 9, on other)(from 15, on other)
S --> other., $
S --> other., else

State 9 (from 5, on if)(from 15, on if) (self-loop on if)
I --> if. S, $
I --> if. S else S, $
I --> if. S, else
I --> if. S else S, else
S --> .I, $
S --> .other, $
S --> .I, else
S --> .other, else
I --> .if S, $
I --> .if S else S, $
I --> .if S, else
I --> .if S else S, else

State 10 (from 6, on else)
I --> if S else.S, $
S --> .I, $
S --> .other, $
I --> .if S, $
I --> .if S else S, $

State 11 (from 9, on S)
I --> if S., $
I --> if S. else S, $
I --> if S., else
I --> if S. else S, else

State 13 (from 10, on S)
I --> if S else S., $

State 15 (from 11, on else)
I --> if S else.S, $
I --> if S else.S, else
S --> .I, $
S --> .other, $
S --> .I, else
S --> .other, else
I --> .if S, $
I --> .if S else S, $
I --> .if S, else
I --> .if S else S, else

State 16 (from 15, on S)
I --> if S else S., $
I --> if S else S., else
Avatar billede simonvalter Praktikant
12. april 2005 - 10:22 #1
LR(0) for samme grammar har 8 states. min har 14 :(
Avatar billede jpvj Nybegynder
12. april 2005 - 10:24 #2
Af ren nysgerrighed (for jeg aner ikke hvad dig spm. går ud på) - hvad drejer det sig om på jævnt dansk? Er ovenstående et prog. sprog til noget logik kredsløb?
Avatar billede simonvalter Praktikant
12. april 2005 - 10:41 #3
det øverste er en bnf grammatik til et programmeringssprog. ud fra dem er der oprettet lr(1) items og staterne indeholdende de items. og staterne skulle kunne reduceres til lalr(1) som ligner dfa for lr(0) når man ser bort fra lookahead.
dfa er en determenistic finite automata som genkender sproget.
det bruges til at lave en compiler.. hvor denne del er til parseren, en bottom up parser.
Avatar billede simonvalter Praktikant
12. april 2005 - 10:43 #4
men det skal egentligt kun bruges som et eksempel... parseren laver jeg med en parser generator som gør det lidt nemmere.
Avatar billede simonvalter Praktikant
13. april 2005 - 16:22 #5
selv om at bogen og de eksempler der bliver givet siger at de states der kan slås sammen skal være helt identiske i deres items bortest fra lookahead så ser det ud til at passe hvis state 4 og 8 bliver slået sammen (der er godt nok 2 items i den ene og kun 1 i den anden men det er de samme final items.
og det samme gør jeg med state
3 og 7,
5 og 9,
6 og 11,
10 og 15,
13 og 16

og så er den nede på de 8 states som lr(0) også har


lukker og satser på det er rigtigt ;=)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester