module SampleGrammar where

import CFG

--------------------------------------------------------------------------------
-- [Sample CFG Grammar] : g1 from Example 4.33 in the Dragon book (2nd Ed.)
--------------------------------------------------------------------------------
g1 :: CFG
g1 = String -> [ProductionRule] -> CFG
CFG String
"E'" [ProductionRule
p0,ProductionRule
p1,ProductionRule
p2,ProductionRule
p3,ProductionRule
p4,ProductionRule
p5,ProductionRule
p6]

-- E' -> E
p0 :: ProductionRule
p0 = String -> [Symbol] -> ProductionRule
ProductionRule String
"E'" [String -> Symbol
Nonterminal String
"E"]

-- E -> E + T
p1 :: ProductionRule
p1 = String -> [Symbol] -> ProductionRule
ProductionRule String
"E" [String -> Symbol
Nonterminal String
"E", String -> Symbol
Terminal String
"+", String -> Symbol
Nonterminal String
"T"] 

-- E -> T
p2 :: ProductionRule
p2 = String -> [Symbol] -> ProductionRule
ProductionRule String
"E" [String -> Symbol
Nonterminal String
"T"]

-- T -> T * F
p3 :: ProductionRule
p3 = String -> [Symbol] -> ProductionRule
ProductionRule String
"T" [String -> Symbol
Nonterminal String
"T", String -> Symbol
Terminal String
"*", String -> Symbol
Nonterminal String
"F"]

-- T -> F
p4 :: ProductionRule
p4 = String -> [Symbol] -> ProductionRule
ProductionRule String
"T" [String -> Symbol
Nonterminal String
"F"]

-- F -> ( E )
p5 :: ProductionRule
p5 = String -> [Symbol] -> ProductionRule
ProductionRule String
"F" [String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"E", String -> Symbol
Terminal String
")"]

-- F -> id
p6 :: ProductionRule
p6 = String -> [Symbol] -> ProductionRule
ProductionRule String
"F" [String -> Symbol
Terminal String
"id"]

--------------------------------------------------------------------------------
-- [Sample CFG Grammar] : g2 from Example 4.2 in the Dragon book (2nd Ed.)
--------------------------------------------------------------------------------
g2 :: CFG
g2 = String -> [ProductionRule] -> CFG
CFG String
"S'" [ProductionRule
q1,ProductionRule
q2,ProductionRule
q3,ProductionRule
q4]

q1 :: ProductionRule
q1 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S'" [String -> Symbol
Nonterminal String
"S"]
q2 :: ProductionRule
q2 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S" [String -> Symbol
Nonterminal String
"C", String -> Symbol
Nonterminal String
"C"]
q3 :: ProductionRule
q3 = String -> [Symbol] -> ProductionRule
ProductionRule String
"C" [String -> Symbol
Terminal String
"c", String -> Symbol
Nonterminal String
"C"]
q4 :: ProductionRule
q4 = String -> [Symbol] -> ProductionRule
ProductionRule String
"C" [String -> Symbol
Terminal String
"d"]

--------------------------------------------------------------------------------
-- [Sample CFG Grammar] : g3 from the LF calculus
--------------------------------------------------------------------------------
g3 :: CFG
g3 = String -> [ProductionRule] -> CFG
CFG String
"S'" [ProductionRule
lfp0,ProductionRule
lfp1,ProductionRule
lfp2,ProductionRule
lfp5,ProductionRule
lfp6,ProductionRule
lfp7,ProductionRule
lfp8,ProductionRule
lfp9,ProductionRule
lfp10,ProductionRule
lfp11
              ,ProductionRule
lfp12,ProductionRule
lfp13,ProductionRule
lfp14,ProductionRule
lfp15,ProductionRule
lfp16,ProductionRule
lfp17,ProductionRule
lfp18,ProductionRule
lfp19,ProductionRule
lfp20,ProductionRule
lfp21
              ,ProductionRule
lfp22,ProductionRule
lfp23,ProductionRule
lfp24,ProductionRule
lfp25,ProductionRule
lfp26,ProductionRule
lfp27,ProductionRule
lfp28,ProductionRule
lfp29,ProductionRule
lfp30,ProductionRule
lfp31]

