{-# OPTIONS -fcontext-stack=100 #-}

{-# LANGUAGE  Arrows, DoRec #-}

module LangDef where

import qualified Data.Set as Set

import Control.Arrow

import Language.Grammars.Murder
import Language.Grammars.Grammar
import Language.Grammars.Grammar.AspectAG

import Language.Grammars.Murder.Scanner

import LangSem
import Utils

import Control.Applicative

import Data.HList

import UU.Pretty.Basic

prds = proc () -> do

         rec     root    <- addNT -<  (iI semAGItf exp Ii)
                 exp     <- addNT -<  (iI semLet "let" var  "=" exp "in" exp Ii) 
                                      <|> 
                                      (iI semAdd exp "+" term Ii)
                                      <|> 
                                      iI term Ii 
                 term    <- addNT -<  (iI semMul term  "*"  factor Ii)
                                      <|>
                                      iI factor Ii
                 factor  <- addNT -<  (iI semCst int Ii)
                                      <|> 
                                      (iI semVar var Ii)

         exportNTs -< exportList root  $   export ntExp     exp 
                                       .   export ntTerm    term 
                                       .   export ntFactor  factor  


{-
gramOpts :: ScanOpts
gramOpts
  =  defaultScanOpts
        {   scoKeywordsTxt      =   Set.fromList ["let", "in"]
        ,   scoSpecChars        =   Set.fromList "=+*"
        ,   scoDollarIdent      =   True
        }
-}