packages feed

context-free-grammar-0.1.0: tests/Data/Cfg/FirstSetTests.hs

module Data.Cfg.FirstSetTests (
    tests
    ) where

import Data.Cfg.Analysis
import Data.Cfg.Augment
import Data.Cfg.LookaheadSet
import Data.Cfg.TestGrammars
import Test.Framework(Test, testGroup)
import Test.Framework.Providers.HUnit(testCase)
import Test.HUnit(assertEqual)

tests :: Test
tests = testGroup "Data.Cfg.FirstSet" [
    g0FirstSetTest,
    microFirstSetTest
    ]

g0FirstSetTest :: Test
g0FirstSetTest = testCase "g0 first-set test" $ mapM_ f tab
    where
    f :: (String, LookaheadSet String) -> IO ()
    f (nt, expected) = assertEqual msg expected (fs $ AugNT nt)
	where
	msg = "g0: firstSet(" ++ nt ++ ")"

    tab :: [(String, LookaheadSet String)]
    tab = [("e", mkLookaheadSet False $ words "F LPAREN V"),
	   ("prefix", mkLookaheadSet True ["F"]),
	   ("tail", mkLookaheadSet True ["PLUS"])]

    fs :: AugNT String -> LookaheadSet String
    fs = firstSet g0Analysis

microFirstSetTest :: Test
microFirstSetTest = testCase "micro first-set test" $ mapM_ f tab
    where
    f :: (String, LookaheadSet String) -> IO ()
    f (nt, expected) = assertEqual msg expected (fs $ AugNT nt)
	where
	msg = "micro: firstSet(" ++ nt ++ ")"

    tab :: [(String, LookaheadSet String)]
    tab = [
	    ("program", mkLookaheadSet False $ words "BEGIN"),
	    ("statement_list", mkLookaheadSet False $ words "ID READ WRITE"),
	    ("statement", mkLookaheadSet False $ words "ID READ WRITE"),
	    ("statement_tail", mkLookaheadSet True $ words "ID READ WRITE"),
	    ("expression",
		 mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"),
	    ("id_list", mkLookaheadSet False $ words "ID"),
	    ("expr_list",
		 mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"),
	    ("id_tail", mkLookaheadSet True $ words "COMMA"),
	    ("expr_tail", mkLookaheadSet True $ words "COMMA"),
	    ("primary", mkLookaheadSet False $ words "ID INT_LITERAL LPAREN"),
	    ("primary_tail", mkLookaheadSet True $ words "PLUS MINUS"),
            ("add_op", mkLookaheadSet False $ words "PLUS MINUS") ]

    fs :: AugNT String -> LookaheadSet String
    fs = firstSet microAnalysis