lfp0 :: ProductionRule
lfp0 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S'" [String -> Symbol
Nonterminal String
"Program"]
lfp1 :: ProductionRule
lfp1 = String -> [Symbol] -> ProductionRule
ProductionRule String
"Program" [String -> Symbol
Nonterminal String
"Decl"]

lfp2 :: ProductionRule
lfp2 = String -> [Symbol] -> ProductionRule
ProductionRule String
"Decl" [String -> Symbol
Nonterminal String
"TypeDeclaration", 
                              String -> Symbol
Nonterminal String
"TermDeclaration", 
                              String -> Symbol
Nonterminal String
"DefDeclaration"]

lfp5 :: ProductionRule
lfp5 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TypeDeclaration" 
       [String -> Symbol
Terminal String
"atType", String -> Symbol
Nonterminal String
"TyDecls"]
lfp6 :: ProductionRule
lfp6 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TermDeclaration"
       [String -> Symbol
Terminal String
"atTerm", String -> Symbol
Nonterminal String
"TmDecls"]
lfp7 :: ProductionRule
lfp7 = String -> [Symbol] -> ProductionRule
ProductionRule String
"DefDeclaration" []
lfp8 :: ProductionRule
lfp8 = String -> [Symbol] -> ProductionRule
ProductionRule String
"DefDeclaration"
       [String -> Symbol
Terminal String
"atDef", String -> Symbol
Nonterminal String
"DefDecls"]
       
lfp9 :: ProductionRule
lfp9 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TyDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":", String -> Symbol
Nonterminal String
"K", String -> Symbol
Terminal String
"." ]
lfp10 :: ProductionRule
lfp10 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TyDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":", String -> Symbol
Nonterminal String
"K", String -> Symbol
Terminal String
"."
       , String -> Symbol
Nonterminal String
"TyDecls" ]
       
lfp11 :: ProductionRule
lfp11 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TmDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":", String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
"." ]
lfp12 :: ProductionRule
lfp12 = String -> [Symbol] -> ProductionRule
ProductionRule String
"TmDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":", String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
"."
       , String -> Symbol
Nonterminal String
"TmDecls" ]
       
lfp13 :: ProductionRule
lfp13 = String -> [Symbol] -> ProductionRule
ProductionRule String
"DefDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
"=", String -> Symbol
Nonterminal String
"M", String -> Symbol
Terminal String
"." ]
lfp14 :: ProductionRule
lfp14 = String -> [Symbol] -> ProductionRule
ProductionRule String
"DefDecls"
       [String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
"=", String -> Symbol
Nonterminal String
"M", String -> Symbol
Terminal String
"."
       , String -> Symbol
Nonterminal String
"DefDecls" ]
       
lfp15 :: ProductionRule
lfp15 = String -> [Symbol] -> ProductionRule
ProductionRule String
"K" [String -> Symbol
Terminal String
"Type"]
lfp16 :: ProductionRule
lfp16 = String -> [Symbol] -> ProductionRule
ProductionRule String
"K" [String -> Symbol
Terminal String
"Pi", String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":"
                           , String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
".", String -> Symbol
Nonterminal String
"K"]
lfp17 :: ProductionRule
lfp17 = String -> [Symbol] -> ProductionRule
ProductionRule String
"K" [String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"K", String -> Symbol
Terminal String
")"]        
lfp18 :: ProductionRule
lfp18 = String -> [Symbol] -> ProductionRule
ProductionRule String
"K" [String -> Symbol
Nonterminal String
"A1", String -> Symbol
Terminal String
"arrow", String -> Symbol
Nonterminal String
"K"]

lfp19 :: ProductionRule
lfp19 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A" [String -> Symbol
Terminal String
"Pi", String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":"
                           , String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
