LR parsing

grammarboy

LR parsing
« kdy: 23. 01. 2016, 02:24:51 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?


Ivan Nový

Re:LR parsing
« Odpověď #1 kdy: 23. 01. 2016, 08:04:22 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?
Pro silnou LR(k) gramatiku musí platit
Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βX,
(b) A → αX, B → ε, kde X ∈ BEFORE(B),
(c) A → ε, B → ε, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ FOLLOWk(B) = ∅.
2 Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βXγ,
(b) A → ε, B → βXγ, kde X ∈ BEFORE(A),
(c) A → ε, B → γ, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ EFFk(γ · FOLLOWk(B)) = ∅.

pistelak

Re:LR parsing
« Odpověď #2 kdy: 23. 01. 2016, 13:17:36 »
Bh£$×8bapOuNN(*$@%%£$₩(*)

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:LR parsing
« Odpověď #3 kdy: 23. 01. 2016, 16:26:25 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?
Pro silnou LR(k) gramatiku musí platit
Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βX,
(b) A → αX, B → ε, kde X ∈ BEFORE(B),
(c) A → ε, B → ε, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ FOLLOWk(B) = ∅.
2 Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βXγ,
(b) A → ε, B → βXγ, kde X ∈ BEFORE(A),
(c) A → ε, B → γ, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ EFFk(γ · FOLLOWk(B)) = ∅.
A co takhle napsat něco k věci místo trapného copy-paste?

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:LR parsing
« Odpověď #4 kdy: 23. 01. 2016, 16:28:56 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?
Shift-shift konflikt nastat nemůže, takže chyba je v implementaci. V té gramatice je shift-reduce konflikt.


Ivan Nový

Re:LR parsing
« Odpověď #5 kdy: 23. 01. 2016, 18:42:29 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?
Pro silnou LR(k) gramatiku musí platit
Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βX,
(b) A → αX, B → ε, kde X ∈ BEFORE(B),
(c) A → ε, B → ε, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ FOLLOWk(B) = ∅.
2 Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βXγ,
(b) A → ε, B → βXγ, kde X ∈ BEFORE(A),
(c) A → ε, B → γ, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ EFFk(γ · FOLLOWk(B)) = ∅.
A co takhle napsat něco k věci místo trapného copy-paste?

Jen jsem chtěl naznačit, že existují standardní postupy a algoritmy k testování gramatik, které nevhodná pravidla vyloučí nebo transformují. A testem, že daný soubor pravidel vyhovuje LR(k) se při implementaci začíná. Pokud to otestovat nelze, je lepší s takovou gramatikou či jazykem nepracovat, protože neskýtá záruky, že implementace bude spolehlivá. S pravidly typu S ← 'x' S 'x' | 'x' si poradí CYK algoritmus. Ale to bych bral jako poslední možnost, pokud by selhaly transformace na LR(k) původní gramatiky.

Chytrému napověz, hloupého kopni :-)))

Ivan Nový

Re:LR parsing
« Odpověď #6 kdy: 23. 01. 2016, 19:29:11 »
Jinak pravidla můžete transformovat takto.
N -> I
N -> R
I -> n
R -> n . n
---------------
N -> n
N -> n . n
-------------
N1 -> n N2
N2 -> . N3
N2 -> e
N3 ->  n
----------------
a je to LL(1) gramatika

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:LR parsing
« Odpověď #7 kdy: 24. 01. 2016, 12:52:20 »
Implementuju LR parser a na následujícím fragmentu gramatiky mám shift-shift konflikt:

N -> I
N -> R
I -> n
R -> n . n

Je tato gramatika vůbec LR(k)? Pokud ano, jaké budou kernel sety?
Pro silnou LR(k) gramatiku musí platit
Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βX,
(b) A → αX, B → ε, kde X ∈ BEFORE(B),
(c) A → ε, B → ε, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ FOLLOWk(B) = ∅.
2 Pro kazˇdou dvojici pravidel v P
0 ve tvaru
(a) A → αX, B → βXγ,
(b) A → ε, B → βXγ, kde X ∈ BEFORE(A),
(c) A → ε, B → γ, kde X ∈ BEFORE(A), X ∈ BEFORE(B),
platı´ FOLLOWk(A) ∩ EFFk(γ · FOLLOWk(B)) = ∅.
A co takhle napsat něco k věci místo trapného copy-paste?

Jen jsem chtěl naznačit, že existují standardní postupy a algoritmy k testování gramatik, které nevhodná pravidla vyloučí nebo transformují. A testem, že daný soubor pravidel vyhovuje LR(k) se při implementaci začíná. Pokud to otestovat nelze, je lepší s takovou gramatikou či jazykem nepracovat, protože neskýtá záruky, že implementace bude spolehlivá. S pravidly typu S ← 'x' S 'x' | 'x' si poradí CYK algoritmus. Ale to bych bral jako poslední možnost, pokud by selhaly transformace na LR(k) původní gramatiky.

Chytrému napověz, hloupého kopni :-)))
CYK by použil jen vůl.