{- |
Module      :  ./QVTR/Parser.hs
Description :  QVT-Relational syntax parser
Copyright   :  (c) Daniel Calegari Universidad de la Republica, Uruguay 2013
License     :  GPLv2 or higher, see LICENSE.txt
Maintainer  :  dcalegar@fing.edu.uy
Stability   :  provisional
Portability :  portable
-}


module QVTR.Parser where


import qualified QVTR.As as QVTR
import qualified CSMOF.As as CSMOF

import Text.ParserCombinators.Parsec

import Common.Parsec


{- Parse a QVTR model transformation
<transformation> ::= <header>
'{' <keyDecl>* <relation>* '}' -}

pTransformation :: CharParser st QVTR.Transformation
pTransformation :: CharParser st Transformation
pTransformation = do
  CharParser st ()
forall st. CharParser st ()
skip
  (name :: String
name, souMeta :: (String, String, Metamodel)
souMeta, tarMeta :: (String, String, Metamodel)
tarMeta) <- CharParser
  st
  (String, (String, String, Metamodel), (String, String, Metamodel))
forall st.
CharParser
  st
  (String, (String, String, Metamodel), (String, String, Metamodel))
pTransfHeader
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
  CharParser st ()
forall st. CharParser st ()
skip
  [Key]
keys <- ParsecT String st Identity Key -> ParsecT String st Identity [Key]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity Key -> ParsecT String st Identity Key
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity Key
forall st. CharParser st Key
pKeyDecl)
  CharParser st ()
forall st. CharParser st ()
skip
  [Relation]
relations <- ParsecT String st Identity Relation
-> ParsecT String st Identity [Relation]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity Relation
-> ParsecT String st Identity Relation
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity Relation
forall st. CharParser st Relation
pRelation)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
  CharParser st ()
forall st. CharParser st ()
skip
  CharParser st ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
  Transformation -> CharParser st Transformation
forall (m :: * -> *) a. Monad m => a -> m a
return (String
-> (String, String, Metamodel)
-> (String, String, Metamodel)
-> [Key]
-> [Relation]
-> Transformation
QVTR.Transformation
            String
name
            (String, String, Metamodel)
souMeta
            (String, String, Metamodel)
tarMeta
            [Key]
keys
            [Relation]
relations
         )


{- Parse a transformation header without source and target CSMOF.Metamodel (just names)
<header> ::= 'transformation' <identifier>
'(' <modelDecl> ',' <modelDecl> ')'
<modelDecl> ::= <modelId> ':' <metaModelId>
<modelId> ::= <identifier>
<metaModelId> ::= <identifier> -}

pTransfHeader :: CharParser st (String, (String, String, CSMOF.Metamodel),
                                (String, String, CSMOF.Metamodel))
pTransfHeader :: CharParser
  st
  (String, (String, String, Metamodel), (String, String, Metamodel))
pTransfHeader = do
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "transformation"
  CharParser st ()
forall st. CharParser st ()
skip
  String
name <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  [[String]]
list <- CharParser st [[String]] -> CharParser st [[String]]
forall st a. CharParser st a -> CharParser st a
pBetParent (CharParser st [[String]] -> CharParser st [[String]])
-> CharParser st [[String]] -> CharParser st [[String]]
forall a b. (a -> b) -> a -> b
$ CharParser st [String] -> CharParser st [[String]]
forall st a. CharParser st a -> CharParser st [a]
pCommaSep (CharParser st [String] -> CharParser st [[String]])
-> CharParser st [String] -> CharParser st [[String]]
forall a b. (a -> b) -> a -> b
$ CharParser st String -> CharParser st [String]
forall st a. CharParser st a -> CharParser st [a]
pColonSep (CharParser st ()
forall st. CharParser st ()
skip CharParser st () -> CharParser st String -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CharParser st String
forall st. CharParser st String
pIdentifier CharParser st String -> CharParser st () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< CharParser st ()
forall st. CharParser st ()
skip)
  (String, (String, String, Metamodel), (String, String, Metamodel))
-> CharParser
     st
     (String, (String, String, Metamodel), (String, String, Metamodel))