".", String -> Symbol
Nonterminal String
"A"]
lfp20 :: ProductionRule
lfp20 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A" [String -> Symbol
Nonterminal String
"A1"]        
lfp21 :: ProductionRule
lfp21 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A" [String -> Symbol
Nonterminal String
"A1", String -> Symbol
Terminal String
"arrow", String -> Symbol
Nonterminal String
"A"]

lfp22 :: ProductionRule
lfp22 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A1" [String -> Symbol
Terminal String
"var"]
lfp23 :: ProductionRule
lfp23 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A1" [String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
")"]
lfp24 :: ProductionRule
lfp24 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A1" [String -> Symbol
Nonterminal String
"A1", String -> Symbol
Terminal String
"var"]
lfp25 :: ProductionRule
lfp25 = String -> [Symbol] -> ProductionRule
ProductionRule String
"A1" [String -> Symbol
Nonterminal String
"A1", String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"M"
                            , String -> Symbol
Terminal String
")"]
        
lfp26 :: ProductionRule
lfp26 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M" [String -> Symbol
Terminal String
"Lam", String -> Symbol
Terminal String
"var", String -> Symbol
Terminal String
":", 
                            String -> Symbol
Nonterminal String
"A", String -> Symbol
Terminal String
".", String -> Symbol
Nonterminal String
"M"]
lfp27 :: ProductionRule
lfp27 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M" [String -> Symbol
Nonterminal String
"M1"]

lfp28 :: ProductionRule
lfp28 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M1" [String -> Symbol
Terminal String
"var"]
lfp29 :: ProductionRule
lfp29 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M1" [String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"M", String -> Symbol
Terminal String
")"]
lfp30 :: ProductionRule
lfp30 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M1" [String -> Symbol
Nonterminal String
"M1", String -> Symbol
Terminal String
"var"]
lfp31 :: ProductionRule
lfp31 = String -> [Symbol] -> ProductionRule
ProductionRule String
"M1" [String -> Symbol
Nonterminal String
"M1", String -> Symbol
Terminal String
"(", String -> Symbol
Nonterminal String
"M",
                             String -> Symbol
Terminal String
")"]
        
type SemRuleName = String
data SemanticRule = SemanticRule SemRuleName [Int]
    
lfs0 :: SemanticRule
lfs0 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs1 :: SemanticRule
lfs1 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs2 :: SemanticRule
lfs2 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs5 :: SemanticRule
lfs5 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs6 :: SemanticRule
lfs6 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs7 :: SemanticRule
lfs7 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []
lfs8 :: SemanticRule
lfs8 = String -> [Int] -> SemanticRule
SemanticRule String
"DoNothing" []

lfs9 :: SemanticRule
lfs9 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclK" [Int
1,Int
3]
lfs10 :: SemanticRule
lfs10 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclK" [Int
1,Int
3]
lfs11 :: SemanticRule
lfs11 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclA" [Int
1,Int
3]
lfs12 :: SemanticRule
lfs12 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclA" [Int
1,Int
3]
lfs13 :: SemanticRule
lfs13 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclM" [Int
1,Int
3]
lfs14 :: SemanticRule
lfs14 = String -> [Int] -> SemanticRule
SemanticRule String
"DeclM" [Int
1,Int
3]

