content: {-
  Abstract syntax for the small subset of GF grammars supported
  in gfse, the JavaScript-based simple grammar editor.
  -}
  module SimpleEditor.Syntax where
  
  type Id    = String -- all sorts of identifiers
  type ModId = Id -- module name
  type Cat   = Id -- category name
  type FunId = Id -- function name
  type Type  = [Cat] -- [Cat_1,...,Cat_n] means Cat_1 -> ... -> Cat_n
  
  data Grammar  = Grammar { basename :: ModId,
                            extends  :: [ModId],
                            abstract :: Abstract,
                            concretes:: [Concrete] }
                  deriving Show
  
  data Abstract = Abstract { startcat:: Cat, cats:: [Cat], funs:: [Fun] }
                  deriving Show
  data Fun      = Fun      { fname:: FunId, ftype:: Type }
                  deriving Show
  
  data Concrete = Concrete { langcode:: Id,
                             opens:: [ModId],
  		           params:: [Param],
  		           lincats:: [Lincat],
  		           opers:: [Oper],
  		           lins:: [Lin] }
                  deriving Show
  
  data Param  = Param  {pname:: Id, prhs:: String}              deriving Show
  data Lincat = Lincat {cat  :: Cat, lintype:: Term}            deriving Show
  data Oper   = Oper   {oname:: Lhs, orhs:: Term}               deriving Show
  data Lin    = Lin    {fun  :: FunId, args:: [Id], lin:: Term} deriving Show
  
  type Lhs = String -- name and type of oper,
                    -- e.g "regN : Str -> { s:Str,g:Gender} ="
  type Term = String -- arbitrary GF term (not parsed by the editor)
  