forall (m :: * -> *) a. Monad m => a -> m a
return ( String
name,
            ([String] -> String
forall a. [a] -> a
head ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [[String]] -> [String]
forall a. [a] -> a
head [[String]]
list, [String] -> String
forall a. [a] -> a
head ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
forall a. [a] -> [a]
tail ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [[String]] -> [String]
forall a. [a] -> a
head [[String]]
list, Metamodel
emptyMetamodel),
            ([String] -> String
forall a. [a] -> a
head ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [[String]] -> [String]
forall a. [a] -> a
head ([[String]] -> [String]) -> [[String]] -> [String]
forall a b. (a -> b) -> a -> b
$ [[String]] -> [[String]]
forall a. [a] -> [a]
tail [[String]]
list, [String] -> String
forall a. [a] -> a
head ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
forall a. [a] -> [a]
tail ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [[String]] -> [String]
forall a. [a] -> a
head ([[String]] -> [String]) -> [[String]] -> [String]
forall a b. (a -> b) -> a -> b
$ [[String]] -> [[String]]
forall a. [a] -> [a]
tail [[String]]
list, Metamodel
emptyMetamodel)
         )


emptyMetamodel :: CSMOF.Metamodel
emptyMetamodel :: Metamodel
emptyMetamodel = String -> [NamedElement] -> [Model] -> Metamodel
CSMOF.Metamodel "" [] []


{- Parse keys of the transfromation
<keyDecl> ::= 'key' <classId> '{' <keyProperty> (, <keyProperty>)* '}' ';' -}
pKeyDecl :: CharParser st QVTR.Key
pKeyDecl :: CharParser st Key
pKeyDecl = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "key"
  CharParser st ()
forall st. CharParser st ()
skip
  (String, String)
classId <- CharParser st (String, String)
forall st. CharParser st (String, String)
pClassId
  CharParser st ()
forall st. CharParser st ()
skip
  [PropKey]
list <- CharParser st [PropKey] -> CharParser st [PropKey]
forall st a. CharParser st a -> CharParser st a
pBetBraces (CharParser st [PropKey] -> CharParser st [PropKey])
-> CharParser st [PropKey] -> CharParser st [PropKey]
forall a b. (a -> b) -> a -> b
$ CharParser st PropKey -> CharParser st [PropKey]
forall st a. CharParser st a -> CharParser st [a]
pCommaSep (CharParser st ()
forall st. CharParser st ()
skip CharParser st () -> CharParser st PropKey -> CharParser st PropKey
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CharParser st PropKey
forall st. CharParser st PropKey
pKeyProperty CharParser st PropKey -> CharParser st () -> CharParser st PropKey
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< CharParser st ()
forall st. CharParser st ()
skip)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  Key -> CharParser st Key
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> String -> [PropKey] -> Key)
-> (String, String) -> [PropKey] -> Key
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> String -> [PropKey] -> Key
QVTR.Key (String, String)
classId [PropKey]
list) -- ToDo


-- <classId> ::= <identifier> '::' <identifier>
pClassId :: CharParser st (String, String)
pClassId :: CharParser st (String, String)
pClassId = do
  String
met <- CharParser st String
forall st. CharParser st String
pIdentifier
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
  String
typ <- CharParser st String
forall st. CharParser st String
pIdentifier
  (String, String) -> CharParser st (String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
met, String
typ)


{- <keyProperty> ::= <identifier>
'opposite' '(' <identifier> '.' <identifier> ')' -}
pKeyProperty :: CharParser st QVTR.PropKey
pKeyProperty :: CharParser st PropKey
pKeyProperty = do
    String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "opposite"
    CharParser st ()
forall st. CharParser st ()
skip
    (String, String)
oppo <- CharParser st (String, String) -> CharParser st (String, String)
forall st a. CharParser st a -> CharParser st a
pBetParent CharParser st (String, String)
forall st. CharParser st (String, String)
pFullName
    PropKey -> CharParser st PropKey
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> String -> PropKey) -> (String, String) -> PropKey
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> String -> PropKey
QVTR.OppositeProp (String, String)
oppo)
  CharParser st PropKey
-> CharParser st PropKey -> CharParser st PropKey
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    do
    CharParser st ()
forall st. CharParser st ()
skip
    String
ident <- CharParser st String
forall st. CharParser st String
pIdentifier
    PropKey -> CharParser st PropKey
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> PropKey
QVTR.SimpleProp String
ident)


-- <identifier> '.' <identifier>
pFullName :: CharParser st (String, String)
pFullName :: CharParser st (String, String)
pFullName = do
  String
cla <- CharParser st String
forall st. CharParser st String
pIdentifier
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '.'
  String
typ <- CharParser st String
forall st. CharParser st String
pIdentifier
  (String, String) -> CharParser st (String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
cla, String
typ)


