packages feed

setdown-0.1.0.0: SetParser.y

{
module SetParser where

import SetLanguage
import qualified Data.Text.Lazy as TL
-- TODO add precidence of operators
-- TODO add comments to the language
-- TODO The tokens should come with line number information so that we can better pinpoint errors.
}

%name parseSetLanguage
%tokentype { SetToken }
%error { parseError }

%token
   '('            { LParenTok }
   ')'            { RParenTok }
   and            { IntersectionTok }
   or             { UnionTok }
   diff           { DifferenceTok }
   identifierDef  { IdentifierDefinitionTok $$ }
   identifier     { IdentifierTok $$ }
   filename       { FilenameTok $$ }

%%

definitions : definition               { [$1] }
            | definitions definition   { $2 : $1 }

definition : identifierDef exp         { Definition (Identifier $1) $2 }

exp : baseexp                          { $1 }
    | brackexp                         { $1 }
    | baseorbrack operator baseorbrack { BinaryExp $2 $1 $3 }

baseorbrack : baseexp        { $1 }
            | brackexp       { $1 }

brackexp : '(' exp ')'       { BrackExp $2 }

baseexp : filename           { FilenameExp $1 }
        | identifier         { IdentifierExp (Identifier $1) }

operator : and    { IntersectionOp }
         | or     { UnionOp }
         | diff   { DifferenceOp }

{
parseError :: [SetToken] -> a
parseError tokens = error $ "Parse error: " ++ show tokens

data SetOperator 
   = IntersectionOp
   | UnionOp
   | DifferenceOp
   deriving(Show, Eq)

data Identifier = Identifier
   { idName :: TL.Text
   } deriving(Show, Eq)

data Expression
   = BinaryExp SetOperator Expression Expression
   | BrackExp Expression
   | FilenameExp FilePath
   | IdentifierExp Identifier
   deriving(Show, Eq)

data Definition = Definition Identifier Expression deriving (Show, Eq)
}