lfs15 :: SemanticRule
lfs15 = String -> [Int] -> SemanticRule
SemanticRule String
"MkType" []
lfs16 :: SemanticRule
lfs16 = String -> [Int] -> SemanticRule
SemanticRule String
"MkPiK" [Int
2,Int
4,Int
6]
lfs17 :: SemanticRule
lfs17 = String -> [Int] -> SemanticRule
SemanticRule String
"ReturnK" [Int
2]
lfs18 :: SemanticRule
lfs18 = String -> [Int] -> SemanticRule
SemanticRule String
"MkArrowK" [Int
1,Int
3]
lfs19 :: SemanticRule
lfs19 = String -> [Int] -> SemanticRule
SemanticRule String
"MkPiA" [Int
2,Int
4,Int
6]
lfs20 :: SemanticRule
lfs20 = String -> [Int] -> SemanticRule
SemanticRule String
"ReturnA" [Int
1]
lfs21 :: SemanticRule
lfs21 = String -> [Int] -> SemanticRule
SemanticRule String
"MkArrowA" [Int
1,Int
3]
lfs22 :: SemanticRule
lfs22 = String -> [Int] -> SemanticRule
SemanticRule String
"MkName" [Int
1]
lfs23 :: SemanticRule
lfs23 = String -> [Int] -> SemanticRule
SemanticRule String
"ReturnA" [Int
2]
lfs24 :: SemanticRule
lfs24 = String -> [Int] -> SemanticRule
SemanticRule String
"MkAppA" [Int
1,Int
2]
lfs25 :: SemanticRule
lfs25 = String -> [Int] -> SemanticRule
SemanticRule String
"MkAppA" [Int
1,Int
3]
lfs26 :: SemanticRule
lfs26 = String -> [Int] -> SemanticRule
SemanticRule String
"MkLamM" [Int
2,Int
4,Int
6]
lfs27 :: SemanticRule
lfs27 = String -> [Int] -> SemanticRule
SemanticRule String
"ReturnM" [Int
1]
lfs28 :: SemanticRule
lfs28 = String -> [Int] -> SemanticRule
SemanticRule String
"MkName" [Int
1]
lfs29 :: SemanticRule
lfs29 = String -> [Int] -> SemanticRule
SemanticRule String
"ReturnM" [Int
2]
lfs30 :: SemanticRule
lfs30 = String -> [Int] -> SemanticRule
SemanticRule String
"MkAppM" [Int
1,Int
2]
lfs31 :: SemanticRule
lfs31 = String -> [Int] -> SemanticRule
SemanticRule String
"MkAppM" [Int
1,Int
3]

-- The attributes of terminals in g3
g3_attrib_terminals :: [(String, String)]
g3_attrib_terminals =
  [ (String
"Type",   String
"TYPE")
  , (String
"Pi",     String
"PI")
  , (String
"Lam",    String
"LAM")
  , (String
":",      String
"COLON")
  , (String
".",      String
"DOT")
    
  , (String
"(",      String
"OPEN")
  , (String
")",      String
"CLOSE")
  , (String
"=",      String
"EQ")
  , (String
"arrow",  String
"ARROW")
  , (String
"atType", String
"ATTYPE")
  
  , (String
"atTerm", String
"ATTERM")
  , (String
"atDef",  String
"ATDEF")  
  , (String
"var",    String
"VAR")
  , (String
"num",    String
"NUM")
  ]



g4 :: CFG
g4 :: CFG
g4 = String -> [ProductionRule] -> CFG
CFG String
"S'" [ ProductionRule
g4_0, ProductionRule
g4_s1, ProductionRule
g4_s2, ProductionRule
g4_l1, ProductionRule
g4_l2, ProductionRule
g4_r ]
  where
    g4_0 :: ProductionRule
g4_0 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S'" [String -> Symbol
Nonterminal String
"S"]
    g4_s1 :: ProductionRule
g4_s1 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S" [ String -> Symbol
Nonterminal String
"L", String -> Symbol
Terminal String
"=", String -> Symbol
Nonterminal String
"R" ]
    g4_s2 :: ProductionRule
g4_s2 = String -> [Symbol] -> ProductionRule
ProductionRule String
"S" [ String -> Symbol
Nonterminal String
"R" ]
    g4_l1 :: ProductionRule
g4_l1 = String -> [Symbol] -> ProductionRule
ProductionRule String
"L" [ String -> Symbol
Terminal String
"*", String -> Symbol
Nonterminal String
"R" ]
    g4_l2 :: ProductionRule
g4_l2 = String -> [Symbol] -> ProductionRule
ProductionRule String
"L" [ String -> Symbol
Terminal String
"id" ]
    g4_r :: ProductionRule
g4_r = String -> [Symbol] -> ProductionRule
ProductionRule String
"R" [ String -> Symbol
Nonterminal String
"L" ]