{- Parse transformation rules
<relation> ::= ['top'] 'relation' <identifier>
'{'
<varDeclaration>*
<primitiveTypeDomain>*
<domain> <domain>
[<when>] [<where>]
'}' -}

pRelation :: CharParser st QVTR.Relation
pRelation :: CharParser st Relation
pRelation = do
  CharParser st ()
forall st. CharParser st ()
skip
  Bool
top <- CharParser st Bool
forall st. CharParser st Bool
pIsTop
  CharParser st ()
forall st. CharParser st ()
skip
  String
iden <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
  CharParser st ()
forall st. CharParser st ()
skip
  [[RelVar]]
varSet <- ParsecT String st Identity [RelVar]
-> ParsecT String st Identity [[RelVar]]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity [RelVar]
-> ParsecT String st Identity [RelVar]
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity [RelVar]
forall st. CharParser st [RelVar]
pVarDeclaration)
  CharParser st ()
forall st. CharParser st ()
skip
  [PrimitiveDomain]
primDom <- ParsecT String st Identity PrimitiveDomain
-> ParsecT String st Identity [PrimitiveDomain]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity PrimitiveDomain
-> ParsecT String st Identity PrimitiveDomain
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity PrimitiveDomain
forall st. CharParser st PrimitiveDomain
pPrimitiveTypeDomain)
  CharParser st ()
forall st. CharParser st ()
skip
  Domain
sourceDom <- CharParser st Domain
forall st. CharParser st Domain
pDomain
  CharParser st ()
forall st. CharParser st ()
skip
  Domain
targetDom <- CharParser st Domain
forall st. CharParser st Domain
pDomain
  CharParser st ()
forall st. CharParser st ()
skip
  Maybe WhenWhere
whenCon <- Maybe WhenWhere
-> ParsecT String st Identity (Maybe WhenWhere)
-> ParsecT String st Identity (Maybe WhenWhere)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Maybe WhenWhere
forall a. Maybe a
Nothing ParsecT String st Identity (Maybe WhenWhere)
forall st. CharParser st (Maybe WhenWhere)
pWhen
  CharParser st ()
forall st. CharParser st ()
skip
  Maybe WhenWhere
whereCon <- Maybe WhenWhere
-> ParsecT String st Identity (Maybe WhenWhere)
-> ParsecT String st Identity (Maybe WhenWhere)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Maybe WhenWhere
forall a. Maybe a
Nothing ParsecT String st Identity (Maybe WhenWhere)
forall st. CharParser st (Maybe WhenWhere)
pWhere
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
  Relation -> CharParser st Relation
forall (m :: * -> *) a. Monad m => a -> m a
return ( Bool
-> String
-> [RelVar]
-> [PrimitiveDomain]
-> Domain
-> Domain
-> Maybe WhenWhere
-> Maybe WhenWhere
-> Relation
QVTR.Relation Bool
top String
iden ([[RelVar]] -> [RelVar]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[RelVar]]
varSet)
                     [PrimitiveDomain]
primDom Domain
sourceDom Domain
targetDom Maybe WhenWhere
whenCon Maybe WhenWhere
whereCon )

-- Parse if a relation is top or not
pIsTop :: CharParser st Bool
pIsTop :: CharParser st Bool
pIsTop = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "top"
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "relation"
  Bool -> CharParser st Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
  CharParser st Bool -> CharParser st Bool -> CharParser st Bool
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  do CharParser st ()
forall st. CharParser st ()
skip
     String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "relation"
     Bool -> CharParser st Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False


{- Parse var declaration
<varDeclaration> ::= <identifier> (, <identifier>)* ':' <TypeCS> ';' -}

pVarDeclaration :: CharParser st [QVTR.RelVar]
pVarDeclaration :: CharParser st [RelVar]
pVarDeclaration = do
  CharParser st ()
forall st. CharParser st ()
skip
  [String]
vars <- CharParser st String -> CharParser st [String]
forall st a. CharParser st a -> CharParser st [a]
pCommaSep (CharParser st ()
forall st. CharParser st ()
skip CharParser st () -> CharParser st String -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CharParser st String
forall st. CharParser st String
pIdentifier CharParser st String -> CharParser st () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< CharParser st ()
forall st. CharParser st ()
skip)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
  CharParser st ()
forall st. CharParser st ()
skip
  String
typ <- CharParser st String
forall st. CharParser st String
pTypeCS
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  [RelVar] -> CharParser st [RelVar]
forall (m :: * -> *) a. Monad m => a -> m a
return ( (String -> RelVar) -> [String] -> [RelVar]
forall a b. (a -> b) -> [a] -> [b]
map (String -> String -> RelVar
QVTR.RelVar String
typ) [String]
vars )


