-- File generated by the BNF Converter. -- Parser definition for use with Happy. { {-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} {-# LANGUAGE PatternSynonyms #-} module ParOCL ( happyError , myLexer , pOCLfile , pListOCLPackage , pOCLPackage , pPackageName , pOCLExpressions , pListConstrnt , pConstrnt , pListConstrBody , pConstrBody , pContextDeclaration , pClassifierContext , pOperationContext , pStereotype , pOperationName , pListFormalParameter , pFormalParameter , pTypeSpecifier , pCollectionType , pReturnType , pOCLExpression , pLetExpression , pListLetExpression , pIfExpression , pExpression , pExpression1 , pExpression2 , pExpression3 , pExpression4 , pExpression5 , pExpression6 , pExpression7 , pExpression8 , pMessageArg , pListMessageArg , pPropertyCall , pPathName , pPName , pListPName , pPossQualifiers , pQualifiers , pPossTimeExpression , pPossPropCallParam , pDeclarator , pDeclaratorVarList , pListIdent , pListExpression , pPropertyCallParameters , pPCPHelper , pListPCPHelper , pOCLLiteral , pSimpleTypeSpecifier , pLiteralCollection , pListCollectionItem , pCollectionItem , pOCLNumber , pLogicalOperator , pCollectionKind , pEqualityOperator , pRelationalOperator , pAddOperator , pMultiplyOperator , pUnaryOperator , pPostfixOperator ) where import Prelude import qualified AbsOCL import LexOCL } %name pOCLfile_internal OCLfile %name pListOCLPackage_internal ListOCLPackage %name pOCLPackage_internal OCLPackage %name pPackageName_internal PackageName %name pOCLExpressions_internal OCLExpressions %name pListConstrnt_internal ListConstrnt %name pConstrnt_internal Constrnt %name pListConstrBody_internal ListConstrBody %name pConstrBody_internal ConstrBody %name pContextDeclaration_internal ContextDeclaration %name pClassifierContext_internal ClassifierContext %name pOperationContext_internal OperationContext %name pStereotype_internal Stereotype %name pOperationName_internal OperationName %name pListFormalParameter_internal ListFormalParameter %name pFormalParameter_internal FormalParameter %name pTypeSpecifier_internal TypeSpecifier %name pCollectionType_internal CollectionType %name pReturnType_internal ReturnType %name pOCLExpression_internal OCLExpression %name pLetExpression_internal LetExpression %name pListLetExpression_internal ListLetExpression %name pIfExpression_internal IfExpression %name pExpression_internal Expression %name pExpression1_internal Expression1 %name pExpression2_internal Expression2 %name pExpression3_internal Expression3 %name pExpression4_internal Expression4 %name pExpression5_internal Expression5 %name pExpression6_internal Expression6 %name pExpression7_internal Expression7 %name pExpression8_internal Expression8 %name pMessageArg_internal MessageArg %name pListMessageArg_internal ListMessageArg %name pPropertyCall_internal PropertyCall %name pPathName_internal PathName %name pPName_internal PName %name pListPName_internal ListPName %name pPossQualifiers_internal PossQualifiers %name pQualifiers_internal Qualifiers %name pPossTimeExpression_internal PossTimeExpression %name pPossPropCallParam_internal PossPropCallParam %name pDeclarator_internal Declarator %name pDeclaratorVarList_internal DeclaratorVarList %name pListIdent_internal ListIdent %name pListExpression_internal ListExpression %name pPropertyCallParameters_internal PropertyCallParameters %name pPCPHelper_internal PCPHelper %name pListPCPHelper_internal ListPCPHelper %name pOCLLiteral_internal OCLLiteral %name pSimpleTypeSpecifier_internal SimpleTypeSpecifier %name pLiteralCollection_internal LiteralCollection %name pListCollectionItem_internal ListCollectionItem %name pCollectionItem_internal CollectionItem %name pOCLNumber_internal OCLNumber %name pLogicalOperator_internal LogicalOperator %name pCollectionKind_internal CollectionKind %name pEqualityOperator_internal EqualityOperator %name pRelationalOperator_internal RelationalOperator %name pAddOperator_internal AddOperator %name pMultiplyOperator_internal MultiplyOperator %name pUnaryOperator_internal UnaryOperator %name pPostfixOperator_internal PostfixOperator %monad { Err } { (>>=) } { return } %tokentype {Token} %token '(' { PT _ (TS _ 1) } ')' { PT _ (TS _ 2) } '*' { PT _ (TS _ 3) } '+' { PT _ (TS _ 4) } ',' { PT _ (TS _ 5) } '-' { PT _ (TS _ 6) } '->' { PT _ (TS _ 7) } '.' { PT _ (TS _ 8) } '..' { PT _ (TS _ 9) } '/' { PT _ (TS _ 10) } ':' { PT _ (TS _ 11) } '::' { PT _ (TS _ 12) } ';' { PT _ (TS _ 13) } '<' { PT _ (TS _ 14) } '<=' { PT _ (TS _ 15) } '<>' { PT _ (TS _ 16) } '=' { PT _ (TS _ 17) } '>' { PT _ (TS _ 18) } '>=' { PT _ (TS _ 19) } '?' { PT _ (TS _ 20) } '@' { PT _ (TS _ 21) } 'Bag' { PT _ (TS _ 22) } 'Collection' { PT _ (TS _ 23) } 'Sequence' { PT _ (TS _ 24) } 'Set' { PT _ (TS _ 25) } '[' { PT _ (TS _ 26) } ']' { PT _ (TS _ 27) } '^' { PT _ (TS _ 28) } 'and' { PT _ (TS _ 29) } 'context' { PT _ (TS _ 30) } 'def' { PT _ (TS _ 31) } 'else' { PT _ (TS _ 32) } 'endif' { PT _ (TS _ 33) } 'endpackage' { PT _ (TS _ 34) } 'false' { PT _ (TS _ 35) } 'if' { PT _ (TS _ 36) } 'implies' { PT _ (TS _ 37) } 'in' { PT _ (TS _ 38) } 'inv' { PT _ (TS _ 39) } 'let' { PT _ (TS _ 40) } 'not' { PT _ (TS _ 41) } 'null' { PT _ (TS _ 42) } 'or' { PT _ (TS _ 43) } 'package' { PT _ (TS _ 44) } 'post' { PT _ (TS _ 45) } 'pre' { PT _ (TS _ 46) } 'then' { PT _ (TS _ 47) } 'true' { PT _ (TS _ 48) } 'xor' { PT _ (TS _ 49) } '{' { PT _ (TS _ 50) } '|' { PT _ (TS _ 51) } '}' { PT _ (TS _ 52) } L_Ident { PT _ (TV _)} L_doubl { PT _ (TD _)} L_integ { PT _ (TI _)} L_quoted { PT _ (TL _)} %% Ident :: { (AbsOCL.BNFC'Position, AbsOCL.Ident) } Ident : L_Ident { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Ident (tokenText $1)) } Double :: { (AbsOCL.BNFC'Position, Double) } Double : L_doubl { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), (read (tokenText $1) ) :: Double) } Integer :: { (AbsOCL.BNFC'Position, Integer) } Integer : L_integ { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), (read (tokenText $1) ) :: Integer) } String :: { (AbsOCL.BNFC'Position, String) } String : L_quoted { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), ((\(PT _ (TL s)) -> s) $1)) } OCLfile :: { (AbsOCL.BNFC'Position, AbsOCL.OCLfile) } OCLfile : ListOCLPackage { (fst $1, AbsOCL.OCLf (fst $1) (snd $1)) } ListOCLPackage :: { (AbsOCL.BNFC'Position, [AbsOCL.OCLPackage]) } ListOCLPackage : OCLPackage { (fst $1, (:[]) (snd $1)) } | OCLPackage ListOCLPackage { (fst $1, (:) (snd $1) (snd $2)) } OCLPackage :: { (AbsOCL.BNFC'Position, AbsOCL.OCLPackage) } OCLPackage : 'package' PackageName OCLExpressions 'endpackage' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Pack (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $3)) } PackageName :: { (AbsOCL.BNFC'Position, AbsOCL.PackageName) } PackageName : PathName { (fst $1, AbsOCL.PackName (fst $1) (snd $1)) } OCLExpressions :: { (AbsOCL.BNFC'Position, AbsOCL.OCLExpressions) } OCLExpressions : ListConstrnt { (fst $1, AbsOCL.Constraints (fst $1) (snd $1)) } ListConstrnt :: { (AbsOCL.BNFC'Position, [AbsOCL.Constrnt]) } ListConstrnt : {- empty -} { (AbsOCL.BNFC'NoPosition, []) } | Constrnt ListConstrnt { (fst $1, (:) (snd $1) (snd $2)) } Constrnt :: { (AbsOCL.BNFC'Position, AbsOCL.Constrnt) } Constrnt : ContextDeclaration ListConstrBody { (fst $1, AbsOCL.Constr (fst $1) (snd $1) (snd $2)) } ListConstrBody :: { (AbsOCL.BNFC'Position, [AbsOCL.ConstrBody]) } ListConstrBody : ConstrBody { (fst $1, (:[]) (snd $1)) } | ConstrBody ListConstrBody { (fst $1, (:) (snd $1) (snd $2)) } ConstrBody :: { (AbsOCL.BNFC'Position, AbsOCL.ConstrBody) } ConstrBody : 'def' ':' ListLetExpression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.CBDef (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $3)) } | 'def' Ident ':' ListLetExpression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.CBDefNamed (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) } | Stereotype ':' OCLExpression { (fst $1, AbsOCL.CB (fst $1) (snd $1) (snd $3)) } | Stereotype Ident ':' OCLExpression { (fst $1, AbsOCL.CBNamed (fst $1) (snd $1) (snd $2) (snd $4)) } ContextDeclaration :: { (AbsOCL.BNFC'Position, AbsOCL.ContextDeclaration) } ContextDeclaration : 'context' ClassifierContext { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.CDClassif (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } | 'context' OperationContext { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.CDOper (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } ClassifierContext :: { (AbsOCL.BNFC'Position, AbsOCL.ClassifierContext) } ClassifierContext : Ident { (fst $1, AbsOCL.CC (fst $1) (snd $1)) } | Ident ':' Ident { (fst $1, AbsOCL.CCType (fst $1) (snd $1) (snd $3)) } OperationContext :: { (AbsOCL.BNFC'Position, AbsOCL.OperationContext) } OperationContext : Ident '::' OperationName '(' ListFormalParameter ')' { (fst $1, AbsOCL.OpC (fst $1) (snd $1) (snd $3) (snd $5)) } | Ident '::' OperationName '(' ListFormalParameter ')' ':' ReturnType { (fst $1, AbsOCL.OpCRT (fst $1) (snd $1) (snd $3) (snd $5) (snd $8)) } Stereotype :: { (AbsOCL.BNFC'Position, AbsOCL.Stereotype) } Stereotype : 'inv' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Inv (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'post' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Post (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'pre' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Pre (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } OperationName :: { (AbsOCL.BNFC'Position, AbsOCL.OperationName) } OperationName : '*' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Mult (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '+' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Add (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '-' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Sub (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '/' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Div (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '<' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LST (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '<=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LSTE (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '<>' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.NEq (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Eq (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '>' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.GRT (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '>=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.GRTE (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'and' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.And (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'implies' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Impl (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'not' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Not (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'or' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Or (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'xor' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Xor (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | Ident { (fst $1, AbsOCL.OpName (fst $1) (snd $1)) } ListFormalParameter :: { (AbsOCL.BNFC'Position, [AbsOCL.FormalParameter]) } ListFormalParameter : {- empty -} { (AbsOCL.BNFC'NoPosition, []) } | FormalParameter { (fst $1, (:[]) (snd $1)) } | FormalParameter ',' ListFormalParameter { (fst $1, (:) (snd $1) (snd $3)) } FormalParameter :: { (AbsOCL.BNFC'Position, AbsOCL.FormalParameter) } FormalParameter : Ident ':' TypeSpecifier { (fst $1, AbsOCL.FP (fst $1) (snd $1) (snd $3)) } TypeSpecifier :: { (AbsOCL.BNFC'Position, AbsOCL.TypeSpecifier) } TypeSpecifier : CollectionType { (fst $1, AbsOCL.TScoll (fst $1) (snd $1)) } | SimpleTypeSpecifier { (fst $1, AbsOCL.TSsimple (fst $1) (snd $1)) } CollectionType :: { (AbsOCL.BNFC'Position, AbsOCL.CollectionType) } CollectionType : CollectionKind '(' SimpleTypeSpecifier ')' { (fst $1, AbsOCL.CT (fst $1) (snd $1) (snd $3)) } ReturnType :: { (AbsOCL.BNFC'Position, AbsOCL.ReturnType) } ReturnType : TypeSpecifier { (fst $1, AbsOCL.RT (fst $1) (snd $1)) } OCLExpression :: { (AbsOCL.BNFC'Position, AbsOCL.OCLExpression) } OCLExpression : Expression { (fst $1, AbsOCL.OCLExp (fst $1) (snd $1)) } | ListLetExpression 'in' Expression { (fst $1, AbsOCL.OCLExpLet (fst $1) (snd $1) (snd $3)) } LetExpression :: { (AbsOCL.BNFC'Position, AbsOCL.LetExpression) } LetExpression : 'let' Ident '(' ListFormalParameter ')' ':' TypeSpecifier '=' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LEType (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $7) (snd $9)) } | 'let' Ident '(' ListFormalParameter ')' '=' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LE (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $7)) } | 'let' Ident ':' TypeSpecifier '=' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LENoParamType (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) } | 'let' Ident '=' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LENoParam (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4)) } ListLetExpression :: { (AbsOCL.BNFC'Position, [AbsOCL.LetExpression]) } ListLetExpression : LetExpression { (fst $1, (:[]) (snd $1)) } | LetExpression ListLetExpression { (fst $1, (:) (snd $1) (snd $2)) } IfExpression :: { (AbsOCL.BNFC'Position, AbsOCL.IfExpression) } IfExpression : 'if' Expression 'then' Expression 'else' Expression 'endif' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.IfExp (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) } Expression :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression : Expression 'implies' Expression1 { (fst $1, AbsOCL.EOpImpl (fst $1) (snd $1) (snd $3)) } | Expression1 { (fst $1, (snd $1)) } Expression1 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression1 : Expression1 LogicalOperator Expression2 { (fst $1, AbsOCL.EOpLog (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression2 { (fst $1, (snd $1)) } Expression2 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression2 : Expression2 EqualityOperator Expression3 { (fst $1, AbsOCL.EOpEq (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression3 { (fst $1, (snd $1)) } Expression3 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression3 : Expression3 RelationalOperator Expression4 { (fst $1, AbsOCL.EOpRel (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression4 { (fst $1, (snd $1)) } Expression4 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression4 : Expression4 AddOperator Expression5 { (fst $1, AbsOCL.EOpAdd (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression5 { (fst $1, (snd $1)) } Expression5 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression5 : Expression5 MultiplyOperator Expression6 { (fst $1, AbsOCL.EOpMul (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression6 { (fst $1, (snd $1)) } Expression6 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression6 : UnaryOperator Expression7 { (fst $1, AbsOCL.EOpUn (fst $1) (snd $1) (snd $2)) } | Expression7 { (fst $1, (snd $1)) } Expression7 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression7 : Expression7 '^' PathName '(' ListMessageArg ')' { (fst $1, AbsOCL.EMessage (fst $1) (snd $1) (snd $3) (snd $5)) } | Expression7 PostfixOperator PropertyCall { (fst $1, AbsOCL.EExplPropCall (fst $1) (snd $1) (snd $2) (snd $3)) } | Expression8 { (fst $1, (snd $1)) } Expression8 :: { (AbsOCL.BNFC'Position, AbsOCL.Expression) } Expression8 : '(' Expression ')' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), (snd $2)) } | 'null' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.ENull (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | IfExpression { (fst $1, AbsOCL.EIfExp (fst $1) (snd $1)) } | LiteralCollection { (fst $1, AbsOCL.ELitColl (fst $1) (snd $1)) } | OCLLiteral { (fst $1, AbsOCL.ELit (fst $1) (snd $1)) } | PropertyCall { (fst $1, AbsOCL.EImplPropCall (fst $1) (snd $1)) } MessageArg :: { (AbsOCL.BNFC'Position, AbsOCL.MessageArg) } MessageArg : '?' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.MAUnspec (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '?' ':' TypeSpecifier { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.MAUnspecTyped (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $3)) } | Expression { (fst $1, AbsOCL.MAExpr (fst $1) (snd $1)) } ListMessageArg :: { (AbsOCL.BNFC'Position, [AbsOCL.MessageArg]) } ListMessageArg : {- empty -} { (AbsOCL.BNFC'NoPosition, []) } | MessageArg { (fst $1, (:[]) (snd $1)) } | MessageArg ',' ListMessageArg { (fst $1, (:) (snd $1) (snd $3)) } PropertyCall :: { (AbsOCL.BNFC'Position, AbsOCL.PropertyCall) } PropertyCall : PathName PossTimeExpression PossQualifiers PossPropCallParam { (fst $1, AbsOCL.PCall (fst $1) (snd $1) (snd $2) (snd $3) (snd $4)) } PathName :: { (AbsOCL.BNFC'Position, AbsOCL.PathName) } PathName : ListPName { (fst $1, AbsOCL.PathN (fst $1) (snd $1)) } PName :: { (AbsOCL.BNFC'Position, AbsOCL.PName) } PName : Ident { (fst $1, AbsOCL.PN (fst $1) (snd $1)) } ListPName :: { (AbsOCL.BNFC'Position, [AbsOCL.PName]) } ListPName : PName { (fst $1, (:[]) (snd $1)) } | PName '::' ListPName { (fst $1, (:) (snd $1) (snd $3)) } PossQualifiers :: { (AbsOCL.BNFC'Position, AbsOCL.PossQualifiers) } PossQualifiers : {- empty -} { (AbsOCL.BNFC'NoPosition, AbsOCL.NoQual (AbsOCL.BNFC'NoPosition)) } | Qualifiers { (fst $1, AbsOCL.Qual (fst $1) (snd $1)) } Qualifiers :: { (AbsOCL.BNFC'Position, AbsOCL.Qualifiers) } Qualifiers : '[' ListExpression ']' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Quals (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } PossTimeExpression :: { (AbsOCL.BNFC'Position, AbsOCL.PossTimeExpression) } PossTimeExpression : {- empty -} { (AbsOCL.BNFC'NoPosition, AbsOCL.NoTE (AbsOCL.BNFC'NoPosition)) } | '@' 'pre' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.AtPre (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } PossPropCallParam :: { (AbsOCL.BNFC'Position, AbsOCL.PossPropCallParam) } PossPropCallParam : {- empty -} { (AbsOCL.BNFC'NoPosition, AbsOCL.NoPCP (AbsOCL.BNFC'NoPosition)) } | PropertyCallParameters { (fst $1, AbsOCL.PCPs (fst $1) (snd $1)) } Declarator :: { (AbsOCL.BNFC'Position, AbsOCL.Declarator) } Declarator : DeclaratorVarList ';' Ident ':' TypeSpecifier '=' Expression '|' { (fst $1, AbsOCL.DeclAcc (fst $1) (snd $1) (snd $3) (snd $5) (snd $7)) } | DeclaratorVarList '|' { (fst $1, AbsOCL.Decl (fst $1) (snd $1)) } DeclaratorVarList :: { (AbsOCL.BNFC'Position, AbsOCL.DeclaratorVarList) } DeclaratorVarList : ListIdent { (fst $1, AbsOCL.DVL (fst $1) (snd $1)) } | ListIdent ':' SimpleTypeSpecifier { (fst $1, AbsOCL.DVLType (fst $1) (snd $1) (snd $3)) } ListIdent :: { (AbsOCL.BNFC'Position, [AbsOCL.Ident]) } ListIdent : Ident { (fst $1, (:[]) (snd $1)) } | Ident ',' ListIdent { (fst $1, (:) (snd $1) (snd $3)) } ListExpression :: { (AbsOCL.BNFC'Position, [AbsOCL.Expression]) } ListExpression : {- empty -} { (AbsOCL.BNFC'NoPosition, []) } | Expression { (fst $1, (:[]) (snd $1)) } | Expression ',' ListExpression { (fst $1, (:) (snd $1) (snd $3)) } PropertyCallParameters :: { (AbsOCL.BNFC'Position, AbsOCL.PropertyCallParameters) } PropertyCallParameters : '(' ')' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPNoDeclNoParam (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '(' Expression ListPCPHelper ')' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPConcrete (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $3)) } PCPHelper :: { (AbsOCL.BNFC'Position, AbsOCL.PCPHelper) } PCPHelper : ',' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPComma (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } | ':' SimpleTypeSpecifier { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPColon (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } | ';' Ident ':' TypeSpecifier '=' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPIterate (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2) (snd $4) (snd $6)) } | '|' Expression { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PCPBar (uncurry AbsOCL.BNFC'Position (tokenLineCol $1)) (snd $2)) } ListPCPHelper :: { (AbsOCL.BNFC'Position, [AbsOCL.PCPHelper]) } ListPCPHelper : {- empty -} { (AbsOCL.BNFC'NoPosition, []) } | PCPHelper ListPCPHelper { (fst $1, (:) (snd $1) (snd $2)) } OCLLiteral :: { (AbsOCL.BNFC'Position, AbsOCL.OCLLiteral) } OCLLiteral : 'false' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LitBoolFalse (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'true' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LitBoolTrue (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | String { (fst $1, AbsOCL.LitStr (fst $1) (snd $1)) } | OCLNumber { (fst $1, AbsOCL.LitNum (fst $1) (snd $1)) } SimpleTypeSpecifier :: { (AbsOCL.BNFC'Position, AbsOCL.SimpleTypeSpecifier) } SimpleTypeSpecifier : PathName { (fst $1, AbsOCL.STSpec (fst $1) (snd $1)) } LiteralCollection :: { (AbsOCL.BNFC'Position, AbsOCL.LiteralCollection) } LiteralCollection : CollectionKind '{' '}' { (fst $1, AbsOCL.LCollectionEmpty (fst $1) (snd $1)) } | CollectionKind '{' ListCollectionItem '}' { (fst $1, AbsOCL.LCollection (fst $1) (snd $1) (snd $3)) } ListCollectionItem :: { (AbsOCL.BNFC'Position, [AbsOCL.CollectionItem]) } ListCollectionItem : CollectionItem { (fst $1, (:[]) (snd $1)) } | CollectionItem ',' ListCollectionItem { (fst $1, (:) (snd $1) (snd $3)) } CollectionItem :: { (AbsOCL.BNFC'Position, AbsOCL.CollectionItem) } CollectionItem : Expression { (fst $1, AbsOCL.CI (fst $1) (snd $1)) } | Expression '..' Expression { (fst $1, AbsOCL.CIRange (fst $1) (snd $1) (snd $3)) } OCLNumber :: { (AbsOCL.BNFC'Position, AbsOCL.OCLNumber) } OCLNumber : Double { (fst $1, AbsOCL.NumDouble (fst $1) (snd $1)) } | Integer { (fst $1, AbsOCL.NumInt (fst $1) (snd $1)) } LogicalOperator :: { (AbsOCL.BNFC'Position, AbsOCL.LogicalOperator) } LogicalOperator : 'and' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LAnd (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'or' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LOr (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'xor' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.LXor (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } CollectionKind :: { (AbsOCL.BNFC'Position, AbsOCL.CollectionKind) } CollectionKind : 'Bag' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Bag (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'Collection' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Collection (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'Sequence' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Sequence (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'Set' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.Set (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } EqualityOperator :: { (AbsOCL.BNFC'Position, AbsOCL.EqualityOperator) } EqualityOperator : '<>' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.ENEq (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.EEq (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } RelationalOperator :: { (AbsOCL.BNFC'Position, AbsOCL.RelationalOperator) } RelationalOperator : '<' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.RLT (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '<=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.RLTE (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '>' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.RGT (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '>=' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.RGTE (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } AddOperator :: { (AbsOCL.BNFC'Position, AbsOCL.AddOperator) } AddOperator : '+' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.AAdd (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '-' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.ASub (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } MultiplyOperator :: { (AbsOCL.BNFC'Position, AbsOCL.MultiplyOperator) } MultiplyOperator : '*' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.MMult (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '/' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.MDiv (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } UnaryOperator :: { (AbsOCL.BNFC'Position, AbsOCL.UnaryOperator) } UnaryOperator : '-' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.UMin (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | 'not' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.UNot (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } PostfixOperator :: { (AbsOCL.BNFC'Position, AbsOCL.PostfixOperator) } PostfixOperator : '->' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PArrow (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } | '.' { (uncurry AbsOCL.BNFC'Position (tokenLineCol $1), AbsOCL.PDot (uncurry AbsOCL.BNFC'Position (tokenLineCol $1))) } { type Err = Either String happyError :: [Token] -> Err a happyError ts = Left $ "syntax error at " ++ tokenPos ts ++ case ts of [] -> [] [Err _] -> " due to lexer error" t:_ -> " before `" ++ (prToken t) ++ "'" myLexer :: String -> [Token] myLexer = tokens -- Entrypoints pOCLfile :: [Token] -> Err AbsOCL.OCLfile pOCLfile = fmap snd . pOCLfile_internal pListOCLPackage :: [Token] -> Err [AbsOCL.OCLPackage] pListOCLPackage = fmap snd . pListOCLPackage_internal pOCLPackage :: [Token] -> Err AbsOCL.OCLPackage pOCLPackage = fmap snd . pOCLPackage_internal pPackageName :: [Token] -> Err AbsOCL.PackageName pPackageName = fmap snd . pPackageName_internal pOCLExpressions :: [Token] -> Err AbsOCL.OCLExpressions pOCLExpressions = fmap snd . pOCLExpressions_internal pListConstrnt :: [Token] -> Err [AbsOCL.Constrnt] pListConstrnt = fmap snd . pListConstrnt_internal pConstrnt :: [Token] -> Err AbsOCL.Constrnt pConstrnt = fmap snd . pConstrnt_internal pListConstrBody :: [Token] -> Err [AbsOCL.ConstrBody] pListConstrBody = fmap snd . pListConstrBody_internal pConstrBody :: [Token] -> Err AbsOCL.ConstrBody pConstrBody = fmap snd . pConstrBody_internal pContextDeclaration :: [Token] -> Err AbsOCL.ContextDeclaration pContextDeclaration = fmap snd . pContextDeclaration_internal pClassifierContext :: [Token] -> Err AbsOCL.ClassifierContext pClassifierContext = fmap snd . pClassifierContext_internal pOperationContext :: [Token] -> Err AbsOCL.OperationContext pOperationContext = fmap snd . pOperationContext_internal pStereotype :: [Token] -> Err AbsOCL.Stereotype pStereotype = fmap snd . pStereotype_internal pOperationName :: [Token] -> Err AbsOCL.OperationName pOperationName = fmap snd . pOperationName_internal pListFormalParameter :: [Token] -> Err [AbsOCL.FormalParameter] pListFormalParameter = fmap snd . pListFormalParameter_internal pFormalParameter :: [Token] -> Err AbsOCL.FormalParameter pFormalParameter = fmap snd . pFormalParameter_internal pTypeSpecifier :: [Token] -> Err AbsOCL.TypeSpecifier pTypeSpecifier = fmap snd . pTypeSpecifier_internal pCollectionType :: [Token] -> Err AbsOCL.CollectionType pCollectionType = fmap snd . pCollectionType_internal pReturnType :: [Token] -> Err AbsOCL.ReturnType pReturnType = fmap snd . pReturnType_internal pOCLExpression :: [Token] -> Err AbsOCL.OCLExpression pOCLExpression = fmap snd . pOCLExpression_internal pLetExpression :: [Token] -> Err AbsOCL.LetExpression pLetExpression = fmap snd . pLetExpression_internal pListLetExpression :: [Token] -> Err [AbsOCL.LetExpression] pListLetExpression = fmap snd . pListLetExpression_internal pIfExpression :: [Token] -> Err AbsOCL.IfExpression pIfExpression = fmap snd . pIfExpression_internal pExpression :: [Token] -> Err AbsOCL.Expression pExpression = fmap snd . pExpression_internal pExpression1 :: [Token] -> Err AbsOCL.Expression pExpression1 = fmap snd . pExpression1_internal pExpression2 :: [Token] -> Err AbsOCL.Expression pExpression2 = fmap snd . pExpression2_internal pExpression3 :: [Token] -> Err AbsOCL.Expression pExpression3 = fmap snd . pExpression3_internal pExpression4 :: [Token] -> Err AbsOCL.Expression pExpression4 = fmap snd . pExpression4_internal pExpression5 :: [Token] -> Err AbsOCL.Expression pExpression5 = fmap snd . pExpression5_internal pExpression6 :: [Token] -> Err AbsOCL.Expression pExpression6 = fmap snd . pExpression6_internal pExpression7 :: [Token] -> Err AbsOCL.Expression pExpression7 = fmap snd . pExpression7_internal pExpression8 :: [Token] -> Err AbsOCL.Expression pExpression8 = fmap snd . pExpression8_internal pMessageArg :: [Token] -> Err AbsOCL.MessageArg pMessageArg = fmap snd . pMessageArg_internal pListMessageArg :: [Token] -> Err [AbsOCL.MessageArg] pListMessageArg = fmap snd . pListMessageArg_internal pPropertyCall :: [Token] -> Err AbsOCL.PropertyCall pPropertyCall = fmap snd . pPropertyCall_internal pPathName :: [Token] -> Err AbsOCL.PathName pPathName = fmap snd . pPathName_internal pPName :: [Token] -> Err AbsOCL.PName pPName = fmap snd . pPName_internal pListPName :: [Token] -> Err [AbsOCL.PName] pListPName = fmap snd . pListPName_internal pPossQualifiers :: [Token] -> Err AbsOCL.PossQualifiers pPossQualifiers = fmap snd . pPossQualifiers_internal pQualifiers :: [Token] -> Err AbsOCL.Qualifiers pQualifiers = fmap snd . pQualifiers_internal pPossTimeExpression :: [Token] -> Err AbsOCL.PossTimeExpression pPossTimeExpression = fmap snd . pPossTimeExpression_internal pPossPropCallParam :: [Token] -> Err AbsOCL.PossPropCallParam pPossPropCallParam = fmap snd . pPossPropCallParam_internal pDeclarator :: [Token] -> Err AbsOCL.Declarator pDeclarator = fmap snd . pDeclarator_internal pDeclaratorVarList :: [Token] -> Err AbsOCL.DeclaratorVarList pDeclaratorVarList = fmap snd . pDeclaratorVarList_internal pListIdent :: [Token] -> Err [AbsOCL.Ident] pListIdent = fmap snd . pListIdent_internal pListExpression :: [Token] -> Err [AbsOCL.Expression] pListExpression = fmap snd . pListExpression_internal pPropertyCallParameters :: [Token] -> Err AbsOCL.PropertyCallParameters pPropertyCallParameters = fmap snd . pPropertyCallParameters_internal pPCPHelper :: [Token] -> Err AbsOCL.PCPHelper pPCPHelper = fmap snd . pPCPHelper_internal pListPCPHelper :: [Token] -> Err [AbsOCL.PCPHelper] pListPCPHelper = fmap snd . pListPCPHelper_internal pOCLLiteral :: [Token] -> Err AbsOCL.OCLLiteral pOCLLiteral = fmap snd . pOCLLiteral_internal pSimpleTypeSpecifier :: [Token] -> Err AbsOCL.SimpleTypeSpecifier pSimpleTypeSpecifier = fmap snd . pSimpleTypeSpecifier_internal pLiteralCollection :: [Token] -> Err AbsOCL.LiteralCollection pLiteralCollection = fmap snd . pLiteralCollection_internal pListCollectionItem :: [Token] -> Err [AbsOCL.CollectionItem] pListCollectionItem = fmap snd . pListCollectionItem_internal pCollectionItem :: [Token] -> Err AbsOCL.CollectionItem pCollectionItem = fmap snd . pCollectionItem_internal pOCLNumber :: [Token] -> Err AbsOCL.OCLNumber pOCLNumber = fmap snd . pOCLNumber_internal pLogicalOperator :: [Token] -> Err AbsOCL.LogicalOperator pLogicalOperator = fmap snd . pLogicalOperator_internal pCollectionKind :: [Token] -> Err AbsOCL.CollectionKind pCollectionKind = fmap snd . pCollectionKind_internal pEqualityOperator :: [Token] -> Err AbsOCL.EqualityOperator pEqualityOperator = fmap snd . pEqualityOperator_internal pRelationalOperator :: [Token] -> Err AbsOCL.RelationalOperator pRelationalOperator = fmap snd . pRelationalOperator_internal pAddOperator :: [Token] -> Err AbsOCL.AddOperator pAddOperator = fmap snd . pAddOperator_internal pMultiplyOperator :: [Token] -> Err AbsOCL.MultiplyOperator pMultiplyOperator = fmap snd . pMultiplyOperator_internal pUnaryOperator :: [Token] -> Err AbsOCL.UnaryOperator pUnaryOperator = fmap snd . pUnaryOperator_internal pPostfixOperator :: [Token] -> Err AbsOCL.PostfixOperator pPostfixOperator = fmap snd . pPostfixOperator_internal }