packages feed

setdown-0.1.3.0: src/SetParser.y

{
module SetParser where

import SetLanguage
import qualified Data.Text.Lazy as TL
-- TODO add precedence of operators
}

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

%token
   '('            { LocatedToken _ LParenTok }
   ')'            { LocatedToken _ RParenTok }
   and            { LocatedToken _ IntersectionTok }
   or             { LocatedToken _ UnionTok }
   diff           { LocatedToken _ DifferenceTok }
   symdiff        { LocatedToken _ SymmetricDifferenceTok }
   identifierDef  { LocatedToken _ (IdentifierDefinitionTok $$) }
   identifier     { LocatedToken _ (IdentifierTok $$) }
   filename       { LocatedToken _ (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 }
         | symdiff { SymmetricDifferenceOp }

{
parseError :: [LocatedToken] -> a
parseError []
   = error "Parse error: unexpected end of input"
parseError (LocatedToken (AlexPn _ line col) t : _)
   = error $ "Parse error at line " ++ show line
          ++ ", column " ++ show col
          ++ ": unexpected \"" ++ prettyToken t ++ "\""

data SetOperator
   = IntersectionOp
   | UnionOp
   | DifferenceOp
   | SymmetricDifferenceOp
   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)
}