{- <TypeCS> ::= <identifier> '::' <identifier>
<identifier> -}

pTypeCS :: CharParser st String
pTypeCS :: CharParser st String
pTypeCS =
  CharParser st String -> CharParser st String
forall tok st a. GenParser tok st a -> GenParser tok st a
try (do String
typ <- CharParser st String
forall st. CharParser st String
pIdentifier
          CharParser st ()
forall st. CharParser st ()
skip
          ParsecT String st Identity Char -> CharParser st ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':')
          String -> CharParser st String
forall (m :: * -> *) a. Monad m => a -> m a
return String
typ
         )
  CharParser st String
-> CharParser st String -> CharParser st String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  do
    String
_ <- CharParser st String
forall st. CharParser st String
pIdentifier
    Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
    Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
    CharParser st String
forall st. CharParser st String
pIdentifier


{- Parse primitive domain
<primitiveTypeDomain> ::= 'primitive' 'domain' <identifier> ':' <TypeCS> ';' -}

pPrimitiveTypeDomain :: CharParser st QVTR.PrimitiveDomain
pPrimitiveTypeDomain :: CharParser st PrimitiveDomain
pPrimitiveTypeDomain = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "primitive"
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "domain"
  CharParser st ()
forall st. CharParser st ()
skip
  String
nam <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
  CharParser st ()
forall st. CharParser st ()
skip
  String
typ <- CharParser st String
forall st. CharParser st String
pTypeCS
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  PrimitiveDomain -> CharParser st PrimitiveDomain
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> String -> PrimitiveDomain
QVTR.PrimitiveDomain String
nam String
typ )


-- <domain> ::= 'domain' <modelId> <template> ';'

pDomain :: CharParser st QVTR.Domain
pDomain :: CharParser st Domain
pDomain = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "checkonly" CharParser st () -> CharParser st () -> CharParser st ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "enforce"
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "domain"
  CharParser st ()
forall st. CharParser st ()
skip
  String
modelId <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  ObjectTemplate
tem <- CharParser st ObjectTemplate
forall st. CharParser st ObjectTemplate
pTemplate
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  Domain -> CharParser st Domain
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> ObjectTemplate -> Domain
QVTR.Domain String
modelId ObjectTemplate
tem )


{- <template> ::= <objectTemplate>
<objectTemplate> ::= <identifier> ':' <pathNameCS>
'{' [<propertyTemplateList>] '}' -}

pTemplate :: CharParser st QVTR.ObjectTemplate
pTemplate :: CharParser st ObjectTemplate
pTemplate = do
  CharParser st ()
forall st. CharParser st ()
skip
  String
ide <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'
  CharParser st ()
forall st. CharParser st ()
skip
  (String, String)
typ <- CharParser st (String, String)
forall st. CharParser st (String, String)
pClassId
  CharParser st ()
forall st. CharParser st ()
skip
  [PropertyTemplate]
tempList <- CharParser st [PropertyTemplate]
-> CharParser st [PropertyTemplate]
forall st a. CharParser st a -> CharParser st a
pBetBraces (CharParser st [PropertyTemplate]
 -> CharParser st [PropertyTemplate])
-> CharParser st [PropertyTemplate]
-> CharParser st [PropertyTemplate]
forall a b. (a -> b) -> a -> b
$ [PropertyTemplate]
-> CharParser st [PropertyTemplate]
-> CharParser st [PropertyTemplate]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] CharParser st [PropertyTemplate]
forall st. CharParser st [PropertyTemplate]
pPropertyTemplateList
  CharParser st ()
forall st. CharParser st ()
skip
  ObjectTemplate -> CharParser st ObjectTemplate
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> String -> [PropertyTemplate] -> ObjectTemplate)
-> (String, String) -> [PropertyTemplate] -> ObjectTemplate
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (String -> String -> String -> [PropertyTemplate] -> ObjectTemplate
QVTR.ObjectTemplate String
ide) (String, String)
typ [PropertyTemplate]
tempList )


-- <propertyTemplateList> ::= <propertyTemplate> (',' <propertyTemplate>)*

pPropertyTemplateList :: CharParser st [QVTR.PropertyTemplate]
pPropertyTemplateList :: CharParser st [PropertyTemplate]
pPropertyTemplateList = do
  CharParser st ()
forall st. CharParser st ()
skip
  CharParser st [PropertyTemplate]
