packages feed

SyntaxMacros-0.2: examples/LangDef.hs

{-# LANGUAGE  Arrows, DoRec, EmptyDataDecls, FlexibleContexts #-}

module LangDef where

import qualified Data.Set as Set

import Control.Arrow

import UU.Pretty

import Language.Grammars.SyntaxMacros
import Language.Grammars.Grammar

import Language.Grammars.SyntaxMacros.Scanner

import LangSem
import Utils


prds = proc () -> do
         rec  root    <- addNT -<  [  prd (`semAGItf` ()) $ ch_expr<=>exp  <.> prdEnd  ] 

              exp     <- addNT -<  [  prd semLet $ trm "let" <.> ch_lnm<=>var  <.>  trm "=" <.> ch_val<=>exp <.> 
                                                   trm "in"  <.> ch_body<=>exp <.> prdEnd   
                                   ,  prd semAdd $ ch_ae1<=>term <.> trm "+"  <.> ch_ae2<=>exp <.> prdEnd
                                   ,  prdId term  ]
                                 
              term    <- addNT -<  [  prd semMul $ ch_me1<=>term <.> trm "*"  <.> ch_me2<=>factor <.> prdEnd
                                   ,  prdId factor ]

              factor  <- addNT -<  [  prd semCst $ ch_cv<=>int  <.> prdEnd 
                                   ,  prd semVar $ ch_vnm<=>var <.> prdEnd ]

         exportNTs -< Export root $   ntExp     ^=  exp     ^| 
                                      ntTerm    ^=  term    ^|
                                      ntFactor  ^=  factor  ^|  
                                      ntNil 



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