platinum-parsing-0.1.0.0: test/PPTest/Builders/Lr1.hs
module PPTest.Builders.Lr1 (specs) where
import qualified Data.Set as Set
import qualified Data.Vector as Vector
import PP
import PP.Builders.Lr1
import Test.Hspec
specs = describe "PPTest.Builders.Lr1" $
it "should build the LR(1) items set collection" $ do
-- Dragon Book (2nd edition, fr), page 240, example 4.54
let rs = ruleSet [Rule "__start" [NonTerm "S", Empty],
Rule "S" [NonTerm "C", NonTerm "C", Empty],
Rule "C" [Term 'c', NonTerm "C", Empty],
Rule "C" [Term 'd', Empty]]
let fs = firstSet rs
let c = collection rs fs :: LrCollection Lr1Item
let e0 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 (Term 'c'),
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 (Term 'd'),
Lr1Item (Rule "C" [Term 'd',Empty]) 0 (Term 'c'),
Lr1Item (Rule "C" [Term 'd',Empty]) 0 (Term 'd'),
Lr1Item (Rule "S" [NonTerm "C",NonTerm "C",Empty]) 0 Empty,
Lr1Item (Rule "__start" [NonTerm "S",Empty]) 0 Empty]
let e1 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 (Term 'c'),
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 (Term 'd'),
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 1 (Term 'c'),
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 1 (Term 'd'),
Lr1Item (Rule "C" [Term 'd',Empty]) 0 (Term 'c'),
Lr1Item (Rule "C" [Term 'd',Empty]) 0 (Term 'd')]
let e2 = [Lr1Item (Rule "C" [Term 'd',Empty]) 1 (Term 'c'),
Lr1Item (Rule "C" [Term 'd',Empty]) 1 (Term 'd')]
let e3 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 Empty,
Lr1Item (Rule "C" [Term 'd',Empty]) 0 Empty,
Lr1Item (Rule "S" [NonTerm "C",NonTerm "C",Empty]) 1 Empty]
let e4 = [Lr1Item (Rule "__start" [NonTerm "S",Empty]) 1 Empty]
let e5 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 2 (Term 'c'),
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 2 (Term 'd')]
let e6 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 0 Empty,
Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 1 Empty,
Lr1Item (Rule "C" [Term 'd',Empty]) 0 Empty]
let e7 = [Lr1Item (Rule "C" [Term 'd',Empty]) 1 Empty]
let e8 = [Lr1Item (Rule "S" [NonTerm "C",NonTerm "C",Empty]) 2 Empty]
let e9 = [Lr1Item (Rule "C" [Term 'c',NonTerm "C",Empty]) 2 Empty]
Vector.length c `shouldBe` 10
Set.toList (c Vector.! 0) `shouldBe` e0
Set.toList (c Vector.! 1) `shouldBe` e1
Set.toList (c Vector.! 2) `shouldBe` e2
Set.toList (c Vector.! 3) `shouldBe` e3
Set.toList (c Vector.! 4) `shouldBe` e4
Set.toList (c Vector.! 5) `shouldBe` e5
Set.toList (c Vector.! 6) `shouldBe` e6
Set.toList (c Vector.! 7) `shouldBe` e7
Set.toList (c Vector.! 8) `shouldBe` e8
Set.toList (c Vector.! 9) `shouldBe` e9