-> CharParser st [PropertyTemplate]
forall tok st a. GenParser tok st a -> GenParser tok st a
try (CharParser st [PropertyTemplate]
 -> CharParser st [PropertyTemplate])
-> CharParser st [PropertyTemplate]
-> CharParser st [PropertyTemplate]
forall a b. (a -> b) -> a -> b
$ CharParser st PropertyTemplate -> CharParser st [PropertyTemplate]
forall st a. CharParser st a -> CharParser st [a]
pCommaSep CharParser st PropertyTemplate
forall st. CharParser st PropertyTemplate
pPropertyTemplate


{- <propertyTemplate> ::= <identifier> '=' <OclExpressionCS>
<identifier> '=' <objectTemplate> -}

pPropertyTemplate :: CharParser st QVTR.PropertyTemplate
pPropertyTemplate :: CharParser st PropertyTemplate
pPropertyTemplate = do
  CharParser st ()
forall st. CharParser st ()
skip
  String
ident <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  CharParser st ()
forall st. CharParser st ()
pEqual
  CharParser st ()
forall st. CharParser st ()
skip
  (do ObjectTemplate
t <- GenParser Char st ObjectTemplate
-> GenParser Char st ObjectTemplate
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st ObjectTemplate
forall st. CharParser st ObjectTemplate
pTemplate
      PropertyTemplate -> CharParser st PropertyTemplate
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> Maybe OCL -> Maybe ObjectTemplate -> PropertyTemplate
QVTR.PropertyTemplate String
ident Maybe OCL
forall a. Maybe a
Nothing (ObjectTemplate -> Maybe ObjectTemplate
forall a. a -> Maybe a
Just ObjectTemplate
t) ))
   CharParser st PropertyTemplate
-> CharParser st PropertyTemplate -> CharParser st PropertyTemplate
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
   do OCL
e <- GenParser Char st OCL -> GenParser Char st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st OCL
forall st. CharParser st OCL
pOCLExpression
      PropertyTemplate -> CharParser st PropertyTemplate
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> Maybe OCL -> Maybe ObjectTemplate -> PropertyTemplate
QVTR.PropertyTemplate String
ident (OCL -> Maybe OCL
forall a. a -> Maybe a
Just OCL
e) Maybe ObjectTemplate
forall a. Maybe a
Nothing )


-- <when> ::= 'when' '{' (<RelInvocation> ';')* (<OclExpressionCS> ';')* '}'
pWhen :: CharParser st (Maybe QVTR.WhenWhere)
pWhen :: CharParser st (Maybe WhenWhere)
pWhen = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "when"
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
  CharParser st ()
forall st. CharParser st ()
skip
  [RelInvok]
relInvok <- ParsecT String st Identity RelInvok
-> ParsecT String st Identity [RelInvok]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity RelInvok
-> ParsecT String st Identity RelInvok
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity RelInvok
forall st. CharParser st RelInvok
pRelInvocation)
  CharParser st ()
forall st. CharParser st ()
skip
  [OCL]
oclExpre <- ParsecT String st Identity OCL -> ParsecT String st Identity [OCL]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity OCL -> ParsecT String st Identity OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity OCL
forall st. CharParser st OCL
pOCLWSemi)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
  Maybe WhenWhere -> CharParser st (Maybe WhenWhere)
forall (m :: * -> *) a. Monad m => a -> m a
return ( WhenWhere -> Maybe WhenWhere
forall a. a -> Maybe a
Just ([RelInvok] -> [OCL] -> WhenWhere
QVTR.WhenWhere [RelInvok]
relInvok [OCL]
oclExpre) )


-- <where> ::= 'where' '{' (<RelInvocation> ';')* (<OclExpressionCS> ';')* '}'
pWhere :: CharParser st (Maybe QVTR.WhenWhere)
pWhere :: CharParser st (Maybe WhenWhere)
pWhere = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "where"
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{'
  CharParser st ()
forall st. CharParser st ()
skip
  [RelInvok]
relInvok <- ParsecT String st Identity RelInvok
-> ParsecT String st Identity [RelInvok]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity RelInvok
-> ParsecT String st Identity RelInvok
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity RelInvok
forall st. CharParser st RelInvok
pRelInvocation)
  CharParser st ()
forall st. CharParser st ()
skip
  [OCL]
oclExpre <- ParsecT String st Identity OCL -> ParsecT String st Identity [OCL]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity OCL -> ParsecT String st Identity OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try ParsecT String st Identity OCL
forall st. CharParser st OCL
pOCLWSemi)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}'
  Maybe WhenWhere -> CharParser st (Maybe WhenWhere)
forall (m :: * -> *) a. Monad m => a -> m a
return ( WhenWhere -> Maybe WhenWhere
forall a. a -> Maybe a
Just ([RelInvok] -> [OCL] -> WhenWhere
QVTR.WhenWhere [RelInvok]
relInvok [OCL]
oclExpre) )


pOCLWSemi :: CharParser st QVTR.OCL
pOCLWSemi :: CharParser st OCL
pOCLWSemi = do
  OCL
e <- CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return OCL
e


-- <RelInvocation> ::= <identifier> '(' (<identifier> ',')* ')' ';'
pRelInvocation :: CharParser st QVTR.RelInvok
pRelInvocation :: CharParser st RelInvok
pRelInvocation = do
  CharParser st ()
forall st. CharParser st ()
skip
  String
nam <- CharParser st String
forall st. CharParser st String
pIdentifier
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  [String]
params <- CharParser st String -> CharParser st [String]
forall st a. CharParser st a -> CharParser st [a]
pCommaSep (CharParser st ()
forall st. CharParser st ()
skip CharParser st () -> CharParser st String -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> CharParser st String
forall st. CharParser st String
pIdentifier CharParser st String -> CharParser st () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< CharParser st ()
forall st. CharParser st ()
skip)
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'
  RelInvok -> CharParser st RelInvok
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> [String] -> RelInvok
QVTR.RelInvok String
nam [String]
params )


-- Auxiliary definitions

lineComment :: CharParser st String
lineComment :: CharParser st String
lineComment = String -> CharParser st String
forall st. String -> CharParser st String
tryString "--" CharParser st String
-> CharParser st String -> CharParser st String
forall (m :: * -> *) a. Monad m => m [a] -> m [a] -> m [a]
<++> ParsecT String st Identity Char -> CharParser st String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\n")

skip :: CharParser st ()
skip :: CharParser st ()
skip = CharParser st () -> CharParser st ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (CharParser st () -> CharParser st ())
-> CharParser st () -> CharParser st ()
forall a b. (a -> b) -> a -> b
$ ParsecT String st Identity Char -> CharParser st ()
forall (m :: * -> *) a. Monad m => m a -> m ()
forget ParsecT String st Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  CharParser st () -> CharParser st () -> CharParser st ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String st Identity String -> CharParser st ()
forall (m :: * -> *) a. Monad m => m a -> m ()
forget (String -> String -> ParsecT String st Identity String
forall st. String -> String -> CharParser st String
nestedComment "/*" "*/" ParsecT String st Identity String
-> ParsecT String st Identity String
-> ParsecT String st Identity String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String st Identity String
forall st. CharParser st String
lineComment)

pChar :: CharParser st Char
pChar :: CharParser st Char
pChar = CharParser st Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum CharParser st Char -> CharParser st Char -> CharParser st Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> CharParser st Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "_'"

pKeyS :: String -> CharParser st String
pKeyS :: String -> CharParser st String
pKeyS s :: String
s = CharParser st String -> CharParser st String
forall tok st a. GenParser tok st a -> GenParser tok st a
try (String -> CharParser st String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
s CharParser st String
-> ParsecT String st Identity () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< ParsecT String st Identity Char -> ParsecT String st Identity ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT String st Identity Char
forall st. CharParser st Char
pChar) CharParser st String
-> ParsecT String st Identity () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< ParsecT String st Identity ()
forall st. CharParser st ()
skip

pKey :: String -> CharParser st ()
pKey :: String -> CharParser st ()
pKey = ParsecT String st Identity String -> CharParser st ()
forall (m :: * -> *) a. Monad m => m a -> m ()
forget (ParsecT String st Identity String -> CharParser st ())
-> (String -> ParsecT String st Identity String)
-> String
-> CharParser st ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT String st Identity String
forall st. String -> CharParser st String
pKeyS

pColon :: CharParser st ()
pColon :: CharParser st ()
pColon = String -> CharParser st ()
forall st. String -> CharParser st ()
pSym ":"

pSymS :: String -> CharParser st String
pSymS :: String -> CharParser st String
pSymS s :: String
s = String -> CharParser st String
forall st. String -> CharParser st String
tryString String
s CharParser st String
-> ParsecT String st Identity () -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< ParsecT String st Identity ()
forall st. CharParser st ()
skip

pSym :: String -> CharParser st ()
pSym :: String -> CharParser st ()
pSym = ParsecT String st Identity String -> CharParser st ()
forall (m :: * -> *) a. Monad m => m a -> m ()
forget (ParsecT String st Identity String -> CharParser st ())
-> (String -> ParsecT String st Identity String)
-> String
-> CharParser st ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT String st Identity String
forall st. String -> CharParser st String
pSymS

pComma :: CharParser st ()
pComma :: CharParser st ()
pComma = String -> CharParser st ()
forall st. String -> CharParser st ()
pSym ","

pEqual :: CharParser st ()
pEqual :: CharParser st ()
pEqual = String -> CharParser st ()
forall st. String -> CharParser st ()
pSym "="

pBetParent :: CharParser st a -> CharParser st a
pBetParent :: CharParser st a -> CharParser st a
pBetParent = ParsecT String st Identity Char
-> ParsecT String st Identity Char
-> CharParser st a
-> CharParser st a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '(') (Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')')

pBetBraces :: CharParser st a -> CharParser st a
pBetBraces :: CharParser st a -> CharParser st a
pBetBraces = ParsecT String st Identity Char
-> ParsecT String st Identity Char
-> CharParser st a
-> CharParser st a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{') (Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}')

pCommaSep :: CharParser st a -> CharParser st [a]
pCommaSep :: CharParser st a -> CharParser st [a]
pCommaSep p :: CharParser st a
p = CharParser st a
p CharParser st a
-> ParsecT String st Identity Char -> CharParser st [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ','

pSemiSep :: CharParser st a -> CharParser st [a]
pSemiSep :: CharParser st a -> CharParser st [a]
pSemiSep p :: CharParser st a
p = CharParser st a
p CharParser st a
-> ParsecT String st Identity Char -> CharParser st [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ';'

pColonSep :: CharParser st a -> CharParser st [a]
pColonSep :: CharParser st a -> CharParser st [a]
pColonSep p :: CharParser st a
p = CharParser st a
p CharParser st a
-> ParsecT String st Identity Char -> CharParser st [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ':'

pIdentifier :: CharParser st String
pIdentifier :: CharParser st String
pIdentifier = do
  CharParser st ()
forall st. CharParser st ()
skip
  Char
c <- ParsecT String st Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter
  String
rest <- ParsecT String st Identity Char -> CharParser st String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String st Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT String st Identity Char
-> ParsecT String st Identity Char
-> ParsecT String st Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "_")
  String -> CharParser st String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
rest)


{- FAKE OCL PARSER
<OclExpressionCS> ::= '(' <OclExpressionCS> ')'
<String>
<Const>
<OclExpressionCS> <Duop> <OclExpressionCS>
<Unop> <OclExpressionCS>
<String> '=' <String> -}
--
{- <Const> ::= 'true' | 'false'
<Unop>  ::= 'not'
<Duop>  ::= 'and' | 'or' -}
--
{- <String> ::= ''' <text> '''
<identifier>
<String> '+' <String> -}

pOCLExpression :: CharParser st QVTR.OCL
pOCLExpression :: CharParser st OCL
pOCLExpression = do
  CharParser st ()
forall st. CharParser st ()
skip
  CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLConst
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pUnop
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pDuopAnd
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pDuopOr
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pEqualExpre
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do OCL
ex <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try (CharParser st OCL -> CharParser st OCL)
-> CharParser st OCL -> CharParser st OCL
forall a b. (a -> b) -> a -> b
$ CharParser st OCL -> CharParser st OCL
forall st a. CharParser st a -> CharParser st a
pBetParent CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
          OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( OCL -> OCL
QVTR.Paren OCL
ex )
   CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do STRING
s <- GenParser Char st STRING -> GenParser Char st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st STRING
forall st. CharParser st STRING
pOCLSTRING
          OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( STRING -> OCL
QVTR.StringExp STRING
s )


pUnop :: CharParser st QVTR.OCL
pUnop :: CharParser st OCL
pUnop = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "not"
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  OCL
e <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( OCL -> OCL
QVTR.NotB OCL
e )


-- Prefix form. This MUST be changed
pEqualExpre :: CharParser st QVTR.OCL
pEqualExpre :: CharParser st OCL
pEqualExpre = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "="
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  STRING
ex1 <- GenParser Char st STRING -> GenParser Char st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st STRING
forall st. CharParser st STRING
pOCLSTRING
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  STRING
ex2 <- GenParser Char st STRING -> GenParser Char st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st STRING
forall st. CharParser st STRING
pOCLSTRING
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( STRING -> STRING -> OCL
QVTR.Equal STRING
ex1 STRING
ex2 )


-- Prefix form. This MUST be changed
pDuopAnd :: CharParser st QVTR.OCL
pDuopAnd :: CharParser st OCL
pDuopAnd = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "and"
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  OCL
ex1 <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  OCL
ex2 <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( OCL -> OCL -> OCL
QVTR.AndB OCL
ex1 OCL
ex2 )


-- Prefix form. This MUST be changed
pDuopOr :: CharParser st QVTR.OCL
pDuopOr :: CharParser st OCL
pDuopOr = do
  CharParser st ()
forall st. CharParser st ()
skip
  String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "or"
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  OCL
ex1 <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '('
  CharParser st ()
forall st. CharParser st ()
skip
  OCL
ex2 <- CharParser st OCL -> CharParser st OCL
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st OCL
forall st. CharParser st OCL
pOCLExpression
  CharParser st ()
forall st. CharParser st ()
skip
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')'
  OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( OCL -> OCL -> OCL
QVTR.OrB OCL
ex1 OCL
ex2 )


pOCLConst :: CharParser st QVTR.OCL
pOCLConst :: CharParser st OCL
pOCLConst = do String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "true"
               OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( Bool -> OCL
QVTR.BExp Bool
True )
        CharParser st OCL -> CharParser st OCL -> CharParser st OCL
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do String -> CharParser st ()
forall st. String -> CharParser st ()
pKey "false"
               OCL -> CharParser st OCL
forall (m :: * -> *) a. Monad m => a -> m a
return ( Bool -> OCL
QVTR.BExp Bool
False )


pOCLSTRING :: CharParser st QVTR.STRING
pOCLSTRING :: CharParser st STRING
pOCLSTRING = do String
ls <- GenParser Char st String -> GenParser Char st String
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st String
forall st. CharParser st String
pOCLSingleSTRING
                CharParser st ()
forall st. CharParser st ()
skip
                do STRING
rs <- CharParser st STRING -> CharParser st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st STRING
forall st. CharParser st STRING
pStringConcat
                   STRING -> CharParser st STRING
forall (m :: * -> *) a. Monad m => a -> m a
return ( STRING -> STRING -> STRING
QVTR.ConcatExp (String -> STRING
QVTR.Str String
ls) STRING
rs )
                 CharParser st STRING
-> CharParser st STRING -> CharParser st STRING
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> STRING -> CharParser st STRING
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> STRING
QVTR.Str String
ls )
         CharParser st STRING
-> CharParser st STRING -> CharParser st STRING
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do String
ls <- GenParser Char st String -> GenParser Char st String
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st String
forall st. CharParser st String
pIdentifier
                CharParser st ()
forall st. CharParser st ()
skip
                do STRING
rs <- CharParser st STRING -> CharParser st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st STRING
forall st. CharParser st STRING
pStringConcat
                   STRING -> CharParser st STRING
forall (m :: * -> *) a. Monad m => a -> m a
return ( STRING -> STRING -> STRING
QVTR.ConcatExp (String -> STRING
QVTR.VarExp String
ls) STRING
rs )
                 CharParser st STRING
-> CharParser st STRING -> CharParser st STRING
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> STRING -> CharParser st STRING
forall (m :: * -> *) a. Monad m => a -> m a
return ( String -> STRING
QVTR.VarExp String
ls )


pStringConcat :: CharParser st QVTR.STRING
pStringConcat :: CharParser st STRING
pStringConcat = do
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '+'
  CharParser st ()
forall st. CharParser st ()
skip
  CharParser st STRING -> CharParser st STRING
forall tok st a. GenParser tok st a -> GenParser tok st a
try CharParser st STRING
forall st. CharParser st STRING
pOCLSTRING


pOCLSingleSTRING :: CharParser st String
pOCLSingleSTRING :: CharParser st String
pOCLSingleSTRING = do
  Char -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\''
  CharParser st ()
forall st. CharParser st ()
skip
  ParsecT String st Identity Char -> CharParser st String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf "\'") CharParser st String
-> ParsecT String st Identity Char -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "\'"


pEverything :: CharParser st String
pEverything :: CharParser st String
pEverything = do
  CharParser st ()
forall st. CharParser st ()
skip
  ParsecT String st Identity Char -> CharParser st String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf ",;{}") CharParser st String
-> ParsecT String st Identity Char -> CharParser st String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m a
<< String -> ParsecT String st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf ",;"