packages feed

HXQ (empty) → 0.1

raw patch · 28 files changed

+7606/−0 lines, 28 filesdep +basedep +haskell98dep +template-haskellsetup-changed

Dependencies added: base, haskell98, template-haskell

Files

+ HXQ.cabal view
@@ -0,0 +1,43 @@+Name:                HXQ+Version:             0.1+Description:         A Compiler from XQuery to Haskell+Synopsis:            A Compiler from XQuery to Haskell+Category:            XML+build-type:          Simple+License-file:        LICENSE+License:             GPL+Author:              Leonidas Fegaras+Maintainer:          fegaras@cse.uta.edu+Homepage:            http://lambda.uta.edu/HXQ/+extra-source-files:+  Makefile+  index.html+  data/cs.xml+  XQuery.hs+  XQueryParser.hs+  XQueryParser.y+  hxml-0.2/Arrow.hs+  hxml-0.2/LLParsing.hs+  hxml-0.2/XML.hs+  hxml-0.2/AssocList.hs+  hxml-0.2/Misc.hs+  hxml-0.2/XMLParse.hs+  hxml-0.2/DTD.hs+  hxml-0.2/NTree.hs+  hxml-0.2/XMLScanner.hs+  hxml-0.2/ETree.hs+  hxml-0.2/PrintXML.hs+  hxml-0.2/Filter.hs+  hxml-0.2/TreeBuild.hs+  hxml-0.2/Tree.hs+  hxml-0.2/HXML.hs+  hxml-0.2/XMLCombinators.hs+  hxml-0.2/00-LICENSE.txt+  hxml-0.2/00-README.txt++Build-Depends:       base, haskell98, template-haskell++Executable:          xquery+Main-is:             Main.hs+ghc-options:         -ihxml-0.2+
+ LICENSE view
@@ -0,0 +1,5 @@+Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved.+This material is provided as is, with absolutely no warranty expressed or implied.+Any use is at your own risk. Permission is hereby granted to use or copy this program+for any purpose, provided the above notices are retained on all copies.+
+ Main.hs view
@@ -0,0 +1,31 @@+{--------------------------------------------------------------+-+- The main program of the XQuery processor+- Programmer: Leonidas Fegaras (fegaras@cse.uta.edu)+- Date: 03/19/2008+-+---------------------------------------------------------------}++{-# OPTIONS_GHC -fth #-}+module Main where++import XQuery++f(d,s) = $(xe "<student dept='{$d/text()}'>{$s//firstname/text(),' ',$s//lastname/text()}</student>")++main = do a <- $(xq ("  for $s in doc('data/cs.xml')//gradstudent          "+                ++"     orderby $s/gpa descending, $s//lastname            "+                ++"     return <student>{$s//firstname/text(),' ',         "+                ++"                      $s//lastname/text(),' ',          "+                ++"                      $s/gpa/text()}</student>          "))+          putStrLn (show a)+          let query name = $(xq " doc('data/cs.xml')//gradstudent[.//lastname = $name]//firstname ")+          b <- query $(xe " 'Galanis' ")      -- or use: query [XText "Galanis"]+          putStrLn (show b)+          c <- $(xq ("  <good-students>{                                   "+                  ++"       let $d := doc('data/cs.xml')                   "+                  ++"       for $s in $d//gradstudent                      "+                  ++"       where $s/gpa = '4.0'                           "+                  ++"       return f($d//deptname,$s)                      "+                  ++"   }</good-students>                                  "))+          putStrLn (show c)
+ Makefile view
@@ -0,0 +1,19 @@+hxml = hxml-0.2+options = -O+runopt = +RTS -S -RTS++xquery: XQueryParser.hs XQuery.hs Main.hs+	ghc $(options) -i${hxml} --make Main.hs -o xquery++XQueryParser.hs: XQueryParser.y+	happy -g -c XQueryParser.y++run:	xquery+	./xquery $(runopt)++test:   XQueryParser.hs+	ghci -fth -i${hxml} XQuery.hs XQueryParser.hs++clean:+	/bin/rm -f *~ *.o *.hi XQueryParser.hs *.stat *.prof *.ps *.aux *.hp xquery+
+ Setup.lhs view
@@ -0,0 +1,5 @@+#! /usr/bin/env runhaskell+ +> import Distribution.Simple+> main = defaultMain+
+ XQuery.hs view
@@ -0,0 +1,437 @@+{-------------------------------------------------------------------------------------+-+- A Compiler from XQuery to Haskell+- Programmer: Leonidas Fegaras+- Email: fegaras@cse.uta.edu+- Web: http://lambda.uta.edu/+- Creation: 02/15/08, last update: 03/20/08+- +- Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved.+- This material is provided as is, with absolutely no warranty expressed or implied.+- Any use is at your own risk. Permission is hereby granted to use or copy this program+- for any purpose, provided the above notices are retained on all copies.+-+--------------------------------------------------------------------------------------}+++{-# OPTIONS_GHC -fth #-}++module XQuery (+       XTree(..), XSeq, xq, xe, cq+    ) where++import Char(isDigit)+import List(sortBy)+import XMLParse(XMLEvent(..),parseDocument)+import HXML(AttList)+import Language.Haskell.TH+import XQueryParser+++{--------------- XML Trees (rose trees) ----------------------------------------------}++type Stream = [XMLEvent]++type Tag = String++data XTree =  XElem Tag AttList [XTree]+           |  XText String+           |  XInt Int+           |  XFloat Float+           deriving Eq++type XSeq = [XTree]+++showAL :: AttList -> String+showAL = foldr(\(a,v) r -> " "++a++"=\'"++v++"\'"++r) []++showXT :: XTree -> String+showXT (XElem tag al xs) = "<"++tag++(showAL al)++">"++(showXS xs)++"</"++tag++">"+showXT (XText text) = text+showXT (XInt n) = " "++(show n)+showXT (XFloat n) = " "++(show n)++showXS :: XSeq -> String+showXS xs = concat (map showXT xs)++instance Show XTree where+   show t = showXT t+++-- lazily materialize the SAX stream into a DOM tree+materialize :: Stream -> XTree+materialize stream = XElem "root" [] [head (filter (\x -> case x of XElem _ _ _ -> True; _ -> False)+                                                   (fst (ml stream)))]+        where m ((TextEvent t):xs) = (XText t,xs)+              m ((EmptyEvent n atts):xs) = (XElem n atts [],xs)+              m ((StartEvent n atts):xs) = let (el,xs') = ml xs+                                           in (XElem n atts el,xs')+              m (_:xs) = (XText "unrecognized",xs)+              m [] = (XText "unrecognized",[])+              ml ((EndEvent n):xs) = ([],xs)+              ml xs = let (e,xs') = m xs+                          (el,xs'') = ml xs'+                      in (e:el,xs'')+++{--------------- XPath Steps ---------------------------------------------------------}+++-- XPath step /tag or /*+child :: Tag -> XTree -> XSeq+child m x = case x of+              (XElem _ _ bs) -> foldr (\b s -> case b of+                                                 (XElem k _ _) | (k==m || m=="*") -> b:s+                                                 _ -> s) [] bs+              _ -> []+++-- XPath step //tag or //*+descendant :: Tag -> XTree -> XSeq+descendant m (x@(XElem t al cs)) | m==t || m=="*" = x:(concat (map (descendant m) cs))+descendant m (XElem t al cs) = concat (map (descendant m) cs)+descendant m _ = []+++-- XPath step /@attr or /@*+attribute :: Tag -> XTree -> XSeq+attribute m x = case x of+                  (XElem _ al _) -> foldr (\(k,v) s -> if k==m || m=="*"+                                                          then (XText v):s+                                                       else s) [] al+                  _ -> []+++-- XPath step //@attr or //@*+attributeDescendant :: Tag -> XTree -> XSeq+attributeDescendant m (x@(XElem _ al cs))+        = foldr (\(k,v) s -> if k==m || m=="*"+                                then (XText v):s+                             else s)+                (concat (map (attributeDescendant m) cs)) al+attributeDescendant m _ = []+++{------------ Functions --------------------------------------------------------------}+++-- like foldr but with an index+foldir :: (a -> Int -> b -> b) -> b -> [a] -> Int -> b+foldir c n [] i = n+foldir c n (x:xs) i = c x i (foldir c n xs (i+1))++trueXT = XText "true"++toString :: XSeq -> [String]+toString xs = foldr (\x r -> case x of+                               XElem _ _ [XText t] -> t:r+                               XText t -> t:r+                               XInt n -> (show n):r+                               XFloat n -> (show n):r+                               _ -> r) [] xs++readNum :: String -> Maybe XTree+readNum cs = case span isDigit cs of+               (n,[]) -> Just (XInt (read n))+               (n,'.':rest) -> case span isDigit rest of+                                 (k,[]) -> Just (XFloat (read (n++('.':k))))+                                 _ -> Nothing+               _ -> Nothing++toNum :: XSeq -> XSeq+toNum xs = foldr (\x r -> case x of+                            XElem _ _ [XText s]+                                    -> case readNum s of+                                         Just t -> t:r+                                         _ -> r+                            XInt n -> x:r+                            XFloat n -> x:r+                            XText s -> case readNum s of+                                         Just t -> t:r+                                         _ -> r+                            _ -> r) [] xs++text :: XSeq -> XSeq+text xs = foldr (\x r -> case x of+                           XElem _ _ [z@(XText _)] -> z:r+                           XElem _ _ [z@(XInt _)] -> z:r+                           XElem _ _ [z@(XFloat _)] -> z:r+                           XText _ -> x:r+                           XInt _ -> x:r+                           XFloat _ -> x:r+                           _ -> r) [] xs++toFloat :: XTree -> Float+toFloat (XInt n) = fromIntegral n+toFloat (XFloat n) = n++contains :: String -> String -> Bool+contains xs ys | ((take (length ys) xs) == ys) = True+contains (_:xs) ys = contains xs ys+contains [] ys = False++distinct :: XSeq -> XSeq+distinct = foldl (\r a -> if elem a r then r else r++[a]) []++arithmetic :: (Float -> Float -> Float) -> XTree -> XTree -> XTree+arithmetic op (XInt n) (XInt m) = XInt (round (op (fromIntegral n) (fromIntegral m)))+arithmetic op (XFloat n) (XFloat m) = XFloat (op n m)+arithmetic op (XFloat n) (XInt m) = XFloat (op n (fromIntegral m))+arithmetic op (XInt n) (XFloat m) = XFloat (op (fromIntegral n) m)++compareXTrees :: XTree -> XTree -> Ordering+compareXTrees (XElem _ _ _) _ = EQ+compareXTrees _ (XElem _ _ _) = EQ+compareXTrees (XInt n) (XInt m) = compare n m+compareXTrees (XFloat n) (XInt m) = compare n (fromIntegral m)+compareXTrees (XInt n) (XFloat m) = compare (fromIntegral n) m+compareXTrees (XFloat n) (XFloat m) = compare n m+compareXTrees x y = let tx = case x of XText t -> t; XInt n -> show n; XFloat n -> show n+                        ty = case y of XText t -> t; XInt n -> show n; XFloat n -> show n+                    in compare tx ty++compareXSeqs :: Bool -> XSeq -> XSeq -> Ordering+compareXSeqs ord xs ys+    = let comps = [ compareXTrees x y | x <- xs, y <- ys ]+      in if ord+            then if all (\x -> x == LT) comps+                    then LT+                 else if all (\x -> x == GT) comps+                    then GT+                 else EQ+         else if all (\x -> x == LT) comps+                 then GT+              else if all (\x -> x == GT) comps+                 then LT+              else EQ+++type Function = [Q Exp] -> Q Exp++functions :: [(Tag,Int,Function)]+functions = [ ( "=", 2, \[xs,ys] -> [| [ trueXT | x <- text $xs, y <- text $ys, x == y ] |] ),+              ( "==", 2, \[xs,ys] -> [| [ trueXT | x <- $xs, y <- $ys, x == y ] |] ),+              ( "!=", 2, \[xs,ys] -> [| if null [ trueXT | x <- text $xs, y <- text $ys, x == y ] then [trueXT] else [] |] ),+              ( ">", 2, \[xs,ys] -> [| [ trueXT | x <- toNum $xs, y <- toNum $ys, compareXTrees x y == GT ] |] ),+              ( "<", 2, \[xs,ys] -> [| [ trueXT | x <- toNum $xs, y <- toNum $ys, compareXTrees x y == LT ] |] ),+              ( ">=", 2, \[xs,ys] -> [| [ trueXT | x <- toNum $xs, y <- toNum $ys, compareXTrees x y `elem` [GT,EQ] ] |] ),+              ( "<=", 2, \[xs,ys] -> [| [ trueXT | x <- toNum $xs, y <- toNum $ys, compareXTrees x y `elem` [LT,EQ] ] |] ),+              ( "+", 2, \[xs,ys] -> [| [ arithmetic (+) x y | x <- toNum $xs, y <- toNum $ys ] |] ),+              ( "-", 2, \[xs,ys] -> [| [ arithmetic (-) x y | x <- toNum $xs, y <- toNum $ys ] |] ),+              ( "*", 2, \[xs,ys] -> [| [ arithmetic (*) x y | x <- toNum $xs, y <- toNum $ys ] |] ),+              ( "div", 2, \[xs,ys] -> [| [ arithmetic (/) x y | x <- toNum $xs, y <- toNum $ys ] |] ),+              ( "idiv", 2, \[xs,ys] -> [| [ arithmetic div x y | x <- toNum $xs, y <- toNum $ys ] |] ),+              ( "uplus", 1, \[xs] -> [| [ x | x <- toNum $xs ] |] ),+              ( "uminus", 1, \[xs] -> [| [ case x of XInt n -> XInt (-n); XFloat n -> XFloat (-n) | x <- toNum $xs ] |] ),+              ( "and", 2, \[xs,ys] -> [| if (null $xs) || (null $ys) then [] else [trueXT] |] ),+              ( "or", 2, \[xs,ys] -> [| if (null $xs) && (null $ys) then [] else [trueXT] |] ),+              ( "not", 1, \[xs] -> [| if (null $xs) then [trueXT] else [] |] ),+              ( "some", 1, \[xs] -> [| if (null $xs) then [] else [trueXT] |] ),+              ( "count", 1, \[xs] -> [| [ XInt (length $xs) ] |] ),+              ( "sum", 1, \[xs] -> [| [ XFloat (sum [ toFloat x | x <- toNum $xs ]) ] |] ),+              ( "avg", 1, \[xs] -> [| let ys = $xs in [ XFloat ((sum [ toFloat x | x <- toNum ys ])+                                                                / (fromIntegral (length ys))) ] |] ),+              ( "min", 1, \[xs] -> [| [ XFloat (minimum [ toFloat x | x <- toNum $xs ]) ] |] ),+              ( "max", 1, \[xs] -> [| [ XFloat (maximum [ toFloat x | x <- toNum $xs ]) ] |] ),+              ( "to", 2, \[xs,ys] -> [| [ XInt i | XInt n <- toNum $xs, XInt m <- toNum $ys, i <- [n..m] ] |] ),+              ( "text", 1, \[xs] -> [| text $xs |] ),+              ( "node", 1, \[xs] -> [| $xs |] ),+              ( "empty", 0, \[] -> [| [] |] ),+              ( "child", 2, \[tags,xs] -> [| [ z | (XText tag) <- $tags, x <- $xs, z <- child tag x ] |] ),+              ( "descendant", 2, \[tags,xs] -> [| [ z | (XText tag) <- $tags, x <- $xs, z <- descendant tag x ] |] ),+              ( "attribute", 2, \[tags,xs] -> [| [ z | (XText tag) <- $tags, x <- $xs, z <- attribute tag x ] |] ),+              ( "descendant_attribute", 2, \[tags,xs] -> [| [ z | (XText tag) <- $tags, x <- $xs,+                                                                  z <- attributeDescendant tag x ] |] ),+              ( "if", 3, \[cs,ts,es] -> [| if null $cs then $es else $ts |] ),+              ( "element", 2, \[tags,xs] -> [| [ x | tag <- toString $tags, x <- $xs,+                                                     case x of XElem t _ _ -> t==tag || tag=="*"; _ -> False ] |] ),+              ( "attribute", 2, \[tags,xs] -> [| [ z | tag <- toString $tags, x <- $xs, z <- attribute tag x ] |] ),+              ( "contains", 2, \[xs,text] -> [| [ trueXT | x <- toString $xs, t <- toString $text, contains x t ] |] ),+              ( "concat", 2, \[xs,ys] -> [| $xs ++ $ys |] ),+              ( "distinct-nodes", 1, \[xs] -> [| distinct $xs |] ),+              ( "union", 2, \[xs,ys] -> [| distinct ($xs ++ $ys) |] ),+              ( "intersect", 2, \[xs,ys] -> [| filter (\x -> elem x $ys) $xs |] ),+              ( "except", 2, \[xs,ys] -> [| filter (\x -> not (elem x $ys)) $xs  |] )+            ]+++-- make a function call+callF :: Tag -> Function+callF fname args = case filter (\(n,_,_) -> n==fname) functions of+                     (_,len,f):_ -> if (length args) == len+                                       then f args+                                    else error ("wrong number of arguments in function call: " ++ fname)+                     _ ->     -- otherwise, it must be a Haskell function of type (XSeq,...,XSeq) -> XSeq+                          let itp = foldr (\_ r -> appT r [t| XSeq |] ) (appT (tupleT (length args)) [t| XSeq |]) (tail args)+                              fn = sigE (varE (mkName fname))+                                        (appT (appT arrowT itp) [t| XSeq |])+                          in appE fn (tupE args)+++{------------ Optimizer --------------------------------------------------------------}+++-- get rid of backward steps+optimize :: Ast -> Ast+-- rule:  x/tag/.. -> x[tag]+optimize (Ast "call" [Avar "parent",Ast "call" [Avar "child",tag,x]])+      = Ast "predicate" [Ast "call" [Avar "child",tag,Avar "."],optimize x]+-- rule:  x//tag/.. -> x//*[tag]+optimize (Ast "call" [Avar "parent",Ast "call" [Avar "descendant",tag,x]])+      = Ast "predicate" [Ast "call" [Avar "child",tag,Avar "."],+                         Ast "call" [Avar "descendant",Astring "*",optimize x]]+-- needs more rules+optimize (Ast n args) = Ast n (map optimize args)+optimize e = e+++{------------ Compiler ---------------------------------------------------------------}+++-- does the expression contain a last()?+containsLast :: Ast -> Bool+containsLast (Ast "call" [Avar "last"]) = True+containsLast (Ast f _) | elem f ["let","for","predicate"] = False+containsLast (Ast _ args) = or (map containsLast args)+containsLast _ = False+++-- Compile the AST e into Haskell code+-- context: context node+-- index: the element position in the parent sequence (=position())+-- seqSize: the seqSize of the parent sequence (=last())+compile :: Ast -> Q Exp -> Q Exp -> Q Exp -> Q Exp+compile e context index seqSize+  = case e of+      Avar "." -> context+      Avar v -> let x = varE (mkName v)+                in [| $x :: XSeq |]+      Aint n -> let x = litE (IntegerL (toInteger n))+                in [| [ XInt $x ] |]+      Afloat n -> let x = litE (RationalL (toRational n))+                  in [| [ XFloat $x ] |]+      Astring s -> let x = litE (StringL s)+                   in [| [ XText $x ] |]+      Ast "doc" [Aint n] -> let d = varE (mkName ("_doc"++(show n)))+                            in [| [ $d ] |]+      Ast "call" [Avar "position"]+             -> index+      Ast "call" [Avar "last"]+             -> seqSize+      Ast "call" ((Avar f):args)+             -> callF f (map (\x -> compile x context index seqSize) args)+      Ast "construction" [Astring tag,Ast "attributes" al,body]+             -> let alc = foldr (\p r -> case p of+                                           Ast "pair" [Astring a,Astring v]+                                              -> let ac = litE (StringL a)+                                                     vc = litE (StringL v)+                                                 in [| ($ac,$vc) : $r |]+                                           Ast "pair" [Astring a,v]+                                              -> let ac = litE (StringL a)+                                                     vc = compile v context index seqSize+                                                 in [| ($ac,showXS $vc) : $r |])+                                [| [] |] al+                    ct = litE (StringL tag)+                    bc = compile body context index seqSize+                in [| [ XElem $ct $alc $bc ] |]+      Ast "predicate" [condition,body]+             |  containsLast condition+             -> let c = compile condition+                    b = compile body context index seqSize+                in [| let bl = $b+                      in foldir (\x i r -> case $(c [| [ x ] |] [| [ XInt i ] |] [| [ XInt (length bl) ] |]) of+                                             [] -> r+                                             [XInt n] -> if i==n then x:r else r    -- indexing+                                             _ -> x:r) [] bl 1 |]+      Ast "predicate" [condition,body]+             -> let c = compile condition+                    b = compile body context index seqSize+                in [| foldir (\x i r -> case $(c [| [ x ] |] [| [ XInt i ] |] seqSize) of+                                          [] -> r+                                          [XInt n] -> if i==n then x:r else r    -- indexing+                                          _ -> x:r) [] $b 1 |]+      Ast "let" [Avar var,source,body]+             -> do s <- compile source context index seqSize+                   b <- compile body context index seqSize+                   return (AppE (LamE [VarP (mkName var)] b) s)+      Ast "for" [Avar var,Avar "$",source,body]+             -> let b = compile body [| $(varE (mkName var)) |] [| [] |] [| [ XInt 0 ] |]+                    f = lamE [varP (mkName var)] [| \x -> $b ++ x |]+                    s = compile source context index seqSize+                in [| foldr (\x -> $f [x]) [] $s |]+      Ast "for" [Avar var,Avar ivar,source,body]+             -> let b = compile body [| $(varE (mkName var)) |]+                                     [| $(varE (mkName ivar)) |] [| [ XInt 0 ] |]+                    f = lamE [varP (mkName var)] (lamE [varP (mkName ivar)] [| \x -> $b ++ x |])+                    s = compile source context index seqSize+                in [| foldir (\x i -> $f [x] [XInt i]) [] $s 1 |]+      Ast "sortTuple" (exp:orderBys)             -- prepare each FLWOR tuple for sorting+             -> let res = foldl (\r a -> let ac = compile a context index seqSize+                                         in [| $r++[text $ac] |] )+                                [| [ $(compile exp context index seqSize) ] |] orderBys+                in [| [ $res ] |]+      Ast "sort" (exp:ordList)+             -> let ce = compile exp context index seqSize+                    ordering = foldl (\r (Avar ord)+                                         -> let asc = if ord == "ascending"+                                                         then [| True |]+                                                      else [| False |]+                                            in [| \(x:xs) (y:ys) -> case compareXSeqs $asc x y of+                                                                      EQ -> $r xs ys+                                                                      o -> o |])+                                     [| \xs ys -> EQ |] ordList+                in [| concatMap head (sortBy (\(_:xs) (_:ys) -> $ordering xs ys) ($ce::[[XSeq]])) |]+      _ -> error ("Illegal XQuery "++(show e))+++-- collect all input documents and assign them a unique number+getDocs :: Ast -> Int -> (Ast, Int, [(Int, String)])+getDocs query count =+    case query of+      Ast "call" [Avar "doc",Astring file]+             -> (Ast "doc" [Aint count], count+1, [(count,file)])+      Ast n args -> let (s,c,ns) = foldr (\a r c -> let (e,c1,n1) = getDocs a c+                                                        (s,c2,n2) = r c1+                                                    in (e:s,c2,n1++n2))+                                         (\c -> ([],c,[])) args count+                    in (Ast n s,c,ns)+      _ -> (query,count,[])+++-- compile an XQuery AST that reads XML documents+compileQuery :: Ast -> Q Exp -> Q Exp+compileQuery query context+   = let (ast,_,ns) = getDocs query 0+         code = compile (optimize ast) context [| [] |] [| [ XInt 0 ] |]+     in foldr (\(n,file) r -> let d = lamE [varP (mkName ("_doc"++(show n)))] r+                              in [| do doc <- readFile $(litE (StringL file))+                                       let x = materialize (parseDocument doc)+                                       $d x+                                 |])+              [| return $code |] ns+++-- Display the AST and the Haskell code of an input XQuery+cq :: String -> IO ()+cq query = do putStrLn "Abstract Syntax Tree:"+              let ast = parse (scan query)+              putStrLn (show ast)+              let opt = optimize ast+              putStrLn "Optimized AST:"+              putStrLn (show opt)+              putStrLn "Haskell Code:"+              let code = compileQuery opt  [| [] |]+              runQ code >>= putStrLn.pprint+++-- Run an XQuery expression that does not read XML documents+-- When evaluated, it returns XSeq+xe :: String -> Q Exp+xe query = compile (optimize (parse (scan query))) [| [] |] [| [] |] [| [ XInt 0 ] |]+++-- Run an XQuery that reads XML documents+-- When evaluated, it returns IO XSeq+xq :: String -> Q Exp+xq query = compileQuery (parse (scan query)) [| [] |]
+ XQueryParser.hs view
@@ -0,0 +1,3931 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+module XQueryParser where+import Char+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif++-- parser produced by Happy Version 1.17++newtype HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = GHC.Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn4 :: t4 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn4 x = unsafeCoerce# x+{-# INLINE happyIn4 #-}+happyOut4 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t4+happyOut4 x = unsafeCoerce# x+{-# INLINE happyOut4 #-}+happyIn5 :: t5 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn5 x = unsafeCoerce# x+{-# INLINE happyIn5 #-}+happyOut5 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t5+happyOut5 x = unsafeCoerce# x+{-# INLINE happyOut5 #-}+happyIn6 :: t6 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn6 x = unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t6+happyOut6 x = unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: t7 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn7 x = unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t7+happyOut7 x = unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: t8 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn8 x = unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t8+happyOut8 x = unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: t9 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn9 x = unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t9+happyOut9 x = unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: t10 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn10 x = unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t10+happyOut10 x = unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: t11 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn11 x = unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t11+happyOut11 x = unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: t12 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn12 x = unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t12+happyOut12 x = unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: t13 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn13 x = unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t13+happyOut13 x = unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: t14 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn14 x = unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t14+happyOut14 x = unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: t15 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn15 x = unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t15+happyOut15 x = unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: t16 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn16 x = unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t16+happyOut16 x = unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: t17 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn17 x = unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t17+happyOut17 x = unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: t18 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn18 x = unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t18+happyOut18 x = unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: t19 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn19 x = unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t19+happyOut19 x = unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: t20 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn20 x = unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t20+happyOut20 x = unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: t21 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn21 x = unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t21+happyOut21 x = unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: t22 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn22 x = unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t22+happyOut22 x = unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: t23 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn23 x = unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t23+happyOut23 x = unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: t24 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn24 x = unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t24+happyOut24 x = unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: t25 -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyIn25 x = unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> t25+happyOut25 x = unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyInTok :: Token -> (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25)+happyInTok x = unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25) -> Token+happyOutTok x = unsafeCoerce# x+{-# INLINE happyOutTok #-}+++action_0 (27#) = happyShift action_12+action_0 (28#) = happyShift action_13+action_0 (29#) = happyShift action_14+action_0 (34#) = happyShift action_15+action_0 (41#) = happyShift action_16+action_0 (42#) = happyShift action_17+action_0 (43#) = happyShift action_18+action_0 (49#) = happyShift action_19+action_0 (55#) = happyShift action_20+action_0 (59#) = happyShift action_21+action_0 (60#) = happyShift action_22+action_0 (68#) = happyShift action_23+action_0 (69#) = happyShift action_24+action_0 (73#) = happyShift action_25+action_0 (75#) = happyShift action_26+action_0 (78#) = happyShift action_27+action_0 (79#) = happyShift action_28+action_0 (81#) = happyShift action_29+action_0 (82#) = happyShift action_30+action_0 (83#) = happyShift action_31+action_0 (4#) = happyGoto action_32+action_0 (5#) = happyGoto action_2+action_0 (6#) = happyGoto action_3+action_0 (8#) = happyGoto action_4+action_0 (15#) = happyGoto action_5+action_0 (16#) = happyGoto action_6+action_0 (17#) = happyGoto action_7+action_0 (20#) = happyGoto action_8+action_0 (23#) = happyGoto action_9+action_0 (24#) = happyGoto action_10+action_0 (25#) = happyGoto action_11+action_0 x = happyTcHack x happyFail++action_1 (27#) = happyShift action_12+action_1 (28#) = happyShift action_13+action_1 (29#) = happyShift action_14+action_1 (34#) = happyShift action_15+action_1 (41#) = happyShift action_16+action_1 (42#) = happyShift action_17+action_1 (43#) = happyShift action_18+action_1 (49#) = happyShift action_19+action_1 (55#) = happyShift action_20+action_1 (59#) = happyShift action_21+action_1 (60#) = happyShift action_22+action_1 (68#) = happyShift action_23+action_1 (69#) = happyShift action_24+action_1 (73#) = happyShift action_25+action_1 (75#) = happyShift action_26+action_1 (78#) = happyShift action_27+action_1 (79#) = happyShift action_28+action_1 (81#) = happyShift action_29+action_1 (82#) = happyShift action_30+action_1 (83#) = happyShift action_31+action_1 (5#) = happyGoto action_2+action_1 (6#) = happyGoto action_3+action_1 (8#) = happyGoto action_4+action_1 (15#) = happyGoto action_5+action_1 (16#) = happyGoto action_6+action_1 (17#) = happyGoto action_7+action_1 (20#) = happyGoto action_8+action_1 (23#) = happyGoto action_9+action_1 (24#) = happyGoto action_10+action_1 (25#) = happyGoto action_11+action_1 x = happyTcHack x happyFail++action_2 x = happyTcHack x happyReduce_91++action_3 (40#) = happyShift action_61+action_3 (41#) = happyShift action_62+action_3 (42#) = happyShift action_63+action_3 (43#) = happyShift action_64+action_3 (44#) = happyShift action_65+action_3 (45#) = happyShift action_66+action_3 (46#) = happyShift action_67+action_3 (47#) = happyShift action_68+action_3 (48#) = happyShift action_69+action_3 (49#) = happyShift action_70+action_3 (50#) = happyShift action_71+action_3 (51#) = happyShift action_72+action_3 (52#) = happyShift action_73+action_3 (53#) = happyShift action_74+action_3 (54#) = happyShift action_75+action_3 (55#) = happyShift action_76+action_3 (56#) = happyShift action_77+action_3 (57#) = happyShift action_78+action_3 (58#) = happyShift action_79+action_3 x = happyTcHack x happyReduce_1++action_4 (59#) = happyShift action_58+action_4 (60#) = happyShift action_59+action_4 (64#) = happyShift action_60+action_4 (11#) = happyGoto action_57+action_4 x = happyTcHack x happyReduce_48++action_5 x = happyTcHack x happyReduce_9++action_6 x = happyTcHack x happyReduce_8++action_7 (51#) = happyShift action_55+action_7 (71#) = happyShift action_56+action_7 x = happyTcHack x happyFail++action_8 x = happyTcHack x happyReduce_7++action_9 (32#) = happyShift action_53+action_9 (74#) = happyShift action_54+action_9 (21#) = happyGoto action_51+action_9 (22#) = happyGoto action_52+action_9 x = happyTcHack x happyReduce_75++action_10 x = happyTcHack x happyReduce_86++action_11 x = happyTcHack x happyReduce_88++action_12 (79#) = happyShift action_28+action_12 (5#) = happyGoto action_39+action_12 (9#) = happyGoto action_50+action_12 x = happyTcHack x happyFail++action_13 (79#) = happyShift action_28+action_13 (5#) = happyGoto action_39+action_13 (9#) = happyGoto action_49+action_13 x = happyTcHack x happyFail++action_14 (27#) = happyShift action_12+action_14 (28#) = happyShift action_13+action_14 (29#) = happyShift action_14+action_14 (34#) = happyShift action_15+action_14 (41#) = happyShift action_16+action_14 (42#) = happyShift action_17+action_14 (43#) = happyShift action_18+action_14 (49#) = happyShift action_19+action_14 (55#) = happyShift action_20+action_14 (59#) = happyShift action_21+action_14 (60#) = happyShift action_22+action_14 (68#) = happyShift action_23+action_14 (69#) = happyShift action_24+action_14 (73#) = happyShift action_25+action_14 (75#) = happyShift action_26+action_14 (78#) = happyShift action_27+action_14 (79#) = happyShift action_28+action_14 (81#) = happyShift action_29+action_14 (82#) = happyShift action_30+action_14 (83#) = happyShift action_31+action_14 (5#) = happyGoto action_2+action_14 (6#) = happyGoto action_48+action_14 (8#) = happyGoto action_4+action_14 (15#) = happyGoto action_5+action_14 (16#) = happyGoto action_6+action_14 (17#) = happyGoto action_7+action_14 (20#) = happyGoto action_8+action_14 (23#) = happyGoto action_9+action_14 (24#) = happyGoto action_10+action_14 (25#) = happyGoto action_11+action_14 x = happyTcHack x happyFail++action_15 (27#) = happyShift action_12+action_15 (28#) = happyShift action_13+action_15 (29#) = happyShift action_14+action_15 (34#) = happyShift action_15+action_15 (35#) = happyShift action_47+action_15 (41#) = happyShift action_16+action_15 (42#) = happyShift action_17+action_15 (43#) = happyShift action_18+action_15 (49#) = happyShift action_19+action_15 (55#) = happyShift action_20+action_15 (59#) = happyShift action_21+action_15 (60#) = happyShift action_22+action_15 (68#) = happyShift action_23+action_15 (69#) = happyShift action_24+action_15 (73#) = happyShift action_25+action_15 (75#) = happyShift action_26+action_15 (78#) = happyShift action_27+action_15 (79#) = happyShift action_28+action_15 (81#) = happyShift action_29+action_15 (82#) = happyShift action_30+action_15 (83#) = happyShift action_31+action_15 (5#) = happyGoto action_2+action_15 (6#) = happyGoto action_45+action_15 (7#) = happyGoto action_46+action_15 (8#) = happyGoto action_4+action_15 (15#) = happyGoto action_5+action_15 (16#) = happyGoto action_6+action_15 (17#) = happyGoto action_7+action_15 (20#) = happyGoto action_8+action_15 (23#) = happyGoto action_9+action_15 (24#) = happyGoto action_10+action_15 (25#) = happyGoto action_11+action_15 x = happyTcHack x happyFail++action_16 (27#) = happyShift action_12+action_16 (28#) = happyShift action_13+action_16 (29#) = happyShift action_14+action_16 (34#) = happyShift action_15+action_16 (41#) = happyShift action_16+action_16 (42#) = happyShift action_17+action_16 (43#) = happyShift action_18+action_16 (49#) = happyShift action_19+action_16 (55#) = happyShift action_20+action_16 (59#) = happyShift action_21+action_16 (60#) = happyShift action_22+action_16 (68#) = happyShift action_23+action_16 (69#) = happyShift action_24+action_16 (73#) = happyShift action_25+action_16 (75#) = happyShift action_26+action_16 (78#) = happyShift action_27+action_16 (79#) = happyShift action_28+action_16 (81#) = happyShift action_29+action_16 (82#) = happyShift action_30+action_16 (83#) = happyShift action_31+action_16 (5#) = happyGoto action_2+action_16 (6#) = happyGoto action_44+action_16 (8#) = happyGoto action_4+action_16 (15#) = happyGoto action_5+action_16 (16#) = happyGoto action_6+action_16 (17#) = happyGoto action_7+action_16 (20#) = happyGoto action_8+action_16 (23#) = happyGoto action_9+action_16 (24#) = happyGoto action_10+action_16 (25#) = happyGoto action_11+action_16 x = happyTcHack x happyFail++action_17 (27#) = happyShift action_12+action_17 (28#) = happyShift action_13+action_17 (29#) = happyShift action_14+action_17 (34#) = happyShift action_15+action_17 (41#) = happyShift action_16+action_17 (42#) = happyShift action_17+action_17 (43#) = happyShift action_18+action_17 (49#) = happyShift action_19+action_17 (55#) = happyShift action_20+action_17 (59#) = happyShift action_21+action_17 (60#) = happyShift action_22+action_17 (68#) = happyShift action_23+action_17 (69#) = happyShift action_24+action_17 (73#) = happyShift action_25+action_17 (75#) = happyShift action_26+action_17 (78#) = happyShift action_27+action_17 (79#) = happyShift action_28+action_17 (81#) = happyShift action_29+action_17 (82#) = happyShift action_30+action_17 (83#) = happyShift action_31+action_17 (5#) = happyGoto action_2+action_17 (6#) = happyGoto action_43+action_17 (8#) = happyGoto action_4+action_17 (15#) = happyGoto action_5+action_17 (16#) = happyGoto action_6+action_17 (17#) = happyGoto action_7+action_17 (20#) = happyGoto action_8+action_17 (23#) = happyGoto action_9+action_17 (24#) = happyGoto action_10+action_17 (25#) = happyGoto action_11+action_17 x = happyTcHack x happyFail++action_18 x = happyTcHack x happyReduce_89++action_19 (75#) = happyShift action_42+action_19 x = happyTcHack x happyFail++action_20 (27#) = happyShift action_12+action_20 (28#) = happyShift action_13+action_20 (29#) = happyShift action_14+action_20 (34#) = happyShift action_15+action_20 (41#) = happyShift action_16+action_20 (42#) = happyShift action_17+action_20 (43#) = happyShift action_18+action_20 (49#) = happyShift action_19+action_20 (55#) = happyShift action_20+action_20 (59#) = happyShift action_21+action_20 (60#) = happyShift action_22+action_20 (68#) = happyShift action_23+action_20 (69#) = happyShift action_24+action_20 (73#) = happyShift action_25+action_20 (75#) = happyShift action_26+action_20 (78#) = happyShift action_27+action_20 (79#) = happyShift action_28+action_20 (81#) = happyShift action_29+action_20 (82#) = happyShift action_30+action_20 (83#) = happyShift action_31+action_20 (5#) = happyGoto action_2+action_20 (6#) = happyGoto action_41+action_20 (8#) = happyGoto action_4+action_20 (15#) = happyGoto action_5+action_20 (16#) = happyGoto action_6+action_20 (17#) = happyGoto action_7+action_20 (20#) = happyGoto action_8+action_20 (23#) = happyGoto action_9+action_20 (24#) = happyGoto action_10+action_20 (25#) = happyGoto action_11+action_20 x = happyTcHack x happyFail++action_21 (79#) = happyShift action_28+action_21 (5#) = happyGoto action_39+action_21 (9#) = happyGoto action_40+action_21 x = happyTcHack x happyFail++action_22 (79#) = happyShift action_28+action_22 (5#) = happyGoto action_37+action_22 (10#) = happyGoto action_38+action_22 x = happyTcHack x happyFail++action_23 (34#) = happyShift action_36+action_23 x = happyTcHack x happyFail++action_24 (34#) = happyShift action_35+action_24 x = happyTcHack x happyFail++action_25 (34#) = happyShift action_15+action_25 (43#) = happyShift action_18+action_25 (75#) = happyShift action_26+action_25 (78#) = happyShift action_27+action_25 (79#) = happyShift action_28+action_25 (5#) = happyGoto action_2+action_25 (23#) = happyGoto action_34+action_25 (24#) = happyGoto action_10+action_25 (25#) = happyGoto action_11+action_25 x = happyTcHack x happyFail++action_26 (34#) = happyShift action_33+action_26 x = happyTcHack x happyReduce_90++action_27 x = happyTcHack x happyReduce_92++action_28 x = happyTcHack x happyReduce_2++action_29 x = happyTcHack x happyReduce_33++action_30 x = happyTcHack x happyReduce_34++action_31 x = happyTcHack x happyReduce_32++action_32 (84#) = happyAccept+action_32 x = happyTcHack x happyFail++action_33 (27#) = happyShift action_12+action_33 (28#) = happyShift action_13+action_33 (29#) = happyShift action_14+action_33 (34#) = happyShift action_15+action_33 (35#) = happyShift action_131+action_33 (41#) = happyShift action_16+action_33 (42#) = happyShift action_17+action_33 (43#) = happyShift action_18+action_33 (49#) = happyShift action_19+action_33 (55#) = happyShift action_20+action_33 (59#) = happyShift action_21+action_33 (60#) = happyShift action_22+action_33 (68#) = happyShift action_23+action_33 (69#) = happyShift action_24+action_33 (73#) = happyShift action_25+action_33 (75#) = happyShift action_26+action_33 (78#) = happyShift action_27+action_33 (79#) = happyShift action_28+action_33 (81#) = happyShift action_29+action_33 (82#) = happyShift action_30+action_33 (83#) = happyShift action_31+action_33 (5#) = happyGoto action_2+action_33 (6#) = happyGoto action_45+action_33 (7#) = happyGoto action_130+action_33 (8#) = happyGoto action_4+action_33 (15#) = happyGoto action_5+action_33 (16#) = happyGoto action_6+action_33 (17#) = happyGoto action_7+action_33 (20#) = happyGoto action_8+action_33 (23#) = happyGoto action_9+action_33 (24#) = happyGoto action_10+action_33 (25#) = happyGoto action_11+action_33 x = happyTcHack x happyFail++action_34 (32#) = happyShift action_53+action_34 (74#) = happyShift action_54+action_34 (21#) = happyGoto action_129+action_34 (22#) = happyGoto action_52+action_34 x = happyTcHack x happyReduce_76++action_35 (75#) = happyShift action_128+action_35 x = happyTcHack x happyFail++action_36 (75#) = happyShift action_127+action_36 x = happyTcHack x happyFail++action_37 (63#) = happyShift action_126+action_37 x = happyTcHack x happyFail++action_38 (62#) = happyShift action_125+action_38 x = happyTcHack x happyReduce_38++action_39 (61#) = happyShift action_124+action_39 x = happyTcHack x happyFail++action_40 (62#) = happyShift action_116+action_40 x = happyTcHack x happyReduce_37++action_41 x = happyTcHack x happyReduce_31++action_42 (75#) = happyShift action_123+action_42 (19#) = happyGoto action_122+action_42 x = happyTcHack x happyReduce_61++action_43 x = happyTcHack x happyReduce_30++action_44 x = happyTcHack x happyReduce_29++action_45 (40#) = happyShift action_61+action_45 (41#) = happyShift action_62+action_45 (42#) = happyShift action_63+action_45 (43#) = happyShift action_64+action_45 (44#) = happyShift action_65+action_45 (45#) = happyShift action_66+action_45 (46#) = happyShift action_67+action_45 (47#) = happyShift action_68+action_45 (48#) = happyShift action_69+action_45 (49#) = happyShift action_70+action_45 (50#) = happyShift action_71+action_45 (51#) = happyShift action_72+action_45 (52#) = happyShift action_73+action_45 (53#) = happyShift action_74+action_45 (54#) = happyShift action_75+action_45 (55#) = happyShift action_76+action_45 (56#) = happyShift action_77+action_45 (57#) = happyShift action_78+action_45 (58#) = happyShift action_79+action_45 x = happyTcHack x happyReduce_35++action_46 (35#) = happyShift action_120+action_46 (62#) = happyShift action_121+action_46 x = happyTcHack x happyFail++action_47 x = happyTcHack x happyReduce_94++action_48 (30#) = happyShift action_119+action_48 (40#) = happyShift action_61+action_48 (41#) = happyShift action_62+action_48 (42#) = happyShift action_63+action_48 (43#) = happyShift action_64+action_48 (44#) = happyShift action_65+action_48 (45#) = happyShift action_66+action_48 (46#) = happyShift action_67+action_48 (47#) = happyShift action_68+action_48 (48#) = happyShift action_69+action_48 (49#) = happyShift action_70+action_48 (50#) = happyShift action_71+action_48 (51#) = happyShift action_72+action_48 (52#) = happyShift action_73+action_48 (53#) = happyShift action_74+action_48 (54#) = happyShift action_75+action_48 (55#) = happyShift action_76+action_48 (56#) = happyShift action_77+action_48 (57#) = happyShift action_78+action_48 (58#) = happyShift action_79+action_48 x = happyTcHack x happyFail++action_49 (62#) = happyShift action_116+action_49 (72#) = happyShift action_118+action_49 x = happyTcHack x happyFail++action_50 (62#) = happyShift action_116+action_50 (72#) = happyShift action_117+action_50 x = happyTcHack x happyFail++action_51 (74#) = happyShift action_54+action_51 (22#) = happyGoto action_115+action_51 x = happyTcHack x happyReduce_77++action_52 x = happyTcHack x happyReduce_79++action_53 (27#) = happyShift action_12+action_53 (28#) = happyShift action_13+action_53 (29#) = happyShift action_14+action_53 (34#) = happyShift action_15+action_53 (41#) = happyShift action_16+action_53 (42#) = happyShift action_17+action_53 (43#) = happyShift action_18+action_53 (49#) = happyShift action_19+action_53 (55#) = happyShift action_20+action_53 (59#) = happyShift action_21+action_53 (60#) = happyShift action_22+action_53 (68#) = happyShift action_23+action_53 (69#) = happyShift action_24+action_53 (73#) = happyShift action_25+action_53 (75#) = happyShift action_26+action_53 (78#) = happyShift action_27+action_53 (79#) = happyShift action_28+action_53 (81#) = happyShift action_29+action_53 (82#) = happyShift action_30+action_53 (83#) = happyShift action_31+action_53 (5#) = happyGoto action_2+action_53 (6#) = happyGoto action_114+action_53 (8#) = happyGoto action_4+action_53 (15#) = happyGoto action_5+action_53 (16#) = happyGoto action_6+action_53 (17#) = happyGoto action_7+action_53 (20#) = happyGoto action_8+action_53 (23#) = happyGoto action_9+action_53 (24#) = happyGoto action_10+action_53 (25#) = happyGoto action_11+action_53 x = happyTcHack x happyFail++action_54 (34#) = happyShift action_15+action_54 (43#) = happyShift action_18+action_54 (73#) = happyShift action_111+action_54 (74#) = happyShift action_112+action_54 (75#) = happyShift action_26+action_54 (77#) = happyShift action_113+action_54 (78#) = happyShift action_27+action_54 (79#) = happyShift action_28+action_54 (5#) = happyGoto action_2+action_54 (23#) = happyGoto action_110+action_54 (24#) = happyGoto action_10+action_54 (25#) = happyGoto action_11+action_54 x = happyTcHack x happyFail++action_55 (36#) = happyShift action_106+action_55 (49#) = happyShift action_19+action_55 (70#) = happyShift action_107+action_55 (80#) = happyShift action_108+action_55 (83#) = happyShift action_109+action_55 (16#) = happyGoto action_104+action_55 (17#) = happyGoto action_7+action_55 (18#) = happyGoto action_105+action_55 x = happyTcHack x happyFail++action_56 x = happyTcHack x happyReduce_60++action_57 (65#) = happyShift action_103+action_57 (12#) = happyGoto action_102+action_57 x = happyTcHack x happyReduce_50++action_58 (79#) = happyShift action_28+action_58 (5#) = happyGoto action_39+action_58 (9#) = happyGoto action_101+action_58 x = happyTcHack x happyFail++action_59 (79#) = happyShift action_28+action_59 (5#) = happyGoto action_37+action_59 (10#) = happyGoto action_100+action_59 x = happyTcHack x happyFail++action_60 (27#) = happyShift action_12+action_60 (28#) = happyShift action_13+action_60 (29#) = happyShift action_14+action_60 (34#) = happyShift action_15+action_60 (41#) = happyShift action_16+action_60 (42#) = happyShift action_17+action_60 (43#) = happyShift action_18+action_60 (49#) = happyShift action_19+action_60 (55#) = happyShift action_20+action_60 (59#) = happyShift action_21+action_60 (60#) = happyShift action_22+action_60 (68#) = happyShift action_23+action_60 (69#) = happyShift action_24+action_60 (73#) = happyShift action_25+action_60 (75#) = happyShift action_26+action_60 (78#) = happyShift action_27+action_60 (79#) = happyShift action_28+action_60 (81#) = happyShift action_29+action_60 (82#) = happyShift action_30+action_60 (83#) = happyShift action_31+action_60 (5#) = happyGoto action_2+action_60 (6#) = happyGoto action_99+action_60 (8#) = happyGoto action_4+action_60 (15#) = happyGoto action_5+action_60 (16#) = happyGoto action_6+action_60 (17#) = happyGoto action_7+action_60 (20#) = happyGoto action_8+action_60 (23#) = happyGoto action_9+action_60 (24#) = happyGoto action_10+action_60 (25#) = happyGoto action_11+action_60 x = happyTcHack x happyFail++action_61 (27#) = happyShift action_12+action_61 (28#) = happyShift action_13+action_61 (29#) = happyShift action_14+action_61 (34#) = happyShift action_15+action_61 (41#) = happyShift action_16+action_61 (42#) = happyShift action_17+action_61 (43#) = happyShift action_18+action_61 (49#) = happyShift action_19+action_61 (55#) = happyShift action_20+action_61 (59#) = happyShift action_21+action_61 (60#) = happyShift action_22+action_61 (68#) = happyShift action_23+action_61 (69#) = happyShift action_24+action_61 (73#) = happyShift action_25+action_61 (75#) = happyShift action_26+action_61 (78#) = happyShift action_27+action_61 (79#) = happyShift action_28+action_61 (81#) = happyShift action_29+action_61 (82#) = happyShift action_30+action_61 (83#) = happyShift action_31+action_61 (5#) = happyGoto action_2+action_61 (6#) = happyGoto action_98+action_61 (8#) = happyGoto action_4+action_61 (15#) = happyGoto action_5+action_61 (16#) = happyGoto action_6+action_61 (17#) = happyGoto action_7+action_61 (20#) = happyGoto action_8+action_61 (23#) = happyGoto action_9+action_61 (24#) = happyGoto action_10+action_61 (25#) = happyGoto action_11+action_61 x = happyTcHack x happyFail++action_62 (27#) = happyShift action_12+action_62 (28#) = happyShift action_13+action_62 (29#) = happyShift action_14+action_62 (34#) = happyShift action_15+action_62 (41#) = happyShift action_16+action_62 (42#) = happyShift action_17+action_62 (43#) = happyShift action_18+action_62 (49#) = happyShift action_19+action_62 (55#) = happyShift action_20+action_62 (59#) = happyShift action_21+action_62 (60#) = happyShift action_22+action_62 (68#) = happyShift action_23+action_62 (69#) = happyShift action_24+action_62 (73#) = happyShift action_25+action_62 (75#) = happyShift action_26+action_62 (78#) = happyShift action_27+action_62 (79#) = happyShift action_28+action_62 (81#) = happyShift action_29+action_62 (82#) = happyShift action_30+action_62 (83#) = happyShift action_31+action_62 (5#) = happyGoto action_2+action_62 (6#) = happyGoto action_97+action_62 (8#) = happyGoto action_4+action_62 (15#) = happyGoto action_5+action_62 (16#) = happyGoto action_6+action_62 (17#) = happyGoto action_7+action_62 (20#) = happyGoto action_8+action_62 (23#) = happyGoto action_9+action_62 (24#) = happyGoto action_10+action_62 (25#) = happyGoto action_11+action_62 x = happyTcHack x happyFail++action_63 (27#) = happyShift action_12+action_63 (28#) = happyShift action_13+action_63 (29#) = happyShift action_14+action_63 (34#) = happyShift action_15+action_63 (41#) = happyShift action_16+action_63 (42#) = happyShift action_17+action_63 (43#) = happyShift action_18+action_63 (49#) = happyShift action_19+action_63 (55#) = happyShift action_20+action_63 (59#) = happyShift action_21+action_63 (60#) = happyShift action_22+action_63 (68#) = happyShift action_23+action_63 (69#) = happyShift action_24+action_63 (73#) = happyShift action_25+action_63 (75#) = happyShift action_26+action_63 (78#) = happyShift action_27+action_63 (79#) = happyShift action_28+action_63 (81#) = happyShift action_29+action_63 (82#) = happyShift action_30+action_63 (83#) = happyShift action_31+action_63 (5#) = happyGoto action_2+action_63 (6#) = happyGoto action_96+action_63 (8#) = happyGoto action_4+action_63 (15#) = happyGoto action_5+action_63 (16#) = happyGoto action_6+action_63 (17#) = happyGoto action_7+action_63 (20#) = happyGoto action_8+action_63 (23#) = happyGoto action_9+action_63 (24#) = happyGoto action_10+action_63 (25#) = happyGoto action_11+action_63 x = happyTcHack x happyFail++action_64 (27#) = happyShift action_12+action_64 (28#) = happyShift action_13+action_64 (29#) = happyShift action_14+action_64 (34#) = happyShift action_15+action_64 (41#) = happyShift action_16+action_64 (42#) = happyShift action_17+action_64 (43#) = happyShift action_18+action_64 (49#) = happyShift action_19+action_64 (55#) = happyShift action_20+action_64 (59#) = happyShift action_21+action_64 (60#) = happyShift action_22+action_64 (68#) = happyShift action_23+action_64 (69#) = happyShift action_24+action_64 (73#) = happyShift action_25+action_64 (75#) = happyShift action_26+action_64 (78#) = happyShift action_27+action_64 (79#) = happyShift action_28+action_64 (81#) = happyShift action_29+action_64 (82#) = happyShift action_30+action_64 (83#) = happyShift action_31+action_64 (5#) = happyGoto action_2+action_64 (6#) = happyGoto action_95+action_64 (8#) = happyGoto action_4+action_64 (15#) = happyGoto action_5+action_64 (16#) = happyGoto action_6+action_64 (17#) = happyGoto action_7+action_64 (20#) = happyGoto action_8+action_64 (23#) = happyGoto action_9+action_64 (24#) = happyGoto action_10+action_64 (25#) = happyGoto action_11+action_64 x = happyTcHack x happyFail++action_65 (27#) = happyShift action_12+action_65 (28#) = happyShift action_13+action_65 (29#) = happyShift action_14+action_65 (34#) = happyShift action_15+action_65 (41#) = happyShift action_16+action_65 (42#) = happyShift action_17+action_65 (43#) = happyShift action_18+action_65 (49#) = happyShift action_19+action_65 (55#) = happyShift action_20+action_65 (59#) = happyShift action_21+action_65 (60#) = happyShift action_22+action_65 (68#) = happyShift action_23+action_65 (69#) = happyShift action_24+action_65 (73#) = happyShift action_25+action_65 (75#) = happyShift action_26+action_65 (78#) = happyShift action_27+action_65 (79#) = happyShift action_28+action_65 (81#) = happyShift action_29+action_65 (82#) = happyShift action_30+action_65 (83#) = happyShift action_31+action_65 (5#) = happyGoto action_2+action_65 (6#) = happyGoto action_94+action_65 (8#) = happyGoto action_4+action_65 (15#) = happyGoto action_5+action_65 (16#) = happyGoto action_6+action_65 (17#) = happyGoto action_7+action_65 (20#) = happyGoto action_8+action_65 (23#) = happyGoto action_9+action_65 (24#) = happyGoto action_10+action_65 (25#) = happyGoto action_11+action_65 x = happyTcHack x happyFail++action_66 (27#) = happyShift action_12+action_66 (28#) = happyShift action_13+action_66 (29#) = happyShift action_14+action_66 (34#) = happyShift action_15+action_66 (41#) = happyShift action_16+action_66 (42#) = happyShift action_17+action_66 (43#) = happyShift action_18+action_66 (49#) = happyShift action_19+action_66 (55#) = happyShift action_20+action_66 (59#) = happyShift action_21+action_66 (60#) = happyShift action_22+action_66 (68#) = happyShift action_23+action_66 (69#) = happyShift action_24+action_66 (73#) = happyShift action_25+action_66 (75#) = happyShift action_26+action_66 (78#) = happyShift action_27+action_66 (79#) = happyShift action_28+action_66 (81#) = happyShift action_29+action_66 (82#) = happyShift action_30+action_66 (83#) = happyShift action_31+action_66 (5#) = happyGoto action_2+action_66 (6#) = happyGoto action_93+action_66 (8#) = happyGoto action_4+action_66 (15#) = happyGoto action_5+action_66 (16#) = happyGoto action_6+action_66 (17#) = happyGoto action_7+action_66 (20#) = happyGoto action_8+action_66 (23#) = happyGoto action_9+action_66 (24#) = happyGoto action_10+action_66 (25#) = happyGoto action_11+action_66 x = happyTcHack x happyFail++action_67 (27#) = happyShift action_12+action_67 (28#) = happyShift action_13+action_67 (29#) = happyShift action_14+action_67 (34#) = happyShift action_15+action_67 (41#) = happyShift action_16+action_67 (42#) = happyShift action_17+action_67 (43#) = happyShift action_18+action_67 (49#) = happyShift action_19+action_67 (55#) = happyShift action_20+action_67 (59#) = happyShift action_21+action_67 (60#) = happyShift action_22+action_67 (68#) = happyShift action_23+action_67 (69#) = happyShift action_24+action_67 (73#) = happyShift action_25+action_67 (75#) = happyShift action_26+action_67 (78#) = happyShift action_27+action_67 (79#) = happyShift action_28+action_67 (81#) = happyShift action_29+action_67 (82#) = happyShift action_30+action_67 (83#) = happyShift action_31+action_67 (5#) = happyGoto action_2+action_67 (6#) = happyGoto action_92+action_67 (8#) = happyGoto action_4+action_67 (15#) = happyGoto action_5+action_67 (16#) = happyGoto action_6+action_67 (17#) = happyGoto action_7+action_67 (20#) = happyGoto action_8+action_67 (23#) = happyGoto action_9+action_67 (24#) = happyGoto action_10+action_67 (25#) = happyGoto action_11+action_67 x = happyTcHack x happyFail++action_68 (27#) = happyShift action_12+action_68 (28#) = happyShift action_13+action_68 (29#) = happyShift action_14+action_68 (34#) = happyShift action_15+action_68 (41#) = happyShift action_16+action_68 (42#) = happyShift action_17+action_68 (43#) = happyShift action_18+action_68 (49#) = happyShift action_19+action_68 (55#) = happyShift action_20+action_68 (59#) = happyShift action_21+action_68 (60#) = happyShift action_22+action_68 (68#) = happyShift action_23+action_68 (69#) = happyShift action_24+action_68 (73#) = happyShift action_25+action_68 (75#) = happyShift action_26+action_68 (78#) = happyShift action_27+action_68 (79#) = happyShift action_28+action_68 (81#) = happyShift action_29+action_68 (82#) = happyShift action_30+action_68 (83#) = happyShift action_31+action_68 (5#) = happyGoto action_2+action_68 (6#) = happyGoto action_91+action_68 (8#) = happyGoto action_4+action_68 (15#) = happyGoto action_5+action_68 (16#) = happyGoto action_6+action_68 (17#) = happyGoto action_7+action_68 (20#) = happyGoto action_8+action_68 (23#) = happyGoto action_9+action_68 (24#) = happyGoto action_10+action_68 (25#) = happyGoto action_11+action_68 x = happyTcHack x happyFail++action_69 (27#) = happyShift action_12+action_69 (28#) = happyShift action_13+action_69 (29#) = happyShift action_14+action_69 (34#) = happyShift action_15+action_69 (41#) = happyShift action_16+action_69 (42#) = happyShift action_17+action_69 (43#) = happyShift action_18+action_69 (49#) = happyShift action_19+action_69 (55#) = happyShift action_20+action_69 (59#) = happyShift action_21+action_69 (60#) = happyShift action_22+action_69 (68#) = happyShift action_23+action_69 (69#) = happyShift action_24+action_69 (73#) = happyShift action_25+action_69 (75#) = happyShift action_26+action_69 (78#) = happyShift action_27+action_69 (79#) = happyShift action_28+action_69 (81#) = happyShift action_29+action_69 (82#) = happyShift action_30+action_69 (83#) = happyShift action_31+action_69 (5#) = happyGoto action_2+action_69 (6#) = happyGoto action_90+action_69 (8#) = happyGoto action_4+action_69 (15#) = happyGoto action_5+action_69 (16#) = happyGoto action_6+action_69 (17#) = happyGoto action_7+action_69 (20#) = happyGoto action_8+action_69 (23#) = happyGoto action_9+action_69 (24#) = happyGoto action_10+action_69 (25#) = happyGoto action_11+action_69 x = happyTcHack x happyFail++action_70 (27#) = happyShift action_12+action_70 (28#) = happyShift action_13+action_70 (29#) = happyShift action_14+action_70 (34#) = happyShift action_15+action_70 (41#) = happyShift action_16+action_70 (42#) = happyShift action_17+action_70 (43#) = happyShift action_18+action_70 (49#) = happyShift action_19+action_70 (55#) = happyShift action_20+action_70 (59#) = happyShift action_21+action_70 (60#) = happyShift action_22+action_70 (68#) = happyShift action_23+action_70 (69#) = happyShift action_24+action_70 (73#) = happyShift action_25+action_70 (75#) = happyShift action_26+action_70 (78#) = happyShift action_27+action_70 (79#) = happyShift action_28+action_70 (81#) = happyShift action_29+action_70 (82#) = happyShift action_30+action_70 (83#) = happyShift action_31+action_70 (5#) = happyGoto action_2+action_70 (6#) = happyGoto action_89+action_70 (8#) = happyGoto action_4+action_70 (15#) = happyGoto action_5+action_70 (16#) = happyGoto action_6+action_70 (17#) = happyGoto action_7+action_70 (20#) = happyGoto action_8+action_70 (23#) = happyGoto action_9+action_70 (24#) = happyGoto action_10+action_70 (25#) = happyGoto action_11+action_70 x = happyTcHack x happyFail++action_71 (27#) = happyShift action_12+action_71 (28#) = happyShift action_13+action_71 (29#) = happyShift action_14+action_71 (34#) = happyShift action_15+action_71 (41#) = happyShift action_16+action_71 (42#) = happyShift action_17+action_71 (43#) = happyShift action_18+action_71 (49#) = happyShift action_19+action_71 (55#) = happyShift action_20+action_71 (59#) = happyShift action_21+action_71 (60#) = happyShift action_22+action_71 (68#) = happyShift action_23+action_71 (69#) = happyShift action_24+action_71 (73#) = happyShift action_25+action_71 (75#) = happyShift action_26+action_71 (78#) = happyShift action_27+action_71 (79#) = happyShift action_28+action_71 (81#) = happyShift action_29+action_71 (82#) = happyShift action_30+action_71 (83#) = happyShift action_31+action_71 (5#) = happyGoto action_2+action_71 (6#) = happyGoto action_88+action_71 (8#) = happyGoto action_4+action_71 (15#) = happyGoto action_5+action_71 (16#) = happyGoto action_6+action_71 (17#) = happyGoto action_7+action_71 (20#) = happyGoto action_8+action_71 (23#) = happyGoto action_9+action_71 (24#) = happyGoto action_10+action_71 (25#) = happyGoto action_11+action_71 x = happyTcHack x happyFail++action_72 (27#) = happyShift action_12+action_72 (28#) = happyShift action_13+action_72 (29#) = happyShift action_14+action_72 (34#) = happyShift action_15+action_72 (41#) = happyShift action_16+action_72 (42#) = happyShift action_17+action_72 (43#) = happyShift action_18+action_72 (49#) = happyShift action_19+action_72 (55#) = happyShift action_20+action_72 (59#) = happyShift action_21+action_72 (60#) = happyShift action_22+action_72 (68#) = happyShift action_23+action_72 (69#) = happyShift action_24+action_72 (73#) = happyShift action_25+action_72 (75#) = happyShift action_26+action_72 (78#) = happyShift action_27+action_72 (79#) = happyShift action_28+action_72 (81#) = happyShift action_29+action_72 (82#) = happyShift action_30+action_72 (83#) = happyShift action_31+action_72 (5#) = happyGoto action_2+action_72 (6#) = happyGoto action_87+action_72 (8#) = happyGoto action_4+action_72 (15#) = happyGoto action_5+action_72 (16#) = happyGoto action_6+action_72 (17#) = happyGoto action_7+action_72 (20#) = happyGoto action_8+action_72 (23#) = happyGoto action_9+action_72 (24#) = happyGoto action_10+action_72 (25#) = happyGoto action_11+action_72 x = happyTcHack x happyFail++action_73 (27#) = happyShift action_12+action_73 (28#) = happyShift action_13+action_73 (29#) = happyShift action_14+action_73 (34#) = happyShift action_15+action_73 (41#) = happyShift action_16+action_73 (42#) = happyShift action_17+action_73 (43#) = happyShift action_18+action_73 (49#) = happyShift action_19+action_73 (55#) = happyShift action_20+action_73 (59#) = happyShift action_21+action_73 (60#) = happyShift action_22+action_73 (68#) = happyShift action_23+action_73 (69#) = happyShift action_24+action_73 (73#) = happyShift action_25+action_73 (75#) = happyShift action_26+action_73 (78#) = happyShift action_27+action_73 (79#) = happyShift action_28+action_73 (81#) = happyShift action_29+action_73 (82#) = happyShift action_30+action_73 (83#) = happyShift action_31+action_73 (5#) = happyGoto action_2+action_73 (6#) = happyGoto action_86+action_73 (8#) = happyGoto action_4+action_73 (15#) = happyGoto action_5+action_73 (16#) = happyGoto action_6+action_73 (17#) = happyGoto action_7+action_73 (20#) = happyGoto action_8+action_73 (23#) = happyGoto action_9+action_73 (24#) = happyGoto action_10+action_73 (25#) = happyGoto action_11+action_73 x = happyTcHack x happyFail++action_74 (27#) = happyShift action_12+action_74 (28#) = happyShift action_13+action_74 (29#) = happyShift action_14+action_74 (34#) = happyShift action_15+action_74 (41#) = happyShift action_16+action_74 (42#) = happyShift action_17+action_74 (43#) = happyShift action_18+action_74 (49#) = happyShift action_19+action_74 (55#) = happyShift action_20+action_74 (59#) = happyShift action_21+action_74 (60#) = happyShift action_22+action_74 (68#) = happyShift action_23+action_74 (69#) = happyShift action_24+action_74 (73#) = happyShift action_25+action_74 (75#) = happyShift action_26+action_74 (78#) = happyShift action_27+action_74 (79#) = happyShift action_28+action_74 (81#) = happyShift action_29+action_74 (82#) = happyShift action_30+action_74 (83#) = happyShift action_31+action_74 (5#) = happyGoto action_2+action_74 (6#) = happyGoto action_85+action_74 (8#) = happyGoto action_4+action_74 (15#) = happyGoto action_5+action_74 (16#) = happyGoto action_6+action_74 (17#) = happyGoto action_7+action_74 (20#) = happyGoto action_8+action_74 (23#) = happyGoto action_9+action_74 (24#) = happyGoto action_10+action_74 (25#) = happyGoto action_11+action_74 x = happyTcHack x happyFail++action_75 (27#) = happyShift action_12+action_75 (28#) = happyShift action_13+action_75 (29#) = happyShift action_14+action_75 (34#) = happyShift action_15+action_75 (41#) = happyShift action_16+action_75 (42#) = happyShift action_17+action_75 (43#) = happyShift action_18+action_75 (49#) = happyShift action_19+action_75 (55#) = happyShift action_20+action_75 (59#) = happyShift action_21+action_75 (60#) = happyShift action_22+action_75 (68#) = happyShift action_23+action_75 (69#) = happyShift action_24+action_75 (73#) = happyShift action_25+action_75 (75#) = happyShift action_26+action_75 (78#) = happyShift action_27+action_75 (79#) = happyShift action_28+action_75 (81#) = happyShift action_29+action_75 (82#) = happyShift action_30+action_75 (83#) = happyShift action_31+action_75 (5#) = happyGoto action_2+action_75 (6#) = happyGoto action_84+action_75 (8#) = happyGoto action_4+action_75 (15#) = happyGoto action_5+action_75 (16#) = happyGoto action_6+action_75 (17#) = happyGoto action_7+action_75 (20#) = happyGoto action_8+action_75 (23#) = happyGoto action_9+action_75 (24#) = happyGoto action_10+action_75 (25#) = happyGoto action_11+action_75 x = happyTcHack x happyFail++action_76 (27#) = happyShift action_12+action_76 (28#) = happyShift action_13+action_76 (29#) = happyShift action_14+action_76 (34#) = happyShift action_15+action_76 (41#) = happyShift action_16+action_76 (42#) = happyShift action_17+action_76 (43#) = happyShift action_18+action_76 (49#) = happyShift action_19+action_76 (55#) = happyShift action_20+action_76 (59#) = happyShift action_21+action_76 (60#) = happyShift action_22+action_76 (68#) = happyShift action_23+action_76 (69#) = happyShift action_24+action_76 (73#) = happyShift action_25+action_76 (75#) = happyShift action_26+action_76 (78#) = happyShift action_27+action_76 (79#) = happyShift action_28+action_76 (81#) = happyShift action_29+action_76 (82#) = happyShift action_30+action_76 (83#) = happyShift action_31+action_76 (5#) = happyGoto action_2+action_76 (6#) = happyGoto action_83+action_76 (8#) = happyGoto action_4+action_76 (15#) = happyGoto action_5+action_76 (16#) = happyGoto action_6+action_76 (17#) = happyGoto action_7+action_76 (20#) = happyGoto action_8+action_76 (23#) = happyGoto action_9+action_76 (24#) = happyGoto action_10+action_76 (25#) = happyGoto action_11+action_76 x = happyTcHack x happyFail++action_77 (27#) = happyShift action_12+action_77 (28#) = happyShift action_13+action_77 (29#) = happyShift action_14+action_77 (34#) = happyShift action_15+action_77 (41#) = happyShift action_16+action_77 (42#) = happyShift action_17+action_77 (43#) = happyShift action_18+action_77 (49#) = happyShift action_19+action_77 (55#) = happyShift action_20+action_77 (59#) = happyShift action_21+action_77 (60#) = happyShift action_22+action_77 (68#) = happyShift action_23+action_77 (69#) = happyShift action_24+action_77 (73#) = happyShift action_25+action_77 (75#) = happyShift action_26+action_77 (78#) = happyShift action_27+action_77 (79#) = happyShift action_28+action_77 (81#) = happyShift action_29+action_77 (82#) = happyShift action_30+action_77 (83#) = happyShift action_31+action_77 (5#) = happyGoto action_2+action_77 (6#) = happyGoto action_82+action_77 (8#) = happyGoto action_4+action_77 (15#) = happyGoto action_5+action_77 (16#) = happyGoto action_6+action_77 (17#) = happyGoto action_7+action_77 (20#) = happyGoto action_8+action_77 (23#) = happyGoto action_9+action_77 (24#) = happyGoto action_10+action_77 (25#) = happyGoto action_11+action_77 x = happyTcHack x happyFail++action_78 (27#) = happyShift action_12+action_78 (28#) = happyShift action_13+action_78 (29#) = happyShift action_14+action_78 (34#) = happyShift action_15+action_78 (41#) = happyShift action_16+action_78 (42#) = happyShift action_17+action_78 (43#) = happyShift action_18+action_78 (49#) = happyShift action_19+action_78 (55#) = happyShift action_20+action_78 (59#) = happyShift action_21+action_78 (60#) = happyShift action_22+action_78 (68#) = happyShift action_23+action_78 (69#) = happyShift action_24+action_78 (73#) = happyShift action_25+action_78 (75#) = happyShift action_26+action_78 (78#) = happyShift action_27+action_78 (79#) = happyShift action_28+action_78 (81#) = happyShift action_29+action_78 (82#) = happyShift action_30+action_78 (83#) = happyShift action_31+action_78 (5#) = happyGoto action_2+action_78 (6#) = happyGoto action_81+action_78 (8#) = happyGoto action_4+action_78 (15#) = happyGoto action_5+action_78 (16#) = happyGoto action_6+action_78 (17#) = happyGoto action_7+action_78 (20#) = happyGoto action_8+action_78 (23#) = happyGoto action_9+action_78 (24#) = happyGoto action_10+action_78 (25#) = happyGoto action_11+action_78 x = happyTcHack x happyFail++action_79 (27#) = happyShift action_12+action_79 (28#) = happyShift action_13+action_79 (29#) = happyShift action_14+action_79 (34#) = happyShift action_15+action_79 (41#) = happyShift action_16+action_79 (42#) = happyShift action_17+action_79 (43#) = happyShift action_18+action_79 (49#) = happyShift action_19+action_79 (55#) = happyShift action_20+action_79 (59#) = happyShift action_21+action_79 (60#) = happyShift action_22+action_79 (68#) = happyShift action_23+action_79 (69#) = happyShift action_24+action_79 (73#) = happyShift action_25+action_79 (75#) = happyShift action_26+action_79 (78#) = happyShift action_27+action_79 (79#) = happyShift action_28+action_79 (81#) = happyShift action_29+action_79 (82#) = happyShift action_30+action_79 (83#) = happyShift action_31+action_79 (5#) = happyGoto action_2+action_79 (6#) = happyGoto action_80+action_79 (8#) = happyGoto action_4+action_79 (15#) = happyGoto action_5+action_79 (16#) = happyGoto action_6+action_79 (17#) = happyGoto action_7+action_79 (20#) = happyGoto action_8+action_79 (23#) = happyGoto action_9+action_79 (24#) = happyGoto action_10+action_79 (25#) = happyGoto action_11+action_79 x = happyTcHack x happyFail++action_80 (40#) = happyShift action_61+action_80 (41#) = happyShift action_62+action_80 (42#) = happyShift action_63+action_80 (43#) = happyShift action_64+action_80 (44#) = happyShift action_65+action_80 (45#) = happyShift action_66+action_80 (46#) = happyShift action_67+action_80 (47#) = happyShift action_68+action_80 (48#) = happyShift action_69+action_80 (49#) = happyShift action_70+action_80 (50#) = happyShift action_71+action_80 (51#) = happyShift action_72+action_80 (52#) = happyShift action_73+action_80 (53#) = happyShift action_74+action_80 (54#) = happyShift action_75+action_80 (55#) = happyShift action_76+action_80 x = happyTcHack x happyReduce_28++action_81 (40#) = happyShift action_61+action_81 (41#) = happyShift action_62+action_81 (42#) = happyShift action_63+action_81 (43#) = happyShift action_64+action_81 (44#) = happyShift action_65+action_81 (45#) = happyShift action_66+action_81 (46#) = happyShift action_67+action_81 (47#) = happyShift action_68+action_81 (48#) = happyShift action_69+action_81 (49#) = happyShift action_70+action_81 (50#) = happyShift action_71+action_81 (51#) = happyShift action_72+action_81 (52#) = happyShift action_73+action_81 (53#) = happyShift action_74+action_81 (54#) = happyShift action_75+action_81 (55#) = happyShift action_76+action_81 x = happyTcHack x happyReduce_27++action_82 (40#) = happyShift action_61+action_82 (41#) = happyShift action_62+action_82 (42#) = happyShift action_63+action_82 (43#) = happyShift action_64+action_82 (44#) = happyShift action_65+action_82 (45#) = happyShift action_66+action_82 (46#) = happyShift action_67+action_82 (47#) = happyShift action_68+action_82 (48#) = happyShift action_69+action_82 (49#) = happyShift action_70+action_82 (50#) = happyShift action_71+action_82 (51#) = happyShift action_72+action_82 (52#) = happyShift action_73+action_82 (53#) = happyShift action_74+action_82 (54#) = happyShift action_75+action_82 (55#) = happyShift action_76+action_82 x = happyTcHack x happyReduce_26++action_83 (40#) = happyShift action_61+action_83 (41#) = happyShift action_62+action_83 (42#) = happyShift action_63+action_83 (43#) = happyShift action_64+action_83 (44#) = happyShift action_65+action_83 (45#) = happyShift action_66+action_83 (46#) = happyShift action_67+action_83 (47#) = happyShift action_68+action_83 (48#) = happyShift action_69+action_83 (49#) = happyShift action_70+action_83 (50#) = happyShift action_71+action_83 (51#) = happyShift action_72+action_83 (52#) = happyShift action_73+action_83 (55#) = happyFail+action_83 x = happyTcHack x happyReduce_25++action_84 (40#) = happyShift action_61+action_84 (41#) = happyShift action_62+action_84 (42#) = happyShift action_63+action_84 (43#) = happyShift action_64+action_84 (44#) = happyShift action_65+action_84 (45#) = happyShift action_66+action_84 (46#) = happyShift action_67+action_84 (47#) = happyShift action_68+action_84 (48#) = happyShift action_69+action_84 (49#) = happyShift action_70+action_84 (50#) = happyShift action_71+action_84 (51#) = happyShift action_72+action_84 (52#) = happyShift action_73+action_84 (53#) = happyShift action_74+action_84 (54#) = happyShift action_75+action_84 (55#) = happyShift action_76+action_84 x = happyTcHack x happyReduce_24++action_85 (40#) = happyShift action_61+action_85 (41#) = happyShift action_62+action_85 (42#) = happyShift action_63+action_85 (43#) = happyShift action_64+action_85 (44#) = happyShift action_65+action_85 (45#) = happyShift action_66+action_85 (46#) = happyShift action_67+action_85 (47#) = happyShift action_68+action_85 (48#) = happyShift action_69+action_85 (49#) = happyShift action_70+action_85 (50#) = happyShift action_71+action_85 (51#) = happyShift action_72+action_85 (52#) = happyShift action_73+action_85 (53#) = happyShift action_74+action_85 (55#) = happyShift action_76+action_85 x = happyTcHack x happyReduce_23++action_86 (40#) = happyShift action_61+action_86 (41#) = happyShift action_62+action_86 (42#) = happyShift action_63+action_86 (43#) = happyShift action_64+action_86 (44#) = happyShift action_65+action_86 (45#) = happyShift action_66+action_86 (46#) = happyShift action_67+action_86 x = happyTcHack x happyReduce_22++action_87 (40#) = happyShift action_61+action_87 (41#) = happyShift action_62+action_87 (42#) = happyShift action_63+action_87 (43#) = happyShift action_64+action_87 (44#) = happyShift action_65+action_87 (45#) = happyShift action_66+action_87 (46#) = happyShift action_67+action_87 x = happyTcHack x happyReduce_21++action_88 (40#) = happyShift action_61+action_88 (41#) = happyShift action_62+action_88 (42#) = happyShift action_63+action_88 (43#) = happyShift action_64+action_88 (44#) = happyShift action_65+action_88 (45#) = happyShift action_66+action_88 (46#) = happyShift action_67+action_88 x = happyTcHack x happyReduce_20++action_89 (40#) = happyShift action_61+action_89 (41#) = happyShift action_62+action_89 (42#) = happyShift action_63+action_89 (43#) = happyShift action_64+action_89 (44#) = happyShift action_65+action_89 (45#) = happyShift action_66+action_89 (46#) = happyShift action_67+action_89 x = happyTcHack x happyReduce_19++action_90 (40#) = happyShift action_61+action_90 (41#) = happyShift action_62+action_90 (42#) = happyShift action_63+action_90 (43#) = happyShift action_64+action_90 (44#) = happyShift action_65+action_90 (45#) = happyShift action_66+action_90 (46#) = happyShift action_67+action_90 x = happyTcHack x happyReduce_18++action_91 (40#) = happyShift action_61+action_91 (41#) = happyShift action_62+action_91 (42#) = happyShift action_63+action_91 (43#) = happyShift action_64+action_91 (44#) = happyShift action_65+action_91 (45#) = happyShift action_66+action_91 (46#) = happyShift action_67+action_91 x = happyTcHack x happyReduce_17++action_92 (40#) = happyShift action_61+action_92 x = happyTcHack x happyReduce_16++action_93 (40#) = happyShift action_61+action_93 x = happyTcHack x happyReduce_15++action_94 (40#) = happyShift action_61+action_94 x = happyTcHack x happyReduce_14++action_95 (40#) = happyShift action_61+action_95 x = happyTcHack x happyReduce_13++action_96 (40#) = happyShift action_61+action_96 (43#) = happyShift action_64+action_96 (44#) = happyShift action_65+action_96 (45#) = happyShift action_66+action_96 (46#) = happyShift action_67+action_96 x = happyTcHack x happyReduce_12++action_97 (40#) = happyShift action_61+action_97 (43#) = happyShift action_64+action_97 (44#) = happyShift action_65+action_97 (45#) = happyShift action_66+action_97 (46#) = happyShift action_67+action_97 x = happyTcHack x happyReduce_11++action_98 x = happyTcHack x happyReduce_10++action_99 (40#) = happyShift action_61+action_99 (41#) = happyShift action_62+action_99 (42#) = happyShift action_63+action_99 (43#) = happyShift action_64+action_99 (44#) = happyShift action_65+action_99 (45#) = happyShift action_66+action_99 (46#) = happyShift action_67+action_99 (47#) = happyShift action_68+action_99 (48#) = happyShift action_69+action_99 (49#) = happyShift action_70+action_99 (50#) = happyShift action_71+action_99 (51#) = happyShift action_72+action_99 (52#) = happyShift action_73+action_99 (53#) = happyShift action_74+action_99 (54#) = happyShift action_75+action_99 (55#) = happyShift action_76+action_99 (56#) = happyShift action_77+action_99 (57#) = happyShift action_78+action_99 (58#) = happyShift action_79+action_99 x = happyTcHack x happyReduce_47++action_100 (62#) = happyShift action_125+action_100 x = happyTcHack x happyReduce_40++action_101 (62#) = happyShift action_116+action_101 x = happyTcHack x happyReduce_39++action_102 (26#) = happyShift action_158+action_102 x = happyTcHack x happyFail++action_103 (27#) = happyShift action_12+action_103 (28#) = happyShift action_13+action_103 (29#) = happyShift action_14+action_103 (34#) = happyShift action_15+action_103 (41#) = happyShift action_16+action_103 (42#) = happyShift action_17+action_103 (43#) = happyShift action_18+action_103 (49#) = happyShift action_19+action_103 (55#) = happyShift action_20+action_103 (59#) = happyShift action_21+action_103 (60#) = happyShift action_22+action_103 (68#) = happyShift action_23+action_103 (69#) = happyShift action_24+action_103 (73#) = happyShift action_25+action_103 (75#) = happyShift action_26+action_103 (78#) = happyShift action_27+action_103 (79#) = happyShift action_28+action_103 (81#) = happyShift action_29+action_103 (82#) = happyShift action_30+action_103 (83#) = happyShift action_31+action_103 (5#) = happyGoto action_2+action_103 (6#) = happyGoto action_156+action_103 (8#) = happyGoto action_4+action_103 (13#) = happyGoto action_157+action_103 (15#) = happyGoto action_5+action_103 (16#) = happyGoto action_6+action_103 (17#) = happyGoto action_7+action_103 (20#) = happyGoto action_8+action_103 (23#) = happyGoto action_9+action_103 (24#) = happyGoto action_10+action_103 (25#) = happyGoto action_11+action_103 x = happyTcHack x happyFail++action_104 x = happyTcHack x happyReduce_66++action_105 (36#) = happyShift action_152+action_105 (49#) = happyShift action_19+action_105 (70#) = happyShift action_153+action_105 (80#) = happyShift action_154+action_105 (83#) = happyShift action_155+action_105 (16#) = happyGoto action_151+action_105 (17#) = happyGoto action_7+action_105 x = happyTcHack x happyFail++action_106 (27#) = happyShift action_12+action_106 (28#) = happyShift action_13+action_106 (29#) = happyShift action_14+action_106 (34#) = happyShift action_15+action_106 (41#) = happyShift action_16+action_106 (42#) = happyShift action_17+action_106 (43#) = happyShift action_18+action_106 (49#) = happyShift action_19+action_106 (55#) = happyShift action_20+action_106 (59#) = happyShift action_21+action_106 (60#) = happyShift action_22+action_106 (68#) = happyShift action_23+action_106 (69#) = happyShift action_24+action_106 (73#) = happyShift action_25+action_106 (75#) = happyShift action_26+action_106 (78#) = happyShift action_27+action_106 (79#) = happyShift action_28+action_106 (81#) = happyShift action_29+action_106 (82#) = happyShift action_30+action_106 (83#) = happyShift action_31+action_106 (5#) = happyGoto action_2+action_106 (6#) = happyGoto action_45+action_106 (7#) = happyGoto action_150+action_106 (8#) = happyGoto action_4+action_106 (15#) = happyGoto action_5+action_106 (16#) = happyGoto action_6+action_106 (17#) = happyGoto action_7+action_106 (20#) = happyGoto action_8+action_106 (23#) = happyGoto action_9+action_106 (24#) = happyGoto action_10+action_106 (25#) = happyGoto action_11+action_106 x = happyTcHack x happyFail++action_107 (75#) = happyShift action_149+action_107 x = happyTcHack x happyFail++action_108 x = happyTcHack x happyReduce_65++action_109 x = happyTcHack x happyReduce_64++action_110 (32#) = happyShift action_53+action_110 x = happyTcHack x happyReduce_81++action_111 (34#) = happyShift action_15+action_111 (43#) = happyShift action_18+action_111 (75#) = happyShift action_26+action_111 (78#) = happyShift action_27+action_111 (79#) = happyShift action_28+action_111 (5#) = happyGoto action_2+action_111 (23#) = happyGoto action_148+action_111 (24#) = happyGoto action_10+action_111 (25#) = happyGoto action_11+action_111 x = happyTcHack x happyFail++action_112 (34#) = happyShift action_15+action_112 (43#) = happyShift action_18+action_112 (73#) = happyShift action_147+action_112 (75#) = happyShift action_26+action_112 (78#) = happyShift action_27+action_112 (79#) = happyShift action_28+action_112 (5#) = happyGoto action_2+action_112 (23#) = happyGoto action_146+action_112 (24#) = happyGoto action_10+action_112 (25#) = happyGoto action_11+action_112 x = happyTcHack x happyFail++action_113 x = happyTcHack x happyReduce_85++action_114 (33#) = happyShift action_145+action_114 (40#) = happyShift action_61+action_114 (41#) = happyShift action_62+action_114 (42#) = happyShift action_63+action_114 (43#) = happyShift action_64+action_114 (44#) = happyShift action_65+action_114 (45#) = happyShift action_66+action_114 (46#) = happyShift action_67+action_114 (47#) = happyShift action_68+action_114 (48#) = happyShift action_69+action_114 (49#) = happyShift action_70+action_114 (50#) = happyShift action_71+action_114 (51#) = happyShift action_72+action_114 (52#) = happyShift action_73+action_114 (53#) = happyShift action_74+action_114 (54#) = happyShift action_75+action_114 (55#) = happyShift action_76+action_114 (56#) = happyShift action_77+action_114 (57#) = happyShift action_78+action_114 (58#) = happyShift action_79+action_114 x = happyTcHack x happyFail++action_115 x = happyTcHack x happyReduce_80++action_116 (79#) = happyShift action_28+action_116 (5#) = happyGoto action_144+action_116 x = happyTcHack x happyFail++action_117 (27#) = happyShift action_12+action_117 (28#) = happyShift action_13+action_117 (29#) = happyShift action_14+action_117 (34#) = happyShift action_15+action_117 (41#) = happyShift action_16+action_117 (42#) = happyShift action_17+action_117 (43#) = happyShift action_18+action_117 (49#) = happyShift action_19+action_117 (55#) = happyShift action_20+action_117 (59#) = happyShift action_21+action_117 (60#) = happyShift action_22+action_117 (68#) = happyShift action_23+action_117 (69#) = happyShift action_24+action_117 (73#) = happyShift action_25+action_117 (75#) = happyShift action_26+action_117 (78#) = happyShift action_27+action_117 (79#) = happyShift action_28+action_117 (81#) = happyShift action_29+action_117 (82#) = happyShift action_30+action_117 (83#) = happyShift action_31+action_117 (5#) = happyGoto action_2+action_117 (6#) = happyGoto action_143+action_117 (8#) = happyGoto action_4+action_117 (15#) = happyGoto action_5+action_117 (16#) = happyGoto action_6+action_117 (17#) = happyGoto action_7+action_117 (20#) = happyGoto action_8+action_117 (23#) = happyGoto action_9+action_117 (24#) = happyGoto action_10+action_117 (25#) = happyGoto action_11+action_117 x = happyTcHack x happyFail++action_118 (27#) = happyShift action_12+action_118 (28#) = happyShift action_13+action_118 (29#) = happyShift action_14+action_118 (34#) = happyShift action_15+action_118 (41#) = happyShift action_16+action_118 (42#) = happyShift action_17+action_118 (43#) = happyShift action_18+action_118 (49#) = happyShift action_19+action_118 (55#) = happyShift action_20+action_118 (59#) = happyShift action_21+action_118 (60#) = happyShift action_22+action_118 (68#) = happyShift action_23+action_118 (69#) = happyShift action_24+action_118 (73#) = happyShift action_25+action_118 (75#) = happyShift action_26+action_118 (78#) = happyShift action_27+action_118 (79#) = happyShift action_28+action_118 (81#) = happyShift action_29+action_118 (82#) = happyShift action_30+action_118 (83#) = happyShift action_31+action_118 (5#) = happyGoto action_2+action_118 (6#) = happyGoto action_142+action_118 (8#) = happyGoto action_4+action_118 (15#) = happyGoto action_5+action_118 (16#) = happyGoto action_6+action_118 (17#) = happyGoto action_7+action_118 (20#) = happyGoto action_8+action_118 (23#) = happyGoto action_9+action_118 (24#) = happyGoto action_10+action_118 (25#) = happyGoto action_11+action_118 x = happyTcHack x happyFail++action_119 (27#) = happyShift action_12+action_119 (28#) = happyShift action_13+action_119 (29#) = happyShift action_14+action_119 (34#) = happyShift action_15+action_119 (41#) = happyShift action_16+action_119 (42#) = happyShift action_17+action_119 (43#) = happyShift action_18+action_119 (49#) = happyShift action_19+action_119 (55#) = happyShift action_20+action_119 (59#) = happyShift action_21+action_119 (60#) = happyShift action_22+action_119 (68#) = happyShift action_23+action_119 (69#) = happyShift action_24+action_119 (73#) = happyShift action_25+action_119 (75#) = happyShift action_26+action_119 (78#) = happyShift action_27+action_119 (79#) = happyShift action_28+action_119 (81#) = happyShift action_29+action_119 (82#) = happyShift action_30+action_119 (83#) = happyShift action_31+action_119 (5#) = happyGoto action_2+action_119 (6#) = happyGoto action_141+action_119 (8#) = happyGoto action_4+action_119 (15#) = happyGoto action_5+action_119 (16#) = happyGoto action_6+action_119 (17#) = happyGoto action_7+action_119 (20#) = happyGoto action_8+action_119 (23#) = happyGoto action_9+action_119 (24#) = happyGoto action_10+action_119 (25#) = happyGoto action_11+action_119 x = happyTcHack x happyFail++action_120 x = happyTcHack x happyReduce_93++action_121 (27#) = happyShift action_12+action_121 (28#) = happyShift action_13+action_121 (29#) = happyShift action_14+action_121 (34#) = happyShift action_15+action_121 (41#) = happyShift action_16+action_121 (42#) = happyShift action_17+action_121 (43#) = happyShift action_18+action_121 (49#) = happyShift action_19+action_121 (55#) = happyShift action_20+action_121 (59#) = happyShift action_21+action_121 (60#) = happyShift action_22+action_121 (68#) = happyShift action_23+action_121 (69#) = happyShift action_24+action_121 (73#) = happyShift action_25+action_121 (75#) = happyShift action_26+action_121 (78#) = happyShift action_27+action_121 (79#) = happyShift action_28+action_121 (81#) = happyShift action_29+action_121 (82#) = happyShift action_30+action_121 (83#) = happyShift action_31+action_121 (5#) = happyGoto action_2+action_121 (6#) = happyGoto action_140+action_121 (8#) = happyGoto action_4+action_121 (15#) = happyGoto action_5+action_121 (16#) = happyGoto action_6+action_121 (17#) = happyGoto action_7+action_121 (20#) = happyGoto action_8+action_121 (23#) = happyGoto action_9+action_121 (24#) = happyGoto action_10+action_121 (25#) = happyGoto action_11+action_121 x = happyTcHack x happyFail++action_122 (75#) = happyShift action_139+action_122 x = happyTcHack x happyReduce_62++action_123 (47#) = happyShift action_138+action_123 x = happyTcHack x happyFail++action_124 (27#) = happyShift action_12+action_124 (28#) = happyShift action_13+action_124 (29#) = happyShift action_14+action_124 (34#) = happyShift action_15+action_124 (41#) = happyShift action_16+action_124 (42#) = happyShift action_17+action_124 (43#) = happyShift action_18+action_124 (49#) = happyShift action_19+action_124 (55#) = happyShift action_20+action_124 (59#) = happyShift action_21+action_124 (60#) = happyShift action_22+action_124 (68#) = happyShift action_23+action_124 (69#) = happyShift action_24+action_124 (73#) = happyShift action_25+action_124 (75#) = happyShift action_26+action_124 (78#) = happyShift action_27+action_124 (79#) = happyShift action_28+action_124 (81#) = happyShift action_29+action_124 (82#) = happyShift action_30+action_124 (83#) = happyShift action_31+action_124 (5#) = happyGoto action_2+action_124 (6#) = happyGoto action_137+action_124 (8#) = happyGoto action_4+action_124 (15#) = happyGoto action_5+action_124 (16#) = happyGoto action_6+action_124 (17#) = happyGoto action_7+action_124 (20#) = happyGoto action_8+action_124 (23#) = happyGoto action_9+action_124 (24#) = happyGoto action_10+action_124 (25#) = happyGoto action_11+action_124 x = happyTcHack x happyFail++action_125 (79#) = happyShift action_28+action_125 (5#) = happyGoto action_136+action_125 x = happyTcHack x happyFail++action_126 (27#) = happyShift action_12+action_126 (28#) = happyShift action_13+action_126 (29#) = happyShift action_14+action_126 (34#) = happyShift action_15+action_126 (41#) = happyShift action_16+action_126 (42#) = happyShift action_17+action_126 (43#) = happyShift action_18+action_126 (49#) = happyShift action_19+action_126 (55#) = happyShift action_20+action_126 (59#) = happyShift action_21+action_126 (60#) = happyShift action_22+action_126 (68#) = happyShift action_23+action_126 (69#) = happyShift action_24+action_126 (73#) = happyShift action_25+action_126 (75#) = happyShift action_26+action_126 (78#) = happyShift action_27+action_126 (79#) = happyShift action_28+action_126 (81#) = happyShift action_29+action_126 (82#) = happyShift action_30+action_126 (83#) = happyShift action_31+action_126 (5#) = happyGoto action_2+action_126 (6#) = happyGoto action_135+action_126 (8#) = happyGoto action_4+action_126 (15#) = happyGoto action_5+action_126 (16#) = happyGoto action_6+action_126 (17#) = happyGoto action_7+action_126 (20#) = happyGoto action_8+action_126 (23#) = happyGoto action_9+action_126 (24#) = happyGoto action_10+action_126 (25#) = happyGoto action_11+action_126 x = happyTcHack x happyFail++action_127 (35#) = happyShift action_134+action_127 x = happyTcHack x happyFail++action_128 (35#) = happyShift action_133+action_128 x = happyTcHack x happyFail++action_129 (74#) = happyShift action_54+action_129 (22#) = happyGoto action_115+action_129 x = happyTcHack x happyReduce_78++action_130 (35#) = happyShift action_132+action_130 (62#) = happyShift action_121+action_130 x = happyTcHack x happyFail++action_131 x = happyTcHack x happyReduce_96++action_132 x = happyTcHack x happyReduce_95++action_133 x = happyTcHack x happyReduce_57++action_134 x = happyTcHack x happyReduce_56++action_135 (40#) = happyShift action_61+action_135 (41#) = happyShift action_62+action_135 (42#) = happyShift action_63+action_135 (43#) = happyShift action_64+action_135 (44#) = happyShift action_65+action_135 (45#) = happyShift action_66+action_135 (46#) = happyShift action_67+action_135 (47#) = happyShift action_68+action_135 (48#) = happyShift action_69+action_135 (49#) = happyShift action_70+action_135 (50#) = happyShift action_71+action_135 (51#) = happyShift action_72+action_135 (52#) = happyShift action_73+action_135 (53#) = happyShift action_74+action_135 (54#) = happyShift action_75+action_135 (55#) = happyShift action_76+action_135 (56#) = happyShift action_77+action_135 (57#) = happyShift action_78+action_135 (58#) = happyShift action_79+action_135 x = happyTcHack x happyReduce_45++action_136 (63#) = happyShift action_175+action_136 x = happyTcHack x happyFail++action_137 (40#) = happyShift action_61+action_137 (41#) = happyShift action_62+action_137 (42#) = happyShift action_63+action_137 (43#) = happyShift action_64+action_137 (44#) = happyShift action_65+action_137 (45#) = happyShift action_66+action_137 (46#) = happyShift action_67+action_137 (47#) = happyShift action_68+action_137 (48#) = happyShift action_69+action_137 (49#) = happyShift action_70+action_137 (50#) = happyShift action_71+action_137 (51#) = happyShift action_72+action_137 (52#) = happyShift action_73+action_137 (53#) = happyShift action_74+action_137 (54#) = happyShift action_75+action_137 (55#) = happyShift action_76+action_137 (56#) = happyShift action_77+action_137 (57#) = happyShift action_78+action_137 (58#) = happyShift action_79+action_137 (76#) = happyShift action_174+action_137 x = happyTcHack x happyReduce_41++action_138 (38#) = happyShift action_172+action_138 (83#) = happyShift action_173+action_138 x = happyTcHack x happyFail++action_139 (47#) = happyShift action_171+action_139 x = happyTcHack x happyFail++action_140 (40#) = happyShift action_61+action_140 (41#) = happyShift action_62+action_140 (42#) = happyShift action_63+action_140 (43#) = happyShift action_64+action_140 (44#) = happyShift action_65+action_140 (45#) = happyShift action_66+action_140 (46#) = happyShift action_67+action_140 (47#) = happyShift action_68+action_140 (48#) = happyShift action_69+action_140 (49#) = happyShift action_70+action_140 (50#) = happyShift action_71+action_140 (51#) = happyShift action_72+action_140 (52#) = happyShift action_73+action_140 (53#) = happyShift action_74+action_140 (54#) = happyShift action_75+action_140 (55#) = happyShift action_76+action_140 (56#) = happyShift action_77+action_140 (57#) = happyShift action_78+action_140 (58#) = happyShift action_79+action_140 x = happyTcHack x happyReduce_36++action_141 (31#) = happyShift action_170+action_141 (40#) = happyShift action_61+action_141 (41#) = happyShift action_62+action_141 (42#) = happyShift action_63+action_141 (43#) = happyShift action_64+action_141 (44#) = happyShift action_65+action_141 (45#) = happyShift action_66+action_141 (46#) = happyShift action_67+action_141 (47#) = happyShift action_68+action_141 (48#) = happyShift action_69+action_141 (49#) = happyShift action_70+action_141 (50#) = happyShift action_71+action_141 (51#) = happyShift action_72+action_141 (52#) = happyShift action_73+action_141 (53#) = happyShift action_74+action_141 (54#) = happyShift action_75+action_141 (55#) = happyShift action_76+action_141 (56#) = happyShift action_77+action_141 (57#) = happyShift action_78+action_141 (58#) = happyShift action_79+action_141 x = happyTcHack x happyFail++action_142 (40#) = happyShift action_61+action_142 (41#) = happyShift action_62+action_142 (42#) = happyShift action_63+action_142 (43#) = happyShift action_64+action_142 (44#) = happyShift action_65+action_142 (45#) = happyShift action_66+action_142 (46#) = happyShift action_67+action_142 (47#) = happyShift action_68+action_142 (48#) = happyShift action_69+action_142 (49#) = happyShift action_70+action_142 (50#) = happyShift action_71+action_142 (51#) = happyShift action_72+action_142 (52#) = happyShift action_73+action_142 (53#) = happyShift action_74+action_142 (54#) = happyShift action_75+action_142 (55#) = happyShift action_76+action_142 (56#) = happyShift action_77+action_142 (57#) = happyShift action_78+action_142 (58#) = happyShift action_79+action_142 x = happyTcHack x happyReduce_5++action_143 (40#) = happyShift action_61+action_143 (41#) = happyShift action_62+action_143 (42#) = happyShift action_63+action_143 (43#) = happyShift action_64+action_143 (44#) = happyShift action_65+action_143 (45#) = happyShift action_66+action_143 (46#) = happyShift action_67+action_143 (47#) = happyShift action_68+action_143 (48#) = happyShift action_69+action_143 (49#) = happyShift action_70+action_143 (50#) = happyShift action_71+action_143 (51#) = happyShift action_72+action_143 (52#) = happyShift action_73+action_143 (53#) = happyShift action_74+action_143 (54#) = happyShift action_75+action_143 (55#) = happyShift action_76+action_143 (56#) = happyShift action_77+action_143 (57#) = happyShift action_78+action_143 (58#) = happyShift action_79+action_143 x = happyTcHack x happyReduce_4++action_144 (61#) = happyShift action_169+action_144 x = happyTcHack x happyFail++action_145 x = happyTcHack x happyReduce_87++action_146 (32#) = happyShift action_53+action_146 x = happyTcHack x happyReduce_83++action_147 (34#) = happyShift action_15+action_147 (43#) = happyShift action_18+action_147 (75#) = happyShift action_26+action_147 (78#) = happyShift action_27+action_147 (79#) = happyShift action_28+action_147 (5#) = happyGoto action_2+action_147 (23#) = happyGoto action_168+action_147 (24#) = happyGoto action_10+action_147 (25#) = happyGoto action_11+action_147 x = happyTcHack x happyFail++action_148 (32#) = happyShift action_53+action_148 x = happyTcHack x happyReduce_82++action_149 (51#) = happyShift action_167+action_149 x = happyTcHack x happyFail++action_150 (37#) = happyShift action_166+action_150 (62#) = happyShift action_121+action_150 x = happyTcHack x happyFail++action_151 x = happyTcHack x happyReduce_70++action_152 (27#) = happyShift action_12+action_152 (28#) = happyShift action_13+action_152 (29#) = happyShift action_14+action_152 (34#) = happyShift action_15+action_152 (41#) = happyShift action_16+action_152 (42#) = happyShift action_17+action_152 (43#) = happyShift action_18+action_152 (49#) = happyShift action_19+action_152 (55#) = happyShift action_20+action_152 (59#) = happyShift action_21+action_152 (60#) = happyShift action_22+action_152 (68#) = happyShift action_23+action_152 (69#) = happyShift action_24+action_152 (73#) = happyShift action_25+action_152 (75#) = happyShift action_26+action_152 (78#) = happyShift action_27+action_152 (79#) = happyShift action_28+action_152 (81#) = happyShift action_29+action_152 (82#) = happyShift action_30+action_152 (83#) = happyShift action_31+action_152 (5#) = happyGoto action_2+action_152 (6#) = happyGoto action_45+action_152 (7#) = happyGoto action_165+action_152 (8#) = happyGoto action_4+action_152 (15#) = happyGoto action_5+action_152 (16#) = happyGoto action_6+action_152 (17#) = happyGoto action_7+action_152 (20#) = happyGoto action_8+action_152 (23#) = happyGoto action_9+action_152 (24#) = happyGoto action_10+action_152 (25#) = happyGoto action_11+action_152 x = happyTcHack x happyFail++action_153 (75#) = happyShift action_164+action_153 x = happyTcHack x happyFail++action_154 x = happyTcHack x happyReduce_69++action_155 x = happyTcHack x happyReduce_68++action_156 (40#) = happyShift action_61+action_156 (41#) = happyShift action_62+action_156 (42#) = happyShift action_63+action_156 (43#) = happyShift action_64+action_156 (44#) = happyShift action_65+action_156 (45#) = happyShift action_66+action_156 (46#) = happyShift action_67+action_156 (47#) = happyShift action_68+action_156 (48#) = happyShift action_69+action_156 (49#) = happyShift action_70+action_156 (50#) = happyShift action_71+action_156 (51#) = happyShift action_72+action_156 (52#) = happyShift action_73+action_156 (53#) = happyShift action_74+action_156 (54#) = happyShift action_75+action_156 (55#) = happyShift action_76+action_156 (56#) = happyShift action_77+action_156 (57#) = happyShift action_78+action_156 (58#) = happyShift action_79+action_156 (66#) = happyShift action_162+action_156 (67#) = happyShift action_163+action_156 (14#) = happyGoto action_161+action_156 x = happyTcHack x happyReduce_55++action_157 (62#) = happyShift action_160+action_157 x = happyTcHack x happyReduce_49++action_158 (27#) = happyShift action_12+action_158 (28#) = happyShift action_13+action_158 (29#) = happyShift action_14+action_158 (34#) = happyShift action_15+action_158 (41#) = happyShift action_16+action_158 (42#) = happyShift action_17+action_158 (43#) = happyShift action_18+action_158 (49#) = happyShift action_19+action_158 (55#) = happyShift action_20+action_158 (59#) = happyShift action_21+action_158 (60#) = happyShift action_22+action_158 (68#) = happyShift action_23+action_158 (69#) = happyShift action_24+action_158 (73#) = happyShift action_25+action_158 (75#) = happyShift action_26+action_158 (78#) = happyShift action_27+action_158 (79#) = happyShift action_28+action_158 (81#) = happyShift action_29+action_158 (82#) = happyShift action_30+action_158 (83#) = happyShift action_31+action_158 (5#) = happyGoto action_2+action_158 (6#) = happyGoto action_159+action_158 (8#) = happyGoto action_4+action_158 (15#) = happyGoto action_5+action_158 (16#) = happyGoto action_6+action_158 (17#) = happyGoto action_7+action_158 (20#) = happyGoto action_8+action_158 (23#) = happyGoto action_9+action_158 (24#) = happyGoto action_10+action_158 (25#) = happyGoto action_11+action_158 x = happyTcHack x happyFail++action_159 (40#) = happyShift action_61+action_159 (41#) = happyShift action_62+action_159 (42#) = happyShift action_63+action_159 (43#) = happyShift action_64+action_159 (44#) = happyShift action_65+action_159 (45#) = happyShift action_66+action_159 (46#) = happyShift action_67+action_159 (47#) = happyShift action_68+action_159 (48#) = happyShift action_69+action_159 (49#) = happyShift action_70+action_159 (50#) = happyShift action_71+action_159 (51#) = happyShift action_72+action_159 (52#) = happyShift action_73+action_159 (53#) = happyShift action_74+action_159 (54#) = happyShift action_75+action_159 (55#) = happyShift action_76+action_159 (56#) = happyShift action_77+action_159 (57#) = happyShift action_78+action_159 (58#) = happyShift action_79+action_159 x = happyTcHack x happyReduce_3++action_160 (27#) = happyShift action_12+action_160 (28#) = happyShift action_13+action_160 (29#) = happyShift action_14+action_160 (34#) = happyShift action_15+action_160 (41#) = happyShift action_16+action_160 (42#) = happyShift action_17+action_160 (43#) = happyShift action_18+action_160 (49#) = happyShift action_19+action_160 (55#) = happyShift action_20+action_160 (59#) = happyShift action_21+action_160 (60#) = happyShift action_22+action_160 (68#) = happyShift action_23+action_160 (69#) = happyShift action_24+action_160 (73#) = happyShift action_25+action_160 (75#) = happyShift action_26+action_160 (78#) = happyShift action_27+action_160 (79#) = happyShift action_28+action_160 (81#) = happyShift action_29+action_160 (82#) = happyShift action_30+action_160 (83#) = happyShift action_31+action_160 (5#) = happyGoto action_2+action_160 (6#) = happyGoto action_185+action_160 (8#) = happyGoto action_4+action_160 (15#) = happyGoto action_5+action_160 (16#) = happyGoto action_6+action_160 (17#) = happyGoto action_7+action_160 (20#) = happyGoto action_8+action_160 (23#) = happyGoto action_9+action_160 (24#) = happyGoto action_10+action_160 (25#) = happyGoto action_11+action_160 x = happyTcHack x happyFail++action_161 x = happyTcHack x happyReduce_51++action_162 x = happyTcHack x happyReduce_53++action_163 x = happyTcHack x happyReduce_54++action_164 (51#) = happyShift action_184+action_164 x = happyTcHack x happyFail++action_165 (37#) = happyShift action_183+action_165 (62#) = happyShift action_121+action_165 x = happyTcHack x happyFail++action_166 x = happyTcHack x happyReduce_63++action_167 x = happyTcHack x happyReduce_59++action_168 (32#) = happyShift action_53+action_168 x = happyTcHack x happyReduce_84++action_169 (27#) = happyShift action_12+action_169 (28#) = happyShift action_13+action_169 (29#) = happyShift action_14+action_169 (34#) = happyShift action_15+action_169 (41#) = happyShift action_16+action_169 (42#) = happyShift action_17+action_169 (43#) = happyShift action_18+action_169 (49#) = happyShift action_19+action_169 (55#) = happyShift action_20+action_169 (59#) = happyShift action_21+action_169 (60#) = happyShift action_22+action_169 (68#) = happyShift action_23+action_169 (69#) = happyShift action_24+action_169 (73#) = happyShift action_25+action_169 (75#) = happyShift action_26+action_169 (78#) = happyShift action_27+action_169 (79#) = happyShift action_28+action_169 (81#) = happyShift action_29+action_169 (82#) = happyShift action_30+action_169 (83#) = happyShift action_31+action_169 (5#) = happyGoto action_2+action_169 (6#) = happyGoto action_182+action_169 (8#) = happyGoto action_4+action_169 (15#) = happyGoto action_5+action_169 (16#) = happyGoto action_6+action_169 (17#) = happyGoto action_7+action_169 (20#) = happyGoto action_8+action_169 (23#) = happyGoto action_9+action_169 (24#) = happyGoto action_10+action_169 (25#) = happyGoto action_11+action_169 x = happyTcHack x happyFail++action_170 (27#) = happyShift action_12+action_170 (28#) = happyShift action_13+action_170 (29#) = happyShift action_14+action_170 (34#) = happyShift action_15+action_170 (41#) = happyShift action_16+action_170 (42#) = happyShift action_17+action_170 (43#) = happyShift action_18+action_170 (49#) = happyShift action_19+action_170 (55#) = happyShift action_20+action_170 (59#) = happyShift action_21+action_170 (60#) = happyShift action_22+action_170 (68#) = happyShift action_23+action_170 (69#) = happyShift action_24+action_170 (73#) = happyShift action_25+action_170 (75#) = happyShift action_26+action_170 (78#) = happyShift action_27+action_170 (79#) = happyShift action_28+action_170 (81#) = happyShift action_29+action_170 (82#) = happyShift action_30+action_170 (83#) = happyShift action_31+action_170 (5#) = happyGoto action_2+action_170 (6#) = happyGoto action_181+action_170 (8#) = happyGoto action_4+action_170 (15#) = happyGoto action_5+action_170 (16#) = happyGoto action_6+action_170 (17#) = happyGoto action_7+action_170 (20#) = happyGoto action_8+action_170 (23#) = happyGoto action_9+action_170 (24#) = happyGoto action_10+action_170 (25#) = happyGoto action_11+action_170 x = happyTcHack x happyFail++action_171 (38#) = happyShift action_179+action_171 (83#) = happyShift action_180+action_171 x = happyTcHack x happyFail++action_172 (27#) = happyShift action_12+action_172 (28#) = happyShift action_13+action_172 (29#) = happyShift action_14+action_172 (34#) = happyShift action_15+action_172 (41#) = happyShift action_16+action_172 (42#) = happyShift action_17+action_172 (43#) = happyShift action_18+action_172 (49#) = happyShift action_19+action_172 (55#) = happyShift action_20+action_172 (59#) = happyShift action_21+action_172 (60#) = happyShift action_22+action_172 (68#) = happyShift action_23+action_172 (69#) = happyShift action_24+action_172 (73#) = happyShift action_25+action_172 (75#) = happyShift action_26+action_172 (78#) = happyShift action_27+action_172 (79#) = happyShift action_28+action_172 (81#) = happyShift action_29+action_172 (82#) = happyShift action_30+action_172 (83#) = happyShift action_31+action_172 (5#) = happyGoto action_2+action_172 (6#) = happyGoto action_178+action_172 (8#) = happyGoto action_4+action_172 (15#) = happyGoto action_5+action_172 (16#) = happyGoto action_6+action_172 (17#) = happyGoto action_7+action_172 (20#) = happyGoto action_8+action_172 (23#) = happyGoto action_9+action_172 (24#) = happyGoto action_10+action_172 (25#) = happyGoto action_11+action_172 x = happyTcHack x happyFail++action_173 x = happyTcHack x happyReduce_71++action_174 (79#) = happyShift action_28+action_174 (5#) = happyGoto action_177+action_174 x = happyTcHack x happyFail++action_175 (27#) = happyShift action_12+action_175 (28#) = happyShift action_13+action_175 (29#) = happyShift action_14+action_175 (34#) = happyShift action_15+action_175 (41#) = happyShift action_16+action_175 (42#) = happyShift action_17+action_175 (43#) = happyShift action_18+action_175 (49#) = happyShift action_19+action_175 (55#) = happyShift action_20+action_175 (59#) = happyShift action_21+action_175 (60#) = happyShift action_22+action_175 (68#) = happyShift action_23+action_175 (69#) = happyShift action_24+action_175 (73#) = happyShift action_25+action_175 (75#) = happyShift action_26+action_175 (78#) = happyShift action_27+action_175 (79#) = happyShift action_28+action_175 (81#) = happyShift action_29+action_175 (82#) = happyShift action_30+action_175 (83#) = happyShift action_31+action_175 (5#) = happyGoto action_2+action_175 (6#) = happyGoto action_176+action_175 (8#) = happyGoto action_4+action_175 (15#) = happyGoto action_5+action_175 (16#) = happyGoto action_6+action_175 (17#) = happyGoto action_7+action_175 (20#) = happyGoto action_8+action_175 (23#) = happyGoto action_9+action_175 (24#) = happyGoto action_10+action_175 (25#) = happyGoto action_11+action_175 x = happyTcHack x happyFail++action_176 (40#) = happyShift action_61+action_176 (41#) = happyShift action_62+action_176 (42#) = happyShift action_63+action_176 (43#) = happyShift action_64+action_176 (44#) = happyShift action_65+action_176 (45#) = happyShift action_66+action_176 (46#) = happyShift action_67+action_176 (47#) = happyShift action_68+action_176 (48#) = happyShift action_69+action_176 (49#) = happyShift action_70+action_176 (50#) = happyShift action_71+action_176 (51#) = happyShift action_72+action_176 (52#) = happyShift action_73+action_176 (53#) = happyShift action_74+action_176 (54#) = happyShift action_75+action_176 (55#) = happyShift action_76+action_176 (56#) = happyShift action_77+action_176 (57#) = happyShift action_78+action_176 (58#) = happyShift action_79+action_176 x = happyTcHack x happyReduce_46++action_177 x = happyTcHack x happyReduce_42++action_178 (39#) = happyShift action_189+action_178 (40#) = happyShift action_61+action_178 (41#) = happyShift action_62+action_178 (42#) = happyShift action_63+action_178 (43#) = happyShift action_64+action_178 (44#) = happyShift action_65+action_178 (45#) = happyShift action_66+action_178 (46#) = happyShift action_67+action_178 (47#) = happyShift action_68+action_178 (48#) = happyShift action_69+action_178 (49#) = happyShift action_70+action_178 (50#) = happyShift action_71+action_178 (51#) = happyShift action_72+action_178 (52#) = happyShift action_73+action_178 (53#) = happyShift action_74+action_178 (54#) = happyShift action_75+action_178 (55#) = happyShift action_76+action_178 (56#) = happyShift action_77+action_178 (57#) = happyShift action_78+action_178 (58#) = happyShift action_79+action_178 x = happyTcHack x happyFail++action_179 (27#) = happyShift action_12+action_179 (28#) = happyShift action_13+action_179 (29#) = happyShift action_14+action_179 (34#) = happyShift action_15+action_179 (41#) = happyShift action_16+action_179 (42#) = happyShift action_17+action_179 (43#) = happyShift action_18+action_179 (49#) = happyShift action_19+action_179 (55#) = happyShift action_20+action_179 (59#) = happyShift action_21+action_179 (60#) = happyShift action_22+action_179 (68#) = happyShift action_23+action_179 (69#) = happyShift action_24+action_179 (73#) = happyShift action_25+action_179 (75#) = happyShift action_26+action_179 (78#) = happyShift action_27+action_179 (79#) = happyShift action_28+action_179 (81#) = happyShift action_29+action_179 (82#) = happyShift action_30+action_179 (83#) = happyShift action_31+action_179 (5#) = happyGoto action_2+action_179 (6#) = happyGoto action_188+action_179 (8#) = happyGoto action_4+action_179 (15#) = happyGoto action_5+action_179 (16#) = happyGoto action_6+action_179 (17#) = happyGoto action_7+action_179 (20#) = happyGoto action_8+action_179 (23#) = happyGoto action_9+action_179 (24#) = happyGoto action_10+action_179 (25#) = happyGoto action_11+action_179 x = happyTcHack x happyFail++action_180 x = happyTcHack x happyReduce_73++action_181 (40#) = happyShift action_61+action_181 (41#) = happyShift action_62+action_181 (42#) = happyShift action_63+action_181 (43#) = happyShift action_64+action_181 (44#) = happyShift action_65+action_181 (45#) = happyShift action_66+action_181 (46#) = happyShift action_67+action_181 (47#) = happyShift action_68+action_181 (48#) = happyShift action_69+action_181 (49#) = happyShift action_70+action_181 (50#) = happyShift action_71+action_181 (51#) = happyShift action_72+action_181 (52#) = happyShift action_73+action_181 (53#) = happyShift action_74+action_181 (54#) = happyShift action_75+action_181 (55#) = happyShift action_76+action_181 (56#) = happyShift action_77+action_181 (57#) = happyShift action_78+action_181 (58#) = happyShift action_79+action_181 x = happyTcHack x happyReduce_6++action_182 (40#) = happyShift action_61+action_182 (41#) = happyShift action_62+action_182 (42#) = happyShift action_63+action_182 (43#) = happyShift action_64+action_182 (44#) = happyShift action_65+action_182 (45#) = happyShift action_66+action_182 (46#) = happyShift action_67+action_182 (47#) = happyShift action_68+action_182 (48#) = happyShift action_69+action_182 (49#) = happyShift action_70+action_182 (50#) = happyShift action_71+action_182 (51#) = happyShift action_72+action_182 (52#) = happyShift action_73+action_182 (53#) = happyShift action_74+action_182 (54#) = happyShift action_75+action_182 (55#) = happyShift action_76+action_182 (56#) = happyShift action_77+action_182 (57#) = happyShift action_78+action_182 (58#) = happyShift action_79+action_182 (76#) = happyShift action_187+action_182 x = happyTcHack x happyReduce_43++action_183 x = happyTcHack x happyReduce_67++action_184 x = happyTcHack x happyReduce_58++action_185 (40#) = happyShift action_61+action_185 (41#) = happyShift action_62+action_185 (42#) = happyShift action_63+action_185 (43#) = happyShift action_64+action_185 (44#) = happyShift action_65+action_185 (45#) = happyShift action_66+action_185 (46#) = happyShift action_67+action_185 (47#) = happyShift action_68+action_185 (48#) = happyShift action_69+action_185 (49#) = happyShift action_70+action_185 (50#) = happyShift action_71+action_185 (51#) = happyShift action_72+action_185 (52#) = happyShift action_73+action_185 (53#) = happyShift action_74+action_185 (54#) = happyShift action_75+action_185 (55#) = happyShift action_76+action_185 (56#) = happyShift action_77+action_185 (57#) = happyShift action_78+action_185 (58#) = happyShift action_79+action_185 (66#) = happyShift action_162+action_185 (67#) = happyShift action_163+action_185 (14#) = happyGoto action_186+action_185 x = happyTcHack x happyReduce_55++action_186 x = happyTcHack x happyReduce_52++action_187 (79#) = happyShift action_28+action_187 (5#) = happyGoto action_191+action_187 x = happyTcHack x happyFail++action_188 (39#) = happyShift action_190+action_188 (40#) = happyShift action_61+action_188 (41#) = happyShift action_62+action_188 (42#) = happyShift action_63+action_188 (43#) = happyShift action_64+action_188 (44#) = happyShift action_65+action_188 (45#) = happyShift action_66+action_188 (46#) = happyShift action_67+action_188 (47#) = happyShift action_68+action_188 (48#) = happyShift action_69+action_188 (49#) = happyShift action_70+action_188 (50#) = happyShift action_71+action_188 (51#) = happyShift action_72+action_188 (52#) = happyShift action_73+action_188 (53#) = happyShift action_74+action_188 (54#) = happyShift action_75+action_188 (55#) = happyShift action_76+action_188 (56#) = happyShift action_77+action_188 (57#) = happyShift action_78+action_188 (58#) = happyShift action_79+action_188 x = happyTcHack x happyFail++action_189 x = happyTcHack x happyReduce_72++action_190 x = happyTcHack x happyReduce_74++action_191 x = happyTcHack x happyReduce_44++happyReduce_1 = happySpecReduce_1  4# happyReduction_1+happyReduction_1 happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	happyIn4+		 (happy_var_1+	)}++happyReduce_2 = happySpecReduce_1  5# happyReduction_2+happyReduction_2 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Variable happy_var_1) -> +	happyIn5+		 (Avar happy_var_1+	)}++happyReduce_3 = happyReduce 5# 6# happyReduction_3+happyReduction_3 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOut11 happy_x_2 of { happy_var_2 -> +	case happyOut12 happy_x_3 of { happy_var_3 -> +	case happyOut6 happy_x_5 of { happy_var_5 -> +	happyIn6+		 ((snd happy_var_3) (happy_var_1 (happy_var_2 ((fst happy_var_3) happy_var_5)))+	) `HappyStk` happyRest}}}}++happyReduce_4 = happyReduce 4# 6# happyReduction_4+happyReduction_4 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut6 happy_x_4 of { happy_var_4 -> +	happyIn6+		 (call "some" [happy_var_2 happy_var_4]+	) `HappyStk` happyRest}}++happyReduce_5 = happyReduce 4# 6# happyReduction_5+happyReduction_5 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut6 happy_x_4 of { happy_var_4 -> +	happyIn6+		 (call "not" [call "some" [happy_var_2 (call "not" [happy_var_4])]]+	) `HappyStk` happyRest}}++happyReduce_6 = happyReduce 6# 6# happyReduction_6+happyReduction_6 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut6 happy_x_2 of { happy_var_2 -> +	case happyOut6 happy_x_4 of { happy_var_4 -> +	case happyOut6 happy_x_6 of { happy_var_6 -> +	happyIn6+		 (call "if" [happy_var_2,happy_var_4,happy_var_6]+	) `HappyStk` happyRest}}}++happyReduce_7 = happySpecReduce_1  6# happyReduction_7+happyReduction_7 happy_x_1+	 =  case happyOut20 happy_x_1 of { happy_var_1 -> +	happyIn6+		 (happy_var_1+	)}++happyReduce_8 = happySpecReduce_1  6# happyReduction_8+happyReduction_8 happy_x_1+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> +	happyIn6+		 (happy_var_1+	)}++happyReduce_9 = happySpecReduce_1  6# happyReduction_9+happyReduction_9 happy_x_1+	 =  case happyOut15 happy_x_1 of { happy_var_1 -> +	happyIn6+		 (happy_var_1+	)}++happyReduce_10 = happySpecReduce_3  6# happyReduction_10+happyReduction_10 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "to" [happy_var_1,happy_var_3]+	)}}++happyReduce_11 = happySpecReduce_3  6# happyReduction_11+happyReduction_11 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "+" [happy_var_1,happy_var_3]+	)}}++happyReduce_12 = happySpecReduce_3  6# happyReduction_12+happyReduction_12 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "-" [happy_var_1,happy_var_3]+	)}}++happyReduce_13 = happySpecReduce_3  6# happyReduction_13+happyReduction_13 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "*" [happy_var_1,happy_var_3]+	)}}++happyReduce_14 = happySpecReduce_3  6# happyReduction_14+happyReduction_14 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "div" [happy_var_1,happy_var_3]+	)}}++happyReduce_15 = happySpecReduce_3  6# happyReduction_15+happyReduction_15 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "idiv" [happy_var_1,happy_var_3]+	)}}++happyReduce_16 = happySpecReduce_3  6# happyReduction_16+happyReduction_16 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "mod" [happy_var_1,happy_var_3]+	)}}++happyReduce_17 = happySpecReduce_3  6# happyReduction_17+happyReduction_17 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "=" [happy_var_1,happy_var_3]+	)}}++happyReduce_18 = happySpecReduce_3  6# happyReduction_18+happyReduction_18 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "!=" [happy_var_1,happy_var_3]+	)}}++happyReduce_19 = happySpecReduce_3  6# happyReduction_19+happyReduction_19 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "<" [happy_var_1,happy_var_3]+	)}}++happyReduce_20 = happySpecReduce_3  6# happyReduction_20+happyReduction_20 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "<=" [happy_var_1,happy_var_3]+	)}}++happyReduce_21 = happySpecReduce_3  6# happyReduction_21+happyReduction_21 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call ">" [happy_var_1,happy_var_3]+	)}}++happyReduce_22 = happySpecReduce_3  6# happyReduction_22+happyReduction_22 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call ">=" [happy_var_1,happy_var_3]+	)}}++happyReduce_23 = happySpecReduce_3  6# happyReduction_23+happyReduction_23 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "and" [happy_var_1,happy_var_3]+	)}}++happyReduce_24 = happySpecReduce_3  6# happyReduction_24+happyReduction_24 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "or" [happy_var_1,happy_var_3]+	)}}++happyReduce_25 = happySpecReduce_3  6# happyReduction_25+happyReduction_25 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "not" [happy_var_1,happy_var_3]+	)}}++happyReduce_26 = happySpecReduce_3  6# happyReduction_26+happyReduction_26 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "union" [happy_var_1,happy_var_3]+	)}}++happyReduce_27 = happySpecReduce_3  6# happyReduction_27+happyReduction_27 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "itersect" [happy_var_1,happy_var_3]+	)}}++happyReduce_28 = happySpecReduce_3  6# happyReduction_28+happyReduction_28 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn6+		 (call "except" [happy_var_1,happy_var_3]+	)}}++happyReduce_29 = happySpecReduce_2  6# happyReduction_29+happyReduction_29 happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_2 of { happy_var_2 -> +	happyIn6+		 (call "uplus" [happy_var_2]+	)}++happyReduce_30 = happySpecReduce_2  6# happyReduction_30+happyReduction_30 happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_2 of { happy_var_2 -> +	happyIn6+		 (call "uminus" [happy_var_2]+	)}++happyReduce_31 = happySpecReduce_2  6# happyReduction_31+happyReduction_31 happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_2 of { happy_var_2 -> +	happyIn6+		 (call "not" [happy_var_2]+	)}++happyReduce_32 = happySpecReduce_1  6# happyReduction_32+happyReduction_32 happy_x_1+	 =  case happyOutTok happy_x_1 of { (TString happy_var_1) -> +	happyIn6+		 (Astring happy_var_1+	)}++happyReduce_33 = happySpecReduce_1  6# happyReduction_33+happyReduction_33 happy_x_1+	 =  case happyOutTok happy_x_1 of { (TInteger happy_var_1) -> +	happyIn6+		 (Aint happy_var_1+	)}++happyReduce_34 = happySpecReduce_1  6# happyReduction_34+happyReduction_34 happy_x_1+	 =  case happyOutTok happy_x_1 of { (TFloat happy_var_1) -> +	happyIn6+		 (Afloat happy_var_1+	)}++happyReduce_35 = happySpecReduce_1  7# happyReduction_35+happyReduction_35 happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	happyIn7+		 ([happy_var_1]+	)}++happyReduce_36 = happySpecReduce_3  7# happyReduction_36+happyReduction_36 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn7+		 (happy_var_1++[happy_var_3]+	)}}++happyReduce_37 = happySpecReduce_2  8# happyReduction_37+happyReduction_37 happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	happyIn8+		 (happy_var_2+	)}++happyReduce_38 = happySpecReduce_2  8# happyReduction_38+happyReduction_38 happy_x_2+	happy_x_1+	 =  case happyOut10 happy_x_2 of { happy_var_2 -> +	happyIn8+		 (happy_var_2+	)}++happyReduce_39 = happySpecReduce_3  8# happyReduction_39+happyReduction_39 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_3 of { happy_var_3 -> +	happyIn8+		 (happy_var_1 . happy_var_3+	)}}++happyReduce_40 = happySpecReduce_3  8# happyReduction_40+happyReduction_40 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOut10 happy_x_3 of { happy_var_3 -> +	happyIn8+		 (happy_var_1 . happy_var_3+	)}}++happyReduce_41 = happySpecReduce_3  9# happyReduction_41+happyReduction_41 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut5 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn9+		 (\x -> Ast "for" [happy_var_1,Avar "$",happy_var_3,x]+	)}}++happyReduce_42 = happyReduce 5# 9# happyReduction_42+happyReduction_42 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut5 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	case happyOut5 happy_x_5 of { happy_var_5 -> +	happyIn9+		 (\x -> Ast "for" [happy_var_1,happy_var_5,happy_var_3,x]+	) `HappyStk` happyRest}}}++happyReduce_43 = happyReduce 5# 9# happyReduction_43+happyReduction_43 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut9 happy_x_1 of { happy_var_1 -> +	case happyOut5 happy_x_3 of { happy_var_3 -> +	case happyOut6 happy_x_5 of { happy_var_5 -> +	happyIn9+		 (\x -> happy_var_1(Ast "for" [happy_var_3,Avar "$",happy_var_5,x])+	) `HappyStk` happyRest}}}++happyReduce_44 = happyReduce 7# 9# happyReduction_44+happyReduction_44 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut9 happy_x_1 of { happy_var_1 -> +	case happyOut5 happy_x_3 of { happy_var_3 -> +	case happyOut6 happy_x_5 of { happy_var_5 -> +	case happyOut5 happy_x_7 of { happy_var_7 -> +	happyIn9+		 (\x -> happy_var_1(Ast "for" [happy_var_3,happy_var_7,happy_var_5,x])+	) `HappyStk` happyRest}}}}++happyReduce_45 = happySpecReduce_3  10# happyReduction_45+happyReduction_45 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut5 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn10+		 (\x -> Ast "let" [happy_var_1,happy_var_3,x]+	)}}++happyReduce_46 = happyReduce 5# 10# happyReduction_46+happyReduction_46 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut10 happy_x_1 of { happy_var_1 -> +	case happyOut5 happy_x_3 of { happy_var_3 -> +	case happyOut6 happy_x_5 of { happy_var_5 -> +	happyIn10+		 (\x -> happy_var_1(Ast "let" [happy_var_3,happy_var_5,x])+	) `HappyStk` happyRest}}}++happyReduce_47 = happySpecReduce_2  11# happyReduction_47+happyReduction_47 happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_2 of { happy_var_2 -> +	happyIn11+		 (\x -> Ast "predicate" [happy_var_2,x]+	)}++happyReduce_48 = happySpecReduce_0  11# happyReduction_48+happyReduction_48  =  happyIn11+		 (id+	)++happyReduce_49 = happySpecReduce_2  12# happyReduction_49+happyReduction_49 happy_x_2+	happy_x_1+	 =  case happyOut13 happy_x_2 of { happy_var_2 -> +	happyIn12+		 ((\x -> Ast "sortTuple" (x:(fst happy_var_2)),+                                                           \x -> Ast "sort" (x:(snd happy_var_2)))+	)}++happyReduce_50 = happySpecReduce_0  12# happyReduction_50+happyReduction_50  =  happyIn12+		 ((id,id)+	)++happyReduce_51 = happySpecReduce_2  13# happyReduction_51+happyReduction_51 happy_x_2+	happy_x_1+	 =  case happyOut6 happy_x_1 of { happy_var_1 -> +	case happyOut14 happy_x_2 of { happy_var_2 -> +	happyIn13+		 (([happy_var_1],[happy_var_2])+	)}}++happyReduce_52 = happyReduce 4# 13# happyReduction_52+happyReduction_52 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut13 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	case happyOut14 happy_x_4 of { happy_var_4 -> +	happyIn13+		 (((fst happy_var_1)++[happy_var_3],(snd happy_var_1)++[happy_var_4])+	) `HappyStk` happyRest}}}++happyReduce_53 = happySpecReduce_1  14# happyReduction_53+happyReduction_53 happy_x_1+	 =  happyIn14+		 (Avar "ascending"+	)++happyReduce_54 = happySpecReduce_1  14# happyReduction_54+happyReduction_54 happy_x_1+	 =  happyIn14+		 (Avar "descending"+	)++happyReduce_55 = happySpecReduce_0  14# happyReduction_55+happyReduction_55  =  happyIn14+		 (Avar "ascending"+	)++happyReduce_56 = happyReduce 4# 15# happyReduction_56+happyReduction_56 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_3 of { (QName happy_var_3) -> +	happyIn15+		 (call "element" [Avar happy_var_3]+	) `HappyStk` happyRest}++happyReduce_57 = happyReduce 4# 15# happyReduction_57+happyReduction_57 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_3 of { (QName happy_var_3) -> +	happyIn15+		 (call "attribute" [Avar happy_var_3]+	) `HappyStk` happyRest}++happyReduce_58 = happyReduce 6# 16# happyReduction_58+happyReduction_58 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOut18 happy_x_3 of { happy_var_3 -> +	case happyOutTok happy_x_5 of { (QName happy_var_5) -> +	happyIn16+		 (if head happy_var_1 == Astring happy_var_5+						  	     then Ast "construction" (happy_var_1++[concatAll happy_var_3])+                                                          else error("Unmatched tags in element construction: "++happy_var_5)+	) `HappyStk` happyRest}}}++happyReduce_59 = happyReduce 5# 16# happyReduction_59+happyReduction_59 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_4 of { (QName happy_var_4) -> +	happyIn16+		 (if head happy_var_1 == Astring happy_var_4+							     then Ast "construction" (happy_var_1++[call "empty" []])+                                                          else error("Unmatched tags in element construction: "++happy_var_4)+	) `HappyStk` happyRest}}++happyReduce_60 = happySpecReduce_2  16# happyReduction_60+happyReduction_60 happy_x_2+	happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	happyIn16+		 (Ast "construction" (happy_var_1++[call "empty" []])+	)}++happyReduce_61 = happySpecReduce_2  17# happyReduction_61+happyReduction_61 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_2 of { (QName happy_var_2) -> +	happyIn17+		 ([Astring happy_var_2,Ast "attributes" []]+	)}++happyReduce_62 = happySpecReduce_3  17# happyReduction_62+happyReduction_62 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_2 of { (QName happy_var_2) -> +	case happyOut19 happy_x_3 of { happy_var_3 -> +	happyIn17+		 ([Astring happy_var_2,Ast "attributes" happy_var_3]+	)}}++happyReduce_63 = happySpecReduce_3  18# happyReduction_63+happyReduction_63 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut7 happy_x_2 of { happy_var_2 -> +	happyIn18+		 (happy_var_2+	)}++happyReduce_64 = happySpecReduce_1  18# happyReduction_64+happyReduction_64 happy_x_1+	 =  case happyOutTok happy_x_1 of { (TString happy_var_1) -> +	happyIn18+		 ([Astring happy_var_1]+	)}++happyReduce_65 = happySpecReduce_1  18# happyReduction_65+happyReduction_65 happy_x_1+	 =  case happyOutTok happy_x_1 of { (XMLtext happy_var_1) -> +	happyIn18+		 ([Astring happy_var_1]+	)}++happyReduce_66 = happySpecReduce_1  18# happyReduction_66+happyReduction_66 happy_x_1+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> +	happyIn18+		 ([happy_var_1]+	)}++happyReduce_67 = happyReduce 4# 18# happyReduction_67+happyReduction_67 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut18 happy_x_1 of { happy_var_1 -> +	case happyOut7 happy_x_3 of { happy_var_3 -> +	happyIn18+		 (happy_var_1++happy_var_3+	) `HappyStk` happyRest}}++happyReduce_68 = happySpecReduce_2  18# happyReduction_68+happyReduction_68 happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (TString happy_var_2) -> +	happyIn18+		 (happy_var_1++[Astring happy_var_2]+	)}}++happyReduce_69 = happySpecReduce_2  18# happyReduction_69+happyReduction_69 happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (XMLtext happy_var_2) -> +	happyIn18+		 (happy_var_1++[Astring happy_var_2]+	)}}++happyReduce_70 = happySpecReduce_2  18# happyReduction_70+happyReduction_70 happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> +	case happyOut16 happy_x_2 of { happy_var_2 -> +	happyIn18+		 (happy_var_1++[happy_var_2]+	)}}++happyReduce_71 = happySpecReduce_3  19# happyReduction_71+happyReduction_71 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (QName happy_var_1) -> +	case happyOutTok happy_x_3 of { (TString happy_var_3) -> +	happyIn19+		 ([Ast "pair" [Astring happy_var_1,Astring happy_var_3]]+	)}}++happyReduce_72 = happyReduce 5# 19# happyReduction_72+happyReduction_72 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (QName happy_var_1) -> +	case happyOut6 happy_x_4 of { happy_var_4 -> +	happyIn19+		 ([Ast "pair" [Astring happy_var_1,happy_var_4]]+	) `HappyStk` happyRest}}++happyReduce_73 = happyReduce 4# 19# happyReduction_73+happyReduction_73 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut19 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (QName happy_var_2) -> +	case happyOutTok happy_x_4 of { (TString happy_var_4) -> +	happyIn19+		 ((Ast "pair" [Astring happy_var_2,Astring happy_var_4]):happy_var_1+	) `HappyStk` happyRest}}}++happyReduce_74 = happyReduce 6# 19# happyReduction_74+happyReduction_74 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut19 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (QName happy_var_2) -> +	case happyOut6 happy_x_5 of { happy_var_5 -> +	happyIn19+		 ((Ast "pair" [Astring happy_var_2,happy_var_5]):happy_var_1+	) `HappyStk` happyRest}}}++happyReduce_75 = happySpecReduce_1  20# happyReduction_75+happyReduction_75 happy_x_1+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> +	happyIn20+		 (happy_var_1 "child" (Avar ".")+	)}++happyReduce_76 = happySpecReduce_2  20# happyReduction_76+happyReduction_76 happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_2 of { happy_var_2 -> +	happyIn20+		 (happy_var_2 "attribute" (Avar ".")+	)}++happyReduce_77 = happySpecReduce_2  20# happyReduction_77+happyReduction_77 happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> +	case happyOut21 happy_x_2 of { happy_var_2 -> +	happyIn20+		 (happy_var_2(happy_var_1 "child" (Avar "."))+	)}}++happyReduce_78 = happySpecReduce_3  20# happyReduction_78+happyReduction_78 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_2 of { happy_var_2 -> +	case happyOut21 happy_x_3 of { happy_var_3 -> +	happyIn20+		 (happy_var_3(happy_var_2 "attribute" (Avar "."))+	)}}++happyReduce_79 = happySpecReduce_1  21# happyReduction_79+happyReduction_79 happy_x_1+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> +	happyIn21+		 (happy_var_1+	)}++happyReduce_80 = happySpecReduce_2  21# happyReduction_80+happyReduction_80 happy_x_2+	happy_x_1+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> +	case happyOut22 happy_x_2 of { happy_var_2 -> +	happyIn21+		 (happy_var_2 . happy_var_1+	)}}++happyReduce_81 = happySpecReduce_2  22# happyReduction_81+happyReduction_81 happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_2 of { happy_var_2 -> +	happyIn22+		 (\e -> happy_var_2 "child" e+	)}++happyReduce_82 = happySpecReduce_3  22# happyReduction_82+happyReduction_82 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_3 of { happy_var_3 -> +	happyIn22+		 (\e -> happy_var_3 "attribute" e+	)}++happyReduce_83 = happySpecReduce_3  22# happyReduction_83+happyReduction_83 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut23 happy_x_3 of { happy_var_3 -> +	happyIn22+		 (\e -> happy_var_3 "descendant" e+	)}++happyReduce_84 = happyReduce 4# 22# happyReduction_84+happyReduction_84 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut23 happy_x_4 of { happy_var_4 -> +	happyIn22+		 (\e -> happy_var_4 "descendant_attribute" e+	) `HappyStk` happyRest}++happyReduce_85 = happySpecReduce_2  22# happyReduction_85+happyReduction_85 happy_x_2+	happy_x_1+	 =  happyIn22+		 (\e -> call "parent" [e]+	)++happyReduce_86 = happySpecReduce_1  23# happyReduction_86+happyReduction_86 happy_x_1+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> +	happyIn23+		 (happy_var_1+	)}++happyReduce_87 = happyReduce 4# 23# happyReduction_87+happyReduction_87 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut23 happy_x_1 of { happy_var_1 -> +	case happyOut6 happy_x_3 of { happy_var_3 -> +	happyIn23+		 (\t e -> Ast "predicate" [happy_var_3,happy_var_1 t e]+	) `HappyStk` happyRest}}++happyReduce_88 = happySpecReduce_1  24# happyReduction_88+happyReduction_88 happy_x_1+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> +	happyIn24+		 (\t e -> happy_var_1 t e+	)}++happyReduce_89 = happySpecReduce_1  24# happyReduction_89+happyReduction_89 happy_x_1+	 =  happyIn24+		 (\t e -> call t [Astring "*",e]+	)++happyReduce_90 = happySpecReduce_1  24# happyReduction_90+happyReduction_90 happy_x_1+	 =  case happyOutTok happy_x_1 of { (QName happy_var_1) -> +	happyIn24+		 (\t e -> call t [Astring happy_var_1,e]+	)}++happyReduce_91 = happySpecReduce_1  25# happyReduction_91+happyReduction_91 happy_x_1+	 =  case happyOut5 happy_x_1 of { happy_var_1 -> +	happyIn25+		 (\_ _ -> happy_var_1+	)}++happyReduce_92 = happySpecReduce_1  25# happyReduction_92+happyReduction_92 happy_x_1+	 =  happyIn25+		 (\_ e -> e+	)++happyReduce_93 = happySpecReduce_3  25# happyReduction_93+happyReduction_93 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut7 happy_x_2 of { happy_var_2 -> +	happyIn25+		 (\_ _ -> concatAll happy_var_2+	)}++happyReduce_94 = happySpecReduce_2  25# happyReduction_94+happyReduction_94 happy_x_2+	happy_x_1+	 =  happyIn25+		 (\_ _ -> call "empty" []+	)++happyReduce_95 = happyReduce 4# 25# happyReduction_95+happyReduction_95 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (QName happy_var_1) -> +	case happyOut7 happy_x_3 of { happy_var_3 -> +	happyIn25+		 (\_ _ -> call happy_var_1 happy_var_3+	) `HappyStk` happyRest}}++happyReduce_96 = happySpecReduce_3  25# happyReduction_96+happyReduction_96 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (QName happy_var_1) -> +	happyIn25+		 (if elem happy_var_1 ["text"]+                                                             then \_ e -> call happy_var_1 [e]+                                                          else \_ _ -> call happy_var_1 []+	)}++happyNewToken action sts stk [] =+	action 84# 84# notHappyAtAll (HappyState action) sts stk []++happyNewToken action sts stk (tk:tks) =+	let cont i = action i i tk (HappyState action) sts stk tks in+	case tk of {+	RETURN -> cont 26#;+	SOME -> cont 27#;+	EVERY -> cont 28#;+	IF -> cont 29#;+	THEN -> cont 30#;+	ELSE -> cont 31#;+	LB -> cont 32#;+	RB -> cont 33#;+	LP -> cont 34#;+	RP -> cont 35#;+	LSB -> cont 36#;+	RSB -> cont 37#;+	LESCAPE -> cont 38#;+	RESCAPE -> cont 39#;+	TO -> cont 40#;+	PLUS -> cont 41#;+	MINUS -> cont 42#;+	TIMES -> cont 43#;+	DIV -> cont 44#;+	IDIV -> cont 45#;+	MOD -> cont 46#;+	TEQ -> cont 47#;+	TNEQ -> cont 48#;+	TLT -> cont 49#;+	LEQ -> cont 50#;+	TGT -> cont 51#;+	GEQ -> cont 52#;+	AND -> cont 53#;+	OR -> cont 54#;+	NOT -> cont 55#;+	UNION -> cont 56#;+	INTERSECT -> cont 57#;+	EXCEPT -> cont 58#;+	FOR -> cont 59#;+	LET -> cont 60#;+	IN -> cont 61#;+	COMMA -> cont 62#;+	ASSIGN -> cont 63#;+	WHERE -> cont 64#;+	ORDERBY -> cont 65#;+	ASCENDING -> cont 66#;+	DESCENDING -> cont 67#;+	ELEMENT -> cont 68#;+	ATTRIBUTE -> cont 69#;+	STAG -> cont 70#;+	ETAG -> cont 71#;+	SATISFIES -> cont 72#;+	ATSIGN -> cont 73#;+	SLASH -> cont 74#;+	QName happy_dollar_dollar -> cont 75#;+	AT -> cont 76#;+	DOTS -> cont 77#;+	DOT -> cont 78#;+	Variable happy_dollar_dollar -> cont 79#;+	XMLtext happy_dollar_dollar -> cont 80#;+	TInteger happy_dollar_dollar -> cont 81#;+	TFloat happy_dollar_dollar -> cont 82#;+	TString happy_dollar_dollar -> cont 83#;+	_ -> happyError' (tk:tks)+	}++happyError_ tk tks = happyError' (tk:tks)++newtype HappyIdentity a = HappyIdentity a+happyIdentity = HappyIdentity+happyRunIdentity (HappyIdentity a) = a++instance Monad HappyIdentity where+    return = HappyIdentity+    (HappyIdentity p) >>= q = q p++happyThen :: () => HappyIdentity a -> (a -> HappyIdentity b) -> HappyIdentity b+happyThen = (>>=)+happyReturn :: () => a -> HappyIdentity a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> HappyIdentity a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [Token] -> HappyIdentity a+happyError' = HappyIdentity . parseError++parse tks = happyRunIdentity happySomeParser where+  happySomeParser = happyThen (happyParse action_0 tks) (\x -> happyReturn (happyOut4 x))++happySeq = happyDontSeq+++-- Abstract Syntax Tree for XQueries+data Ast = Ast String [Ast]+         | Avar String+         | Aint Int+         | Afloat Float+         | Astring String+         deriving Eq+++instance Show Ast+  where show (Ast s []) = s ++ "()"+        show (Ast s (x:xs)) = s ++ "(" ++ (show x)+                              ++ (foldr (\a r -> ","++(show a)++r) "" xs)+                              ++ ")"+        show (Avar s) = s+        show (Aint n) = show n+        show (Afloat n) = show n+        show (Astring s) = "\'" ++ s ++ "\'"+++call :: String -> [Ast] -> Ast+call name args = Ast "call" ((Avar name):args)+++concatAll :: [Ast] -> Ast+concatAll (x:xs) = foldl (\a r -> call "concat" [a,r]) x xs+concatAll _ = call "empty" []+++parseError tk = error ("Parse error: "++(show (take 10 tk)))+++data Token+  = RETURN | SOME | EVERY | IF | THEN | ELSE | LB | RB | LP | RP | LSB | RSB+  | LESCAPE | RESCAPE | TO | PLUS | MINUS | TIMES | DIV | IDIV | MOD+  | TEQ | TNEQ | TLT | LEQ | TGT | GEQ | AND | OR | NOT | UNION | INTERSECT+  | EXCEPT | FOR | LET | IN | COMMA | ASSIGN | WHERE | ORDERBY | ASCENDING+  | DESCENDING | ELEMENT | ATTRIBUTE | STAG | ETAG | SATISFIES | ATSIGN+  | SLASH | DEFINE | FUNCTION | AT | DOT | DOTS | TokenEOF+  | QName String | Variable String | XMLtext String | TInteger Int+  | TFloat Float | TString String+  deriving Show+++scan :: String -> [Token]+scan cs = lexer cs [0]+++xmlText "" = []+xmlText text = [XMLtext text]++-- scans XML PCDATA and returns an XMLtext token with the PCData text+xml :: String -> String -> [Int] -> [Token]+xml ('{':cs) text n = (xmlText text)++(LSB : lexer cs (0:n))+xml ('<':'/':cs) text n = (xmlText text)++(STAG : lexer cs n)+xml ('<':cs) text (k:n) = (xmlText text)++(TLT : lexer cs (k+2:n))+xml ('\'':'{':cs) text n = (xmlText text)++(LESCAPE : lexer cs n)+xml (c:cs) text n = xml cs (text++[c]) n+xml [] text _ = xmlText text+++isQN c = elem c "_:-" || isDigit c || isAlpha c++isVar c = elem c "_" || isDigit c || isAlpha c++-- the XQuery scanner+lexer :: String -> [Int] -> [Token]+lexer [] [0] = []+lexer [] _ = error("Unbalanced tags")+lexer (' ':'>':' ':cs) n = TGT : lexer cs n+lexer (c:cs) n+      | isSpace c = lexer cs n+      | isAlpha c = lexVar (c:cs) n+      | isDigit c = lexNum (c:cs) n+lexer ('$':cs) n = let (var,rest) = span isVar cs+                   in (Variable var) : lexer rest n+lexer ('\'':'{':cs) n = LESCAPE : lexer cs n+lexer (':':'=':cs) n = ASSIGN : lexer cs n+lexer ('<':'/':cs) n = STAG : lexer cs n+lexer ('<':'=':cs) n = LEQ : lexer cs n+lexer ('>':'=':cs) n = GEQ : lexer cs n+lexer ('/':'>':cs) (k:n) = ETAG : lexer cs (k-2:n)+lexer ('.':'.':cs) n = DOTS : lexer cs n+lexer ('.':cs) n = DOT : lexer cs n+lexer ('}':'\'':cs) n = RESCAPE : lexer cs n+lexer ('!':'=':cs) n = TNEQ : lexer cs n+lexer ('\'':cs) n = lexString cs n+lexer ('[':cs) n = LB : lexer cs n+lexer (']':cs) n = RB : lexer cs n+lexer ('(':cs) n = LP : lexer cs n+lexer (')':cs) n = RP : lexer cs n+lexer ('}':cs) (_:n) = RSB : xml cs "" n+lexer ('+':cs) n = PLUS : lexer cs n+lexer ('-':cs) n = MINUS : lexer cs n+lexer ('*':cs) n = TIMES : lexer cs n+lexer ('=':cs) n = TEQ : lexer cs n+lexer ('<':c:cs) n | not(isAlpha c) = TLT : lexer (c:cs) n+lexer ('<':cs) (k:n) = TLT : lexer cs (k+2:n)+lexer ('>':cs) (k:n) = TGT : (if k==1 then lexer cs (k-1:n) else xml cs "" (k-1:n))+lexer (',':cs) n = COMMA : lexer cs n+lexer ('@':cs) n = ATSIGN : lexer cs n+lexer ('/':cs) n = SLASH : lexer cs n+lexer ('{':cs) n = LSB : lexer cs n+lexer (c:cs) n = error ("illegal character "++[c])++lexNum cs n = if null rest || head rest /= '.'+                 then TInteger (read k) : lexer rest n+              else let (m,rest2) = span isDigit (tail rest)+                   in TFloat (read (k++('.':m))) : lexer rest2 n+      where (k,rest) = span isDigit cs++lexString cs n = TString s : lexer (tail rest) n+    where (s,rest) = span inString cs+          inString c = c /= '\''++lexVar cs n =+   case span isQN cs of+      ("return",rest) -> RETURN : lexer rest n+      ("some",rest) -> SOME : lexer rest n+      ("every",rest) -> EVERY : lexer rest n+      ("if",rest) -> IF : lexer rest n+      ("then",rest) -> THEN : lexer rest n+      ("else",rest) -> ELSE : lexer rest n+      ("to",rest) -> TO : lexer rest n+      ("div",rest) -> DIV : lexer rest n+      ("idiv",rest) -> IDIV : lexer rest n+      ("mod",rest) -> MOD : lexer rest n+      ("and",rest) -> AND : lexer rest n+      ("or",rest) -> OR : lexer rest n+      ("not",rest) -> NOT : lexer rest n+      ("union",rest) -> UNION : lexer rest n+      ("intersect",rest) -> INTERSECT : lexer rest n+      ("except",rest) -> EXCEPT : lexer rest n+      ("for",rest) -> FOR : lexer rest n+      ("let",rest) -> LET : lexer rest n+      ("in",rest) -> IN : lexer rest n+      ("where",rest) -> WHERE : lexer rest n+      ("orderby",rest) -> ORDERBY : lexer rest n+      ("ascending",rest) -> ASCENDING : lexer rest n+      ("descending",rest) -> DESCENDING : lexer rest n+      ("element",rest) -> ELEMENT : lexer rest n+      ("attribute",rest) -> ATTRIBUTE : lexer rest n+      ("satisfies",rest) -> SATISFIES : lexer rest n+      ("define",rest) -> DEFINE : lexer rest n+      ("function",rest) -> FUNCTION : lexer rest n+      ("at",rest) -> AT : lexer rest n+      (var,rest) -> QName var : lexer rest n+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++{-# LINE 28 "templates/GenericTemplate.hs" #-}+++++++++{-# LINE 49 "templates/GenericTemplate.hs" #-}++{-# LINE 59 "templates/GenericTemplate.hs" #-}++{-# LINE 68 "templates/GenericTemplate.hs" #-}++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 1#, it means we've just accepted a partial+-- parse (a %partial parser).  We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 1# tk st sts (_ `HappyStk` ans `HappyStk` _) =+	happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = +	(happyTcHack j ) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++{-# LINE 155 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++++newtype HappyState b c = HappyState+        (Int# ->                    -- token number+         Int# ->                    -- token number (yes, again)+         b ->                           -- token semantic value+         HappyState b c ->              -- current state+         [HappyState b c] ->            -- state stack+         c)++++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 1# tk st sts stk@(x `HappyStk` _) =+     let i = (case unsafeCoerce# x of { (I# (i)) -> i }) in+--     trace "shifting the error token" $+     new_state i i tk (HappyState (new_state)) ((st):(sts)) (stk)++happyShift new_state i tk st sts stk =+     happyNewToken new_state ((st):(sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happySpecReduce_0 nt fn j tk st@((HappyState (action))) sts stk+     = action nt j tk st ((st):(sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@(((st@(HappyState (action))):(_))) (v1`HappyStk`stk')+     = let r = fn v1 in+       happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happySpecReduce_2 nt fn j tk _ ((_):(sts@(((st@(HappyState (action))):(_))))) (v1`HappyStk`v2`HappyStk`stk')+     = let r = fn v1 v2 in+       happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happySpecReduce_3 nt fn j tk _ ((_):(((_):(sts@(((st@(HappyState (action))):(_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+     = let r = fn v1 v2 v3 in+       happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happyReduce k nt fn j tk st sts stk+     = case happyDrop (k -# (1# :: Int#)) sts of+	 sts1@(((st1@(HappyState (action))):(_))) ->+        	let r = fn stk in  -- it doesn't hurt to always seq here...+       		happyDoSeq r (action nt j tk st1 sts1 r)++happyMonadReduce k nt fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+        happyThen1 (fn stk tk) (\r -> action nt j tk st1 sts1 (r `HappyStk` drop_stk))+       where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))+             drop_stk = happyDropStk k stk++happyMonad2Reduce k nt fn 1# tk st sts stk+     = happyFail 1# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))+       where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))+             drop_stk = happyDropStk k stk++++++             new_state = action+++happyDrop 0# l = l+happyDrop n ((_):(t)) = happyDrop (n -# (1# :: Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n -# (1#::Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction++{-# LINE 253 "templates/GenericTemplate.hs" #-}+happyGoto action j tk st = action j j tk (HappyState action)+++-----------------------------------------------------------------------------+-- Error recovery (1# is the error token)++-- parse error if we are in recovery and we fail again+happyFail  1# tk old_st _ stk =+--	trace "failing" $ +    	happyError_ tk++{-  We don't need state discarding for our restricted implementation of+    "error".  In fact, it can cause some bogus parses, so I've disabled it+    for now --SDM++-- discard a state+happyFail  1# tk old_st (((HappyState (action))):(sts)) +						(saved_tok `HappyStk` _ `HappyStk` stk) =+--	trace ("discarding state, depth " ++ show (length stk))  $+	action 1# 1# tk (HappyState (action)) sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+--                       save the old token and carry on.+happyFail  i tk (HappyState (action)) sts stk =+--      trace "entering error recovery" $+	action 1# 1# tk (HappyState (action)) sts ( (unsafeCoerce# (I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing.  If the --strict flag is given, then Happy emits +--	happySeq = happyDoSeq+-- otherwise it emits+-- 	happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq   a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template.  GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.++{-# LINE 317 "templates/GenericTemplate.hs" #-}+{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.
+ XQueryParser.y view
@@ -0,0 +1,383 @@+{-------------------------------------------------------------------------------------+-+- An XQuery parser+- Programmer: Leonidas Fegaras+- Email: fegaras@cse.uta.edu+- Web: http://lambda.uta.edu/+- Creation: 02/15/08, last update: 03/18/08+- +- Copyright (c) 2008 by Leonidas Fegaras, the University of Texas at Arlington. All rights reserved.+- This material is provided as is, with absolutely no warranty expressed or implied.+- Any use is at your own risk. Permission is hereby granted to use or copy this program+- for any purpose, provided the above notices are retained on all copies.+-+--------------------------------------------------------------------------------------}++{+module XQueryParser where+import Char+}++%name parse+%tokentype { Token }+%error { parseError }++%token+	'return'	{ RETURN }+	'some'		{ SOME }+	'every'		{ EVERY }+	'if' 		{ IF }+	'then' 		{ THEN }+	'else' 		{ ELSE }+	'[' 		{ LB }+	']' 		{ RB }+	'(' 		{ LP }+	')' 		{ RP }+	'{' 		{ LSB }+	'}' 		{ RSB }+	'\'{' 		{ LESCAPE }+	'}\'' 		{ RESCAPE }+	'to' 		{ TO }+	'+' 		{ PLUS }+	'-' 		{ MINUS }+	'*' 		{ TIMES }+	'div' 		{ DIV }+	'idiv' 		{ IDIV }+	'mod' 		{ MOD }+	'=' 		{ TEQ }+	'!=' 		{ TNEQ }+	'<' 		{ TLT }+	'<=' 		{ LEQ }+	'>' 		{ TGT }+	'>=' 		{ GEQ }+	'and' 		{ AND }+	'or' 		{ OR }+	'not' 		{ NOT }+	'union' 	{ UNION }+	'intersect' 	{ INTERSECT }+	'except' 	{ EXCEPT }+	'for' 		{ FOR }+	'let' 		{ LET }+	'in' 		{ IN }+	',' 		{ COMMA }+	':=' 		{ ASSIGN }+	'where' 	{ WHERE }+	'orderby' 	{ ORDERBY }+	'ascending' 	{ ASCENDING }+	'descending' 	{ DESCENDING }+	'element' 	{ ELEMENT }+	'attribute' 	{ ATTRIBUTE }+	'</' 		{ STAG }+	'/>' 		{ ETAG }+	'satisfies' 	{ SATISFIES }+	'@' 		{ ATSIGN }+	'/' 		{ SLASH }+	'QName' 	{ QName $$ }+	'at' 		{ AT }+	'..' 		{ DOTS }+	'.' 		{ DOT }+	'Variable' 	{ Variable $$ }+	'XMLtext' 	{ XMLtext $$ }+	'Integer' 	{ TInteger $$ }+	'Double' 	{ TFloat $$ }+	'String' 	{ TString $$ }+++%nonassoc	'for' 'let' 'satisfies' 'return'+%nonassoc	'else'+%left		'intersect' 'union' 'except'+%right		'or'+%right		'and'+%nonassoc	'not'+%left		'=' '<' '>' '<=' '>=' '!='+%left		'+' '-'+%left		'*' 'div' 'idiv' 'mod'+%left		'to'+%nonassoc	UMINUS+++%%++prog		:   expr				{ $1 }++var		: 'Variable'   				{ Avar $1 }++expr		:   clauses opt_where opt_order+                         'return' expr			{ (snd $3) ($1 ($2 ((fst $3) $5))) }+		|   'some' for_bindings+                         'satisfies' expr		{ call "some" [$2 $4] }+		|   'every' for_bindings +                         'satisfies' expr		{ call "not" [call "some" [$2 (call "not" [$4])]] }+		|   'if' expr 'then' expr 'else' expr	{ call "if" [$2,$4,$6] }+		|   full_path				{ $1 }+		|   element				{ $1 }+		|   computed				{ $1 }+		|   expr 'to' expr			{ call "to" [$1,$3] }+		|   expr '+' expr			{ call "+" [$1,$3] }+		|   expr '-' expr			{ call "-" [$1,$3] }+		|   expr '*' expr			{ call "*" [$1,$3] }+		|   expr 'div' expr			{ call "div" [$1,$3] }+		|   expr 'idiv' expr			{ call "idiv" [$1,$3] }+		|   expr 'mod' expr			{ call "mod" [$1,$3] }+		|   expr '=' expr			{ call "=" [$1,$3] }+		|   expr '!=' expr			{ call "!=" [$1,$3] }+		|   expr '<' expr			{ call "<" [$1,$3] }+		|   expr '<=' expr			{ call "<=" [$1,$3] }+		|   expr '>' expr			{ call ">" [$1,$3] }+		|   expr '>=' expr			{ call ">=" [$1,$3] }+		|   expr 'and' expr			{ call "and" [$1,$3] }+		|   expr 'or' expr			{ call "or" [$1,$3] }+		|   expr 'not' expr			{ call "not" [$1,$3] }+		|   expr 'union' expr			{ call "union" [$1,$3] }+		|   expr 'intersect' expr		{ call "itersect" [$1,$3] }+		|   expr 'except' expr			{ call "except" [$1,$3] }+		|   '+' expr       %prec UMINUS		{ call "uplus" [$2] }+		|   '-' expr       %prec UMINUS		{ call "uminus" [$2] }+		|   'not' expr     %prec UMINUS		{ call "not" [$2] }+		|   'String'				{ Astring $1 }+		|   'Integer'				{ Aint $1 }+		|   'Double'				{ Afloat $1 }++expl		:   expr				{ [$1] }+		|   expl ',' expr 			{ $1++[$3] }++clauses		:   'for' for_bindings			{ $2 }+		|   'let' let_bindings			{ $2 }+		|   clauses 'for' for_bindings		{ $1 . $3 }+		|   clauses 'let' let_bindings		{ $1 . $3 }++for_bindings	:   var 'in' expr			{ \x -> Ast "for" [$1,Avar "$",$3,x] }+		|   var 'in' expr 'at' var		{ \x -> Ast "for" [$1,$5,$3,x] }+		|   for_bindings ',' var 'in' expr	{ \x -> $1(Ast "for" [$3,Avar "$",$5,x]) }+		|   for_bindings ',' var 'in' expr+                       'at' var				{ \x -> $1(Ast "for" [$3,$7,$5,x]) }++let_bindings	:   var ':=' expr			{ \x -> Ast "let" [$1,$3,x] }+		|   let_bindings ','+			var ':=' expr			{ \x -> $1(Ast "let" [$3,$5,x]) }++opt_where 	:   'where' expr			{ \x -> Ast "predicate" [$2,x] }+		|   {- empty -}				{ id }++opt_order	:   'orderby' order_list		{ (\x -> Ast "sortTuple" (x:(fst $2)),+                                                           \x -> Ast "sort" (x:(snd $2))) }+		|   {- empty -}				{ (id,id) }++order_list	:   expr mode				{ ([$1],[$2]) }+		|   order_list ',' expr mode		{ ((fst $1)++[$3],(snd $1)++[$4]) }++mode		:   'ascending'				{ Avar "ascending" }+		|   'descending'			{ Avar "descending" }+		|   {- empty -}				{ Avar "ascending" }++computed	:   'element' '(' 'QName' ')'		{ call "element" [Avar $3] }+		|   'attribute' '(' 'QName' ')'		{ call "attribute" [Avar $3] }++element		:   stag '>' content '</' 'QName' '>'	{ if head $1 == Astring $5+						  	     then Ast "construction" ($1++[concatAll $3])+                                                          else error("Unmatched tags in element construction: "++$5) }+                |   stag '>' '</' 'QName' '>'		{ if head $1 == Astring $4+							     then Ast "construction" ($1++[call "empty" []])+                                                          else error("Unmatched tags in element construction: "++$4) }+                |   stag '/>'     			{ Ast "construction" ($1++[call "empty" []]) }++stag		:   '<' 'QName'				{ [Astring $2,Ast "attributes" []] }+                |   '<' 'QName' attributes		{ [Astring $2,Ast "attributes" $3] }++content		:   '{' expl '}'			{ $2 }+		|   'String'				{ [Astring $1] }+		|   'XMLtext'				{ [Astring $1] }+		|   element				{ [$1] }+		|   content '{' expl '}'		{ $1++$3 }+                |   content 'String'		        { $1++[Astring $2] }+		|   content 'XMLtext'			{ $1++[Astring $2] }+		|   content element			{ $1++[$2] }++attributes	:   'QName' '=' 'String'		{ [Ast "pair" [Astring $1,Astring $3]] }+		|   'QName' '=' '\'{' expr '}\''	{ [Ast "pair" [Astring $1,$4]] }+		|   attributes 'QName' '=' 'String'	{ (Ast "pair" [Astring $2,Astring $4]):$1 }+		|   attributes 'QName' '='+                         '\'{' expr '}\''		{ (Ast "pair" [Astring $2,$5]):$1 }++full_path	:   predicate_step			{ $1 "child" (Avar ".") }+		|   '@' predicate_step			{ $2 "attribute" (Avar ".") }+		|   predicate_step path			{ $2($1 "child" (Avar ".")) }+		|   '@' predicate_step path		{ $3($2 "attribute" (Avar ".")) }++path		:   step				{ $1 }+		|   path step				{ $2 . $1 }++step		:   '/' predicate_step			{ \e -> $2 "child" e }+		|   '/' '@' predicate_step		{ \e -> $3 "attribute" e }+		|   '/' '/' predicate_step		{ \e -> $3 "descendant" e }+		|   '/' '/' '@' predicate_step		{ \e -> $4 "descendant_attribute" e }+                |   '/' '..'		                { \e -> call "parent" [e] }++predicate_step	:   simple_step				{ $1 }+		|   predicate_step '[' expr ']'		{ \t e -> Ast "predicate" [$3,$1 t e] }++simple_step	:   primary_expr			{ \t e -> $1 t e }+		|   '*'					{ \t e -> call t [Astring "*",e] }+		|   'QName'				{ \t e -> call t [Astring $1,e] }++primary_expr	:   var					{ \_ _ -> $1 }+                |   '.'                                 { \_ e -> e }+                |   '(' expl ')'			{ \_ _ -> concatAll $2 }+		|   '(' ')'				{ \_ _ -> call "empty" [] }+		|   'QName' '(' expl ')'		{ \_ _ -> call $1 $3 }+		|   'QName' '(' ')'			{ if elem $1 ["text"]+                                                             then \_ e -> call $1 [e]+                                                          else \_ _ -> call $1 [] }+++{+++-- Abstract Syntax Tree for XQueries+data Ast = Ast String [Ast]+         | Avar String+         | Aint Int+         | Afloat Float+         | Astring String+         deriving Eq+++instance Show Ast+  where show (Ast s []) = s ++ "()"+        show (Ast s (x:xs)) = s ++ "(" ++ (show x)+                              ++ (foldr (\a r -> ","++(show a)++r) "" xs)+                              ++ ")"+        show (Avar s) = s+        show (Aint n) = show n+        show (Afloat n) = show n+        show (Astring s) = "\'" ++ s ++ "\'"+++call :: String -> [Ast] -> Ast+call name args = Ast "call" ((Avar name):args)+++concatAll :: [Ast] -> Ast+concatAll (x:xs) = foldl (\a r -> call "concat" [a,r]) x xs+concatAll _ = call "empty" []+++parseError tk = error ("Parse error: "++(show (take 10 tk)))+++data Token+  = RETURN | SOME | EVERY | IF | THEN | ELSE | LB | RB | LP | RP | LSB | RSB+  | LESCAPE | RESCAPE | TO | PLUS | MINUS | TIMES | DIV | IDIV | MOD+  | TEQ | TNEQ | TLT | LEQ | TGT | GEQ | AND | OR | NOT | UNION | INTERSECT+  | EXCEPT | FOR | LET | IN | COMMA | ASSIGN | WHERE | ORDERBY | ASCENDING+  | DESCENDING | ELEMENT | ATTRIBUTE | STAG | ETAG | SATISFIES | ATSIGN+  | SLASH | DEFINE | FUNCTION | AT | DOT | DOTS | TokenEOF+  | QName String | Variable String | XMLtext String | TInteger Int+  | TFloat Float | TString String+  deriving Show+++scan :: String -> [Token]+scan cs = lexer cs [0]+++xmlText "" = []+xmlText text = [XMLtext text]++-- scans XML PCDATA and returns an XMLtext token with the PCData text+xml :: String -> String -> [Int] -> [Token]+xml ('{':cs) text n = (xmlText text)++(LSB : lexer cs (0:n))+xml ('<':'/':cs) text n = (xmlText text)++(STAG : lexer cs n)+xml ('<':cs) text (k:n) = (xmlText text)++(TLT : lexer cs (k+2:n))+xml ('\'':'{':cs) text n = (xmlText text)++(LESCAPE : lexer cs n)+xml (c:cs) text n = xml cs (text++[c]) n+xml [] text _ = xmlText text+++isQN c = elem c "_:-" || isDigit c || isAlpha c++isVar c = elem c "_" || isDigit c || isAlpha c++-- the XQuery scanner+lexer :: String -> [Int] -> [Token]+lexer [] [0] = []+lexer [] _ = error("Unbalanced tags")+lexer (' ':'>':' ':cs) n = TGT : lexer cs n+lexer (c:cs) n+      | isSpace c = lexer cs n+      | isAlpha c = lexVar (c:cs) n+      | isDigit c = lexNum (c:cs) n+lexer ('$':cs) n = let (var,rest) = span isVar cs+                   in (Variable var) : lexer rest n+lexer ('\'':'{':cs) n = LESCAPE : lexer cs n+lexer (':':'=':cs) n = ASSIGN : lexer cs n+lexer ('<':'/':cs) n = STAG : lexer cs n+lexer ('<':'=':cs) n = LEQ : lexer cs n+lexer ('>':'=':cs) n = GEQ : lexer cs n+lexer ('/':'>':cs) (k:n) = ETAG : lexer cs (k-2:n)+lexer ('.':'.':cs) n = DOTS : lexer cs n+lexer ('.':cs) n = DOT : lexer cs n+lexer ('}':'\'':cs) n = RESCAPE : lexer cs n+lexer ('!':'=':cs) n = TNEQ : lexer cs n+lexer ('\'':cs) n = lexString cs n+lexer ('[':cs) n = LB : lexer cs n+lexer (']':cs) n = RB : lexer cs n+lexer ('(':cs) n = LP : lexer cs n+lexer (')':cs) n = RP : lexer cs n+lexer ('}':cs) (_:n) = RSB : xml cs "" n+lexer ('+':cs) n = PLUS : lexer cs n+lexer ('-':cs) n = MINUS : lexer cs n+lexer ('*':cs) n = TIMES : lexer cs n+lexer ('=':cs) n = TEQ : lexer cs n+lexer ('<':c:cs) n | not(isAlpha c) = TLT : lexer (c:cs) n+lexer ('<':cs) (k:n) = TLT : lexer cs (k+2:n)+lexer ('>':cs) (k:n) = TGT : (if k==1 then lexer cs (k-1:n) else xml cs "" (k-1:n))+lexer (',':cs) n = COMMA : lexer cs n+lexer ('@':cs) n = ATSIGN : lexer cs n+lexer ('/':cs) n = SLASH : lexer cs n+lexer ('{':cs) n = LSB : lexer cs n+lexer (c:cs) n = error ("illegal character "++[c])++lexNum cs n = if null rest || head rest /= '.'+                 then TInteger (read k) : lexer rest n+              else let (m,rest2) = span isDigit (tail rest)+                   in TFloat (read (k++('.':m))) : lexer rest2 n+      where (k,rest) = span isDigit cs++lexString cs n = TString s : lexer (tail rest) n+    where (s,rest) = span inString cs+          inString c = c /= '\''++lexVar cs n =+   case span isQN cs of+      ("return",rest) -> RETURN : lexer rest n+      ("some",rest) -> SOME : lexer rest n+      ("every",rest) -> EVERY : lexer rest n+      ("if",rest) -> IF : lexer rest n+      ("then",rest) -> THEN : lexer rest n+      ("else",rest) -> ELSE : lexer rest n+      ("to",rest) -> TO : lexer rest n+      ("div",rest) -> DIV : lexer rest n+      ("idiv",rest) -> IDIV : lexer rest n+      ("mod",rest) -> MOD : lexer rest n+      ("and",rest) -> AND : lexer rest n+      ("or",rest) -> OR : lexer rest n+      ("not",rest) -> NOT : lexer rest n+      ("union",rest) -> UNION : lexer rest n+      ("intersect",rest) -> INTERSECT : lexer rest n+      ("except",rest) -> EXCEPT : lexer rest n+      ("for",rest) -> FOR : lexer rest n+      ("let",rest) -> LET : lexer rest n+      ("in",rest) -> IN : lexer rest n+      ("where",rest) -> WHERE : lexer rest n+      ("orderby",rest) -> ORDERBY : lexer rest n+      ("ascending",rest) -> ASCENDING : lexer rest n+      ("descending",rest) -> DESCENDING : lexer rest n+      ("element",rest) -> ELEMENT : lexer rest n+      ("attribute",rest) -> ATTRIBUTE : lexer rest n+      ("satisfies",rest) -> SATISFIES : lexer rest n+      ("define",rest) -> DEFINE : lexer rest n+      ("function",rest) -> FUNCTION : lexer rest n+      ("at",rest) -> AT : lexer rest n+      (var,rest) -> QName var : lexer rest n+}
+ data/cs.xml view
@@ -0,0 +1,618 @@+<?xml version="1.0"?>+<!-- Revision: test xml data file  -->++<department>+  <deptname>Computer Sciences</deptname>++  <gradstudent>+    <name>+      <lastname>Aboulnaga</lastname>+      <firstname>Ashraf</firstname>+    </name>+    <phone>2626623</phone>+    <email>ashraf@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7360</office>+    <url>www.cs.wisc.edu/~ashraf</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Ailamaki</lastname>+      <firstname>Anastasia</firstname>+    </name>+    <phone>2652311</phone>+    <email>natassa@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>7351</office>+    <url>www.cs.wisc.edu/~natassa</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Almeida</lastname>+      <firstname>Jussara</firstname>+    </name>+    <phone>2622542</phone>+    <email>jussara@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>7358</office>+    <gpa>3.5</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Basney</lastname>+      <firstname>Jim</firstname>+    </name>+    <phone>2625368</phone>+    <email>jbasney@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>3395</office>+    <url>www.cs.wisc.edu/~jbasney</url>+    <gpa>4.0</gpa>+  </gradstudent>+ +  <gradstudent>+    <name>+      <lastname>Polyzotis</lastname>+      <firstname>Neoklis</firstname>+    </name>+    <phone>2652311</phone>+    <email>alkis@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7351</office>+    <url>www.cs.wisc.edu/~alkis</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Galanis</lastname>+      <firstname>Leonidas</firstname>+    </name>+    <phone>2625596</phone>+    <email>lgalanis@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1343</office>+    <url>www.cs.wisc.edu/~lgalanis</url>+    <gpa>3.5</gpa>+  </gradstudent>+  +  <gradstudent>+    <name>+      <lastname>Reddy</lastname>+      <firstname>Sridhar</firstname>+    </name>+    <phone>2625596</phone>+    <email>sridhar@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7360</office>+    <url>www.cs.wisc.edu/~sridhar</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Beyer</lastname>+      <firstname>Kevin</firstname>+    </name>+    <phone>2626629</phone>+    <email>beyer@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7390</office>+    <url>www.cs.wisc.edu/~beyer</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Butts</lastname>+      <firstname>Adam</firstname>+    </name>+    <phone>2626618</phone>+    <email>butts@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>6382</office>+    <url>www.cs.wisc.edu/~butts</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Bezenek</lastname>+      <firstname>Todd</firstname>+    </name>+    <phone>2656605</phone>+    <email>bezenek@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>1331</office>+    <url>www.cs.wisc.edu/~bezenek</url>+    <gpa>4.0</gpa>+  </gradstudent>+  <gradstudent>++    <name>+      <lastname>Chan</lastname>+      <firstname>Chee-Yong</firstname>+    </name>+    <phone>2626629</phone>+    <email>cychan@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>7394</office>+    <gpa>3.5</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Chang</lastname>+      <firstname>Richard</firstname>+    </name>+    <phone>2626612</phone>+    <email>pdc@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>5384</office>+    <url>www.cs.wisc.edu/~pdc</url>+    <gpa>3.5</gpa>+  </gradstudent>+ +  <gradstudent>+    <name>+      <lastname>Deych</lastname>+      <firstname>Gregory</firstname>+    </name>+    <phone>2652455</phone>+    <email>gdeych@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7351</office>+    <url>www.cs.wisc.edu/~gdeych</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Dreyfuss</lastname>+      <firstname>Mark</firstname>+    </name>+    <phone>2625596</phone>+    <email>md@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1343</office>+    <url>www.cs.wisc.edu/~md</url>+    <gpa>3.5</gpa>+  </gradstudent>+  +  <gradstudent>+    <name>+      <lastname>Yang</lastname>+      <firstname>Fan</firstname>+    </name>+    <phone>2625596</phone>+    <email>fyang@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1343</office>+    <url>www.cs.wisc.edu/~fyang</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Donjerkovic</lastname>+      <firstname>Donko</firstname>+    </name>+    <phone>26245542</phone>+    <email>donko@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7366</office>+    <url>www.cs.wisc.edu/~donko</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Finley</lastname>+      <firstname>Paul</firstname>+    </name>+    <phone>2622455</phone>+    <email>finley@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>1309</office>+    <gpa>3.5</gpa>+  </gradstudent>++  <gradstudent>+    <gpa>3.5</gpa>+    <name>+      <lastname>Finton</lastname>+      <firstname>David</firstname>+    </name>+    <phone>2626612</phone>+    <email>finton@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53706</zip>       +    </address>+    <office>5384</office>+    <url>www.cs.wisc.edu/~finton</url>+  </gradstudent>+ +  <gradstudent>+    <name>+      <lastname>Fung</lastname>+      <firstname>Glenn</firstname>+    </name>+    <phone>2652455</phone>+    <email>gfung@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>7351</office>+    <url>www.cs.wisc.edu/~gfung</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Gast</lastname>+      <firstname>James</firstname>+    </name>+    <phone>2625596</phone>+    <email>jgast@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1552</office>+    <url>www.cs.wisc.edu/~jgast</url>+    <gpa>3.5</gpa>+  </gradstudent>+  +  <gradstudent>+    <name>+      <lastname>Glew</lastname>+      <firstname>Andrew</firstname>+    </name>+    <phone>2625596</phone>+    <email>glew@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1343</office>+    <url>www.cs.wisc.edu/~glew</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <gradstudent>+    <name>+      <lastname>Gupta</lastname>+      <firstname>Anurag</firstname>+    </name>+    <phone>2621243</phone>+    <email>anurag@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <office>1346</office>+    <url>www.cs.wisc.edu/~anurag</url>+    <gpa>4.0</gpa>+  </gradstudent>++  <staff>+    <name>+      <lastname>Weber</lastname>+      <firstname>Lorene</firstname>+    </name>+    <phone>2627967</phone>+    <email>lorene@cs.wisc.edu</email>+    <office>5373</office>+  </staff>+  +  <staff>+    <name>+      <lastname>Cuccia</lastname>+      <firstname>Laura</firstname>+    </name>+    <phone>2622454</phone>+    <email>laura@cs.wisc.edu</email>+    <office>5333</office>+  </staff>++  <staff>+    <name>+      <lastname>Diewald</lastname>+      <firstname>Debra</firstname>+    </name>+    <phone>2622454</phone>+    <email>debra@cs.wisc.edu</email>+    <office>5333</office>+  </staff>++  <staff>+    <name>+      <lastname>Johnson</lastname>+      <firstname>Marie</firstname>+    </name>+    <phone>2627433</phone>+    <email>marie@cs.wisc.edu</email>+    <office>5356</office>+  </staff>+  +  <staff>+    <name>+      <lastname>Nelson</lastname>+      <firstname>Anne</firstname>+    </name>+    <phone>2622324</phone>+    <email>nelsona@cs.wisc.edu</email>+    <office>7366</office>+  </staff>++  <staff>+    <name>+      <lastname>Werner</lastname>+      <firstname>Virginia</firstname>+    </name>+    <phone>2622454</phone>+    <email>laura@cs.wisc.edu</email>+    <office>5333</office>+  </staff>+++  <faculty>+    <name>+      <lastname>Bach</lastname>+      <firstname>Eric</firstname>+    </name>+    <phone>2627997</phone>+    <email>bach@cs.wisc.edu</email>+    <office>7385</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Reps</lastname>+      <firstname>Thomas</firstname>+    </name>+    <phone>2627497</phone>+    <email>reps@cs.wisc.edu</email>+    <office>5389</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Naugthon</lastname>+      <firstname>Jeff</firstname>+    </name>+    <phone>2627997</phone>+    <email>naughton@cs.wisc.edu</email>+    <office>7371</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Dewitt</lastname>+      <firstname>David</firstname>+    </name>+    <phone>2635489</phone>+    <email>dewitt@cs.wisc.edu</email>+    <office>7363</office>+  </faculty>+  +  <faculty>+    <name>+      <lastname>Dyer</lastname>+      <firstname>Charles</firstname>+    </name>+    <phone>2627997</phone>+    <email>dyer@cs.wisc.edu</email>+    <office>7377</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Ioannidis</lastname>+      <firstname>Yannis</firstname>+    </name>+    <phone>2627497</phone>+    <email>yannis@cs.wisc.edu</email>+    <office>7373</office>+  </faculty> ++  <faculty>+    <name>+      <lastname>Ramakrishnan</lastname>+      <firstname>Raghu</firstname>+    </name>+    <phone>2627397</phone>+    <email>raghu@cs.wisc.edu</email>+    <office>7355</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Solomon</lastname>+      <firstname>Marvin</firstname>+    </name>+    <phone>2627497</phone>+    <email>solomon@cs.wisc.edu</email>+    <office>7379</office>+  </faculty> ++  +  <faculty>+    <name>+      <lastname>Hill</lastname>+      <firstname>Mark</firstname>+    </name>+    <phone>2627397</phone>+    <email>hill@cs.wisc.edu</email>+    <office>7355</office>+  </faculty>++  <faculty>+    <name>+      <lastname>Wood</lastname>+      <firstname>David</firstname>+    </name>+    <phone>2627497</phone>+    <email>wood@cs.wisc.edu</email>+    <office>7379</office>+  </faculty> +++  <undergradstudent>+    <name>+      <lastname>King</lastname>+      <firstname>James</firstname>+    </name>+    <phone>2626623</phone>+    <email>jking@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <gpa>3.0</gpa>+  </undergradstudent>++  <undergradstudent>+    <name>+      <lastname>Wagner</lastname>+      <firstname>James</firstname>+    </name>+    <phone>2626634</phone>+    <email>wagner@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <gpa>3.5</gpa>+  </undergradstudent>+  +  <undergradstudent>+    <name>+      <lastname>Bloy</lastname>+      <firstname>Michael</firstname>+    </name>+    <phone>2626433</phone>+    <email>bloy@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <gpa>3.6</gpa>+  </undergradstudent>++  <undergradstudent>+    <name>+      <lastname>Cahil</lastname>+      <firstname>Michael</firstname>+    </name>+    <phone>2623323</phone>+    <email>cahil@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <gpa>4.0</gpa>+  </undergradstudent>++  <undergradstudent>+    <name>+      <lastname>Galanis</lastname>+      <firstname>Mitsos</firstname>+    </name>+    <phone>2626623</phone>+    <email>mitsos@cs.wisc.edu</email>+    <address>+      <city>Madison</city>+      <state>WI</state>+      <zip>53705</zip>       +    </address>+    <gpa>4.0</gpa>+  </undergradstudent>++++</department>
+ hxml-0.2/00-LICENSE.txt view
@@ -0,0 +1,22 @@+LICENSE ("MIT-style")++Copyright (C) 2000, 2001, Joe English++Permission is hereby granted to use, copy, modify, distribute,+and license this software and its documentation for any purpose, provided+that existing copyright notices are retained in all copies and that this+notice is included in any distributions. No written agreement,+license, or royalty fee is required for any of the authorized uses.+Modifications to this software may be copyrighted by their authors+and need not follow the licensing terms described here, provided that+the new terms are clearly indicated on the first page of each file where+they apply.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT+SHALL THE AUTHORS OF THIS SOFTWARE BE LIABLE TO ANY PARTY FOR+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES+ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION.++
+ hxml-0.2/00-README.txt view
@@ -0,0 +1,57 @@++$Id: 00-README.txt,v 1.3 2003/08/01 19:59:00 joe Exp $++5 Mar 2002++Announcing HXML version 0.2, a non-validating XML parser written in Haskell.++HXML is available at:++    <URL: http://www.flightlab.com/~joe/hxml >++The current version is 0.2, and is pre-beta quality.++HXML has been tested with GHC 6.0, GHC 5.02, NHC 1.10, and +various versions of Hugs 98.++Please contact Joe English <jenglish@flightlab.com> with+any questions, comments, or bug reports.++* * * KNOWN BUGS++    + The XML declaration is ignored.+    + Unicode support is only as good as that provided+      by the Haskell system (i.e., typically not very).+    + Does not do any well-formedness or validity checks.+    + Under Hugs 98 only, suffers a serious space fault.+    + Does not support XML Namespaces.++* * * USAGE++Documentation in XML format is available in the 'doc' subdirectory,+along with a Haskell program which converts it into HTML.+Run 'make html' in that directory to build the HTML docs+with Hugs.  doc/mkSite.hs also serves as an example of how+to use the library.++* * * INSTALLATION++Installation instructions depend on the Haskell system.+For Hugs, put the sources somewhere in the Hugs search path.+For NHC, just use 'hmake'.++For GHC, copy Makefile.dist to Makefile, edit as desired, and run+	make library+	make profiled-library		;# optional+Next, edit the file "hxml.conf.in" and replace @INSTDIR@+with the installation directory (i.e., wherever you extracted+the distribution).  Finally, run+    ghc-pkg --add hxml.conf.in+If all goes well, you may then use 'ghc -package hxml' to access+the library.++At some point, I'll add proper 'configure ; make ; make install' support.+Recommended procedures for doing this are still (Aug 2003) being hashed out+on various mailing lists.++* * * END.
+ hxml-0.2/Arrow.hs view
@@ -0,0 +1,194 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.Arrow+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: Arrow.hs,v 1.8 2002/10/12 01:58:56 joe Exp $+--+----------------------------------------------------------------------------+--+-- [30 Jan 1999]+-- Arrow combinator library; inspired by John Hughes'+-- "Generalizing Monads to Arrows"++module Arrow where++import Monad++infixr 5 ++++infixr 3 >&<, &&&+infixr 2 >|<, |||, ?>, >?>, :>+infixl 1 >>>++class Arrow a where+	arr	:: (b -> c) -> a b c+	(>>>)	:: a b c -> a c d -> a b d+	apfst	:: a b c -> a (b,x) (c,x)+	apsnd	:: a b c -> a (x,b) (x,c)+	(>&<)	:: a b c -> a d e -> a (b,d) (c,e)+	(&&&)	:: a b c -> a b d -> a b (c,d)+	liftA2	:: (b -> c -> d) -> a e b -> a e c -> a e d+	aConst	:: c -> a b c+	idArrow	:: a b b+	-- Minimal implementation: arr, >>>,  apfst or >&<++	apsnd f 	= arr swap >>> apfst f >>> arr swap+			  where swap (x,y) = (y,x)+	f >&< g 	= apfst f >>> apsnd g+			-- OR: (arr fst >>> f) &&& (arr snd >>> g)+	f &&& g 	= arr twin >>> (f >&< g)+			  where twin a = (a,a)+	apfst f 	= f >&< arr id+	liftA2 op f g 	= (f &&& g) >>> arr (uncurry op)+	aConst c	= arr (const c)+	idArrow		= arr id+	-- swap 	:: (a,b) -> (b,a)+	-- twin 	:: a -> (a,a)+	-- uncurry 	:: (a -> b -> c) -> (a,b) -> c++data Choice a = a :> a+class (Arrow a) => ArrowChoice a where+	apl	:: a b c -> a (Either b d) (Either c d)+	apr	:: a b c -> a (Either d b) (Either d c)+	(>|<)	:: a b c -> a d e -> a (Either b d) (Either c e)+	(|||)	:: a b c -> a d c -> a (Either b d) c+	( ?>)	:: (b -> Bool) -> Choice (a b c) -> a b c+	(>?>)	:: a b Bool    -> Choice (a b c) -> a b c++	-- Minimal implementation: >|< or apl++	apl f 		= f >|< idArrow+	apr f   	= arr mirror >>> apl f >>> arr mirror+	                  where mirror = either Right Left+	f >|< g 	= apl f >>> apr g+	f ||| g 	= (f >|< g) >>> arr (either id id)++	p >?> (f :> g)	= liftA2 lrtag p idArrow >>> (f ||| g)+			  where  lrtag c = if c then Left else Right+	p  ?> choice	= arr p >?> choice+	-- mirror	:: Either a b -> Either b a+	-- lrtag	:: Bool -> b -> Either b b+++class (Arrow a) => ArrowApply a where+	app :: a (a b c,b) c++class (Arrow a) => ArrowZero a where+	aZero  :: a b c+	aMaybe :: a (Maybe c) c+	aGuard :: (b -> Bool) -> a b b++	aGuard p = arr (\x -> if p x then Just x else Nothing) >>> aMaybe++{- Alternate interfaces:+    aMaybe :: (b -> Maybe c) -> a b c+    aMaybe :: a b (Maybe c)  -> a b c+    aGuard :: a b Bool    -> a b b+-}++class (Arrow a) => ArrowPlus a where+	(+++) :: a b c -> a b c -> a b c++{- ************************************************************ -}++{- NOTE: comment this out if NHC98 1.10 gives you problems -}++instance Arrow (->) where+	arr		= id+	f >>> g 	= \x -> g (f x)	-- (>>>) = flip (.)+	apfst f	(x,y)	= (f x, y)+	apsnd g (x,y)	= (x, g y)+	f >&< g		= \(x,y) -> (f x, g y)+	f &&& g   	= \x -> (f x, g x)+	liftA2 op f g x	= op (f x) (g x)+	aConst  	= const++instance ArrowChoice (->) where+	f ||| g     	= either f g+	f >|< g     	= either (Left . f) (Right . g)+	apl f		= either (Left . f)  Right+	apr f     	= either  Left      (Right . f)+	p ?> (f :> g)	= \x -> if p x then f x else g x++instance ArrowApply (->) where+	app (f,x) 	= f x++{- END -}++{- ************************************************************ -}++-- Reader arrow++newtype R a b c = R (a -> b -> c)+instance Arrow (R a) where+    arr 		= R . const		-- arr f = R (\a b -> f b)+    R f >>> R g 	= R (\a -> g a . f a)	-- R (\a b -> g a (f a b))+    apfst (R f) 	= R (\a (x,y) -> (f a x,y))+    apsnd (R f) 	= R (\a (x,y) -> (x,f a y))+    R f >&< R g 	= R (\a (x,y) -> (f a x,g a y))+    R f &&& R g 	= R (\a x     -> (f a x,g a x))+    liftA2 o (R f) (R g)= R (\a x -> o (f a x) (g a x))+    aConst c		= R (\_a _b -> c)++instance ArrowChoice (R a) where+    R f >|< R g		= R (\a -> either (Left . f a) (Right . g a))+    R f ||| R g		= R (\a -> either (f a) (g a))++readR :: (a -> c) -> R a b c+readR f = R (\a _b -> f a)++runR  :: R a b c -> a -> b ->c+runR (R f) = f++{- ************************************************************ -}++-- Monadic arrows (called "Kleisli" arrows in Hughes)++newtype MA m a b = MA (a -> m b)++runMA :: (Monad m) => (MA m a b) -> a -> m b+runMA (MA f) = f++reflectMA :: (Monad m) => (a -> m b) -> MA m a b+reflectMA = MA++aJoin :: (Monad m) => MA m (m a) a+aJoin = reflectMA id++instance (Monad m, Functor m) => Arrow (MA m) where+    arr f 		= MA (return . f)+    MA f >>> MA g	= MA (\b -> f b >>= g)+    MA f >&< MA g	= MA (\(b,d) -> f b >>= \c-> g d >>= \e-> return (c,e))+    MA f &&& MA g	= MA (\b     -> f b >>= \c-> g b >>= \e-> return (c,e))+    apfst (MA f)	= MA (\(b,d) -> f b >>= \c-> return (c,d))+    apsnd (MA g)	= MA (\(b,d) -> g d >>= \e-> return (b,e))+    aConst c		= MA (\_b    -> return c)+    idArrow		= MA return+    liftA2 op (MA f) (MA g)+    			= MA (\x -> f x >>= \l -> fmap (\r -> op l r) (g x))++instance (Monad m, Functor m) => ArrowChoice (MA m) where+    MA f ||| MA g	= MA (either f g)+    MA f >|< MA g	= MA (either (fmap Left . f) (fmap Right . g))+    p ?> (MA f :> MA g) = MA (\x -> if p x then f x else g x)+    apl (MA f) 		= MA (either (fmap Left . f) (return . Right))+    apr (MA g)		= MA (either (return . Left) (fmap Right . g))++instance (Monad m, Functor m) => ArrowApply (MA m) where+    app = MA (\(MA f,x) -> f x)++instance (MonadPlus m, Functor m) => ArrowZero (MA m) where+    aZero   		= MA (const mzero)+    aMaybe  		= MA (maybe mzero return)+    aGuard p 		= MA (\x -> if p x then return x else mzero)++instance (MonadPlus m, Functor m) => ArrowPlus (MA m) where+    MA f +++ MA g	= MA (\x -> mplus (f x) (g x))++{- ************************************************************ -}+
+ hxml-0.2/AssocList.hs view
@@ -0,0 +1,56 @@+----------------------------------------------------------------------------+--+-- Module	: AssocList.hs+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: provisional+-- Portability	: portable+--+-- CVS  	: $Id: AssocList.hs,v 1.5 2002/10/12 01:58:56 joe Exp $+--+----------------------------------------------------------------------------+--+-- Quick hack; need a stub FiniteMap implementation+--++module AssocList +    ( FM, unsafeLookup, lookupM, lookupWithDefault, empty+    , insert , insertWith+    ) where++import Prelude -- hiding (null,map,foldr,foldl,foldr1,foldl1,filter)++type FM k a = [(k,a)]++lookupM :: (Eq k) => FM k a -> k -> Maybe a+lookupM = flip Prelude.lookup++lookupWithDefault :: (Eq key) => FM key elt -> elt -> key -> elt+lookupWithDefault m d = maybe d id . lookupM m++unsafeLookup :: (Eq a) => FM a b -> a -> b+unsafeLookup m = maybe (error "Error: Not found") id . lookupM m++insertWith :: (Eq k) => (a -> a -> a) -> k -> a -> FM k a -> FM k a+insertWith _ key elt [] = [(key,elt)]+insertWith c key elt ((k,e):l)+	| k == key	= (k,c e elt):l+	| otherwise	= (k,e):insertWith c key elt l++insert :: (Eq k) => k -> a -> FM k a -> FM k a+insert = insertWith (\_old new -> new)++{-+-- GHC 'data' library convention:+addToFM_C :: (elt -> elt -> elt) -> FM key elt -> key -> elt -> FM key elt+addToFM :: FM key elt -> key -> elt  -> FM key elt+lookupFM :: FM key elt -> key -> Maybe elt+lookupWithDefaultFM :: FM key elt -> elt -> key -> elt+-}++empty :: FM a b+empty = []++-- EOF --
+ hxml-0.2/DTD.hs view
@@ -0,0 +1,218 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.DTD+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: provisional+-- Portability	: portable+--+-- CVS  	: $Id: DTD.hs,v 1.6 2002/10/12 01:58:57 joe Exp $+--+----------------------------------------------------------------------------+--+-- | Data types for SGML and XML document type definitions.+-- This is based on the SGML property set found in the DSSSL spec,+-- section 9.6.+--+-- History:+-- 	[23 Jan 2000], taken from earlier work, [4 Jan 1997]+--++module DTD where++import XML+import qualified AssocList as FM++type GI		= Name		-- generic identifier (element type name)+type DCN	= Name		-- data content notation name ++-- | Content expression, parameterized over type of primitive tokens+data CE a =+      Prim	  a		-- ^ Primitive content token+    | Rep 	 (CE a)		-- ^ Zero or more, '*' occurrence indicator+    | Opt  	 (CE a)		-- ^ Optional, '?' occurrence indicator+    | Plus  	 (CE a)		-- ^ One or more, '+' occurrence indicator+    | Seq	[(CE a)]	-- ^ Sequence, ',' connector+    | Or 	[(CE a)]	-- ^ Alternation, '|' connector+    | And	[(CE a)]	-- ^ Permutation, '&' connector+    deriving Eq++data PrimitiveToken =+      PCDATA			-- ^ Parsed character data+    | ELEMENT GI		-- ^ Element+    deriving Eq++type ModelGroup = CE PrimitiveToken+data CONTYPE = 		-- (element) content type+      DC_EMPTY 		-- ^ declared content (also: CDATA, RCDATA in SGML)+    | DC_ANY		-- ^ "ANY"+    | DC_MODELGRP ModelGroup+    deriving Show++data ELEMTYPE = ELEMTYPE {	--   element type definition+    gi		:: GI,		-- ^ generic identifier+    contype	:: CONTYPE,	-- ^ content type+    omissibility:: (Bool,Bool),	-- ^ omitstrt+omitend+    inclusions	:: [GI],+    exclusions	:: [GI] } deriving Show++-- Missing: attdefs, srmap(nm); all from DTGABS++data ATT_TYPE =		-- (dcltype/decl value type)+      ATcdata+    | ATentity+    | ATentities+    | ATid+    | ATidref+    | ATidrefs+    | ATnmtoken			-- %%% or name/number/nutoken+    | ATnmtokens		-- %%% or names/numbers/nutokens+    | ATnotation [DCN]		-- List of notation names+    | ATenumerated [Name]	-- nmtkgrp / name token group+  deriving Show++data ATT_DV = 	-- attribute default value (dflttype/default value type)+      ADVfixed String		-- "#FIXED ..."+    | ADVrequired		-- "#REQUIRED"+    | ADVimplied		-- "#IMPLIED"+    | ADVdefault String		-- "..."+    -- SGML only:+    | ADVcurrent		-- "#CURRENT"+    | ADVconref			-- "#CONREF"+  deriving Show++data ATTDEF = ATTDEF {	-- attribute definition+    att_name	:: Name,+    att_type	:: ATT_TYPE,+    att_dv 	:: ATT_DV } deriving Show++type ATTSPEC = (Name,String)	-- (attasgn/attribute assignment)+++-- +-- Entities:+--++type ExternalID = (Maybe PUBID, Maybe SYSID)+type PUBID = String+type SYSID = String++data ENTTYPE = 		-- entity type+      ETtext		-- SGML text entity+    | ETcdata+    | ETsdata+    | ETndata+    | ETsubdoc+    | ETpi		-- processing instruction entity++data EntityText =+      EN_INTERNAL String	 -- entity.text/replacement text +    | EN_EXTERNAL ExternalID     -- entity.extid/external identifier+	deriving Show++data Entity = Entity {+    ename :: Name,		-- name+    etype :: ENTTYPE,		-- enttype/entity type+    etext :: EntityText,	-- see above+    edcn  :: Maybe DCN,		-- notname/notation name+    eatts :: [ATTSPEC]		-- atts/attributes+}++type EntityMap 		= FM.FM Name EntityText+predefinedEntities 	:: EntityMap+predefinedEntities	= foldr (uncurry FM.insert) FM.empty predefinedGEs+    where+	(==>)		= \a b -> (a,EN_INTERNAL b)+	predefinedGEs	= [+				"lt"	==> "<",+				"amp"	==> "&",+				"gt"	==> ">",+				"apos"	==> "'",+				"quot"	==> "\"" ]+-- +-- Utility routine, used by scanner:+--++expandInternalEntity :: EntityMap -> Name -> Maybe String+expandInternalEntity entities name = +    case FM.lookupM entities name of+	Just (EN_INTERNAL text)	-> Just text+	_			-> Nothing++--+-- DTDS:+--+data DTD = DTD {+    elements :: FM.FM Name ELEMTYPE,		-- elemtps / element types+    attlists :: FM.FM Name [ATTDEF], 		-- elemtype.attdefs+    genents  :: FM.FM Name EntityText,		-- general entities+    parments :: FM.FM Name EntityText,		-- parameter entities+    notations:: [DCN],				-- nots/notations+    dtdname  :: Name 				-- name (document type name)+} 	deriving Show++emptyDTD :: DTD+emptyDTD = DTD {+    elements = FM.empty,+    attlists = FM.empty,+    genents  = predefinedEntities,+    parments = FM.empty,+    dtdname  = "",+    notations= []+} ++declareParameterEntity,declareGeneralEntity :: Name -> EntityText -> DTD -> DTD+declareParameterEntity name entityText dtd =+	dtd { parments = FM.insertWith keepOld name entityText (parments dtd) }+	where keepOld old _new = old+declareGeneralEntity   name entityText dtd =+	dtd { genents  = FM.insertWith keepOld name entityText (genents  dtd) }+	where keepOld old _new = old++-- %%% DEAL WITH DUPLICATE DEFINITIONS HERE:+declareElements :: [GI] -> (Bool,Bool) -> CONTYPE -> ([GI],[GI]) -> DTD -> DTD+declareElements elementNames omissibility contentDefinition (incl,excl) dtd =+	dtd { elements = foldl mkElement (elements dtd) elementNames }+	where mkElement fm gi = FM.insert gi el fm where	+		el = ELEMTYPE {+			gi = gi,+			contype = contentDefinition,+			omissibility = omissibility,+			inclusions = incl,+			exclusions = excl+		    }++-- %%% DEAL WITH DUPLICATES:+declareAttlist :: [GI] -> [ATTDEF] -> DTD -> DTD+declareAttlist elementNames attdefs dtd =+	dtd { attlists = foldl addAttdefs (attlists dtd) elementNames }+	where addAttdefs fm gi = FM.insert gi attdefs fm++declareNotation :: DCN -> ExternalID -> DTD -> DTD+declareNotation dcn _unused dtd =+	dtd { notations = dcn : notations dtd }++-- Need srmaps::Dict[SRASSOC]+usemaps::Dict{-GI-}srmap(nm)|elemtype.srmap(nm)+-- notation: name, extid, attdefs++instance Show PrimitiveToken where+  showsPrec _ PCDATA	= showString "#PCDATA"+  showsPrec _ (ELEMENT gi) = showString gi++instance (Show prim) => Show (CE prim) where+  showsPrec _ mg = pp mg where+    pp (Prim p)	= shows p+    pp (Rep x)	= shows x . showString "*"+    pp (Opt x)	= shows x . showString "?"+    pp (Plus x)	= shows x . showString "+"+    pp (Seq x)	= showgroup ", " x+    pp (Or x)	= showgroup " | " x+    pp (And x)	= showgroup " & " x+    showgroup delim l	= showString "(" . showl l . showString ")" where+	showl [x]	= shows x+	showl (x:xs)	= shows x . showString delim . showl xs+	showl []	= showString "-- ERROR: empty model group! --"++-- EOF --
+ hxml-0.2/ETree.hs view
@@ -0,0 +1,44 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.ETree+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: ETree.hs,v 1.3 2002/10/12 01:58:57 joe Exp $+--+----------------------------------------------------------------------------+--+-- 11 Mar 2002+--+-- Simplified XML representation with only the essential Infoset properties.+--++module ETree(ETree, xmlToETree, etreeToXML) where++import XML+import Tree++data ETree+    = Element Name AttList [ETree]+    | Text String+    deriving Show++xmlToETree :: XML -> ETree+xmlToETree = maybe fallback id . foldTree etree mcons [] where+    etree (TXNode txt) _	= Just $ Text txt+    etree (ELNode gi atts) c	= Just $ Element gi atts c+    etree RTNode (c:_) 		= Just c+    etree _ _			= Nothing+    mcons 			= maybe id (:)+    fallback			= Text "Error: ill-formed XML input"++etreeToXML :: ETree -> XML+etreeToXML = anaTree psi where+    psi (Text txt)			= (TXNode txt,[])+    psi (Element gi atts content)	= (ELNode gi atts,content)++-- EOF --
+ hxml-0.2/Filter.hs view
@@ -0,0 +1,82 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.Filter+-- Copyright	: (C) 2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: Filter.hs,v 1.3 2002/10/12 01:58:57 joe Exp $+--+----------------------------------------------------------------------------+--+-- | Filter arrows: @(a -> [b])@+--+-- @Filter a b@ is essentially the same as the Monadic arrow @MA [] a b@,+-- but it uses a different version of the bind operation at certain+-- points to reduce heap drag.+--++module Filter(Filter, runFilter, makeFilter, apFilter, aEach) where++import Arrow++newtype Filter a b = F (a -> [b])++runFilter :: Filter a b -> a -> [b]+runFilter (F f) = f++makeFilter :: (a -> [b]) -> Filter a b+makeFilter = F++apFilter :: ([a] -> [b]) -> Filter c a -> Filter c b+apFilter func filt = makeFilter (func . runFilter filt)++aEach :: Filter [a] a+aEach = makeFilter id++(!>>=)	:: [a] -> (a -> [b]) -> [b]+[]	!>>= _ = []+[x]	!>>= f = f x+(x:xs)  !>>= f = f x ++ (xs !>>= f)++wrap :: a -> [a]+wrap x = [x]++instance Arrow Filter where+    arr f		= F $ wrap . f+    F f >>> F g 	= F $ concatMap g . f+    F f >&< F g 	= F $ \(b,d) -> f b !>>= \c-> g d !>>= \e-> [(c,e)]+    F f &&& F g 	= F $ \b     -> f b !>>= \c-> g b !>>= \e-> [(c,e)]+    apfst (F f) 	= F $ \(b,d) -> f b !>>= \c-> [(c,d)]+    apsnd (F g) 	= F $ \(b,d) -> g d !>>= \e-> [(b,e)]+    aConst c		= F $ const [c]+    idArrow		= F wrap+    liftA2 h (F f) (F g)= F $ \x -> f x !>>= \l -> map (h l) (g x)++instance ArrowChoice Filter where+    F f ||| F g 	= F $ either f g+    F f >|< F g 	= F $ either (map Left . f) (map Right . g)+    apl (F f) 		= F $ either (map Left . f) (wrap . Right)+    apr (F g)		= F $ either (wrap . Left)  (map Right . g)+    p    ?> (F f :> F g)= F $ \x -> if p x then f x else g x+    F p >?> (F f :> F g)= F $ \x -> p x !>>= \c -> if c then f x else g x++instance ArrowZero Filter where+    aZero   		= F (const [])+    aMaybe  		= F (maybe [] wrap)+    aGuard p 		= F (\x -> if p x then [x] else [])++instance ArrowPlus Filter where+    F f +++ F g		= F (\x -> f x ++ g x)++{- Alternate implementation:+    type Filter a b	= MA [] a b+    runFilter		= runMA+    makeFilter		= reflectMA+    aEach		= aJoin+-}++-- EOF --
+ hxml-0.2/HXML.hs view
@@ -0,0 +1,38 @@+----------------------------------------------------------------------------+--+-- Module	: HXML+-- Copyright	: (C) 2001-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- Created	: 1 Nov 2001+-- CVS  	: $Id: HXML.hs,v 1.5 2002/10/12 01:58:57 joe Exp $+--+----------------------------------------------------------------------------+--+-- | Package module for HXML -- just reexports all the public modules.+--++module HXML +    ( module XML+    , module Tree+    , module PrintXML+    , module ETree++    , parseXML+    ) where++import XML+import XMLParse+import Tree+import TreeBuild+import PrintXML+import ETree++parseXML :: String -> Tree XMLNode+parseXML = buildTree . parseDocument++-- EOF --
+ hxml-0.2/LLParsing.hs view
@@ -0,0 +1,110 @@+{-# OPTIONS -fno-warn-missing-signatures #-}+{-# OPTIONS -fglasgow-exts #-}+----------------------------------------------------------------------------+--+-- Module	: HXML.LLParsing+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable (wants rank-2 polymorphism but can live without it)+--+-- CVS  	: $Id: LLParsing.hs,v 1.6 2002/10/12 01:58:57 joe Exp $+--+----------------------------------------------------------------------------+--+-- 20 Jan 2000+-- Simple, non-backtracking, no-lookahead parser combinators.+-- Use with caution!+--++module LLParsing+    ( pTest , pCheck , pSym , pSucceed+    ,(<|>),(<*>),(<$>),(<^>),(<$),(<*),(*>),(<?>),(<**>)+    , pMaybe , pFoldr , pList , pSome , pChainr , pChainl, pTry+    , pRun+    ) where++infixl 3 <|>+infixl 4 <*>, <$>, <^>, <?>, <$, <*, *>, <**>++{- <H98> -}+-- Use this for Haskell 98:+newtype P p = P p+{- </H98> -}++{- <H98EXT> -}+{-+-- Use this if the system supports rank-2 polymorphism:+newtype Parser sym res = P (forall a .+       (res -> [sym] -> a)		-- ok continuation+    -> ([sym] -> a) 			-- failure continuation+    -> ([sym] -> a) 			-- error continuation+    -> [sym] 				-- input+    -> a)				-- result++pTest	:: (a -> Bool) -> Parser a a+pCheck	:: (a -> Maybe b) -> Parser a b+pSym	:: (Eq a) => a -> Parser a a+pSucceed:: b -> Parser a b+(<|>)	:: Parser a b -> Parser a b -> Parser a b	-- union+(<*>)	:: Parser a (b->c) -> Parser a b -> Parser a c	-- sequence+(<$>) 	:: (b->c) -> Parser a b -> Parser a c		-- application+(<$ )	:: c -> Parser a b -> Parser a c		-- application, dropr+(<^>)	:: Parser a b -> Parser a c -> Parser a (b,c)	-- sequence+(<* )	:: Parser a b -> Parser a c -> Parser a b	-- sequence, dropr+( *>)	:: Parser a b -> Parser a c -> Parser a c	-- sequence, dropl+(<?>)	:: Parser a b -> b -> Parser a b		-- optional+(<**>)	:: Parser s b -> Parser s (b->a) -> Parser s a	-- postfix application+pMaybe	:: Parser s a -> Parser s (Maybe a)+pFoldr	:: (a->b->b) -> b -> Parser s a -> Parser s b+pList	:: Parser a b -> Parser a [b]+pSome	:: Parser a b -> Parser a [b]+pChainr	:: Parser a (b -> b -> b) -> Parser a b -> Parser a b+pChainl	:: Parser a (b -> b -> b) -> Parser a b -> Parser a b+pRun 	:: Parser a b -> [a] -> Maybe (b,[a])+-}+{- </H98EXT> -}++pTest pred = P (ptest pred)+    where+    ptest _p _o f _e [] = f []+    ptest p ok f _e l@(c:cs)+	| p c		= ok c cs+	| otherwise	= f l++pSym a = pTest (a==)+pCheck cmf = P (pcheck cmf) where+    pcheck _mf _ok f _e [] = f []+    pcheck mf ok f _e cs@(c:s) = case (mf c) of+	Just x	-> ok x s+	Nothing	-> f cs++pTry (P pa) = P (\ok f _e i -> pa ok f (\ _i' -> f i) i)++pSucceed a 		= P (\ok _f _e  -> ok a)+(P pa) <|> (P pb) 	= P (\ok f e  	-> pa ok (pb ok f e) e)+(P pa) <*> (P pb) 	= P (\ok f e  	-> pa (\a -> pb (ok . a) e e) f e)+(P pa) <?>  a		= P (\ok _f  	-> pa ok (ok a))+(P pa) <^> (P pb)	= P (\ok f e	-> pa (\a->pb(\b->ok (a,b)) e e) f e)+f      <$> (P pb)	= P (\ok 	-> pb (ok . f))+f      <$  (P pb)	= P (\ok 	-> pb (ok . const f))+pa     <*     pb  	= curry fst <$> pa <*> pb+pa      *>    pb 	= curry snd <$> pa <*> pb+pa    <**>    pb 	= (\x f -> f x) <$> pa <*> pb++pMaybe p		= Just <$> p <|> pSucceed Nothing+pFoldr op e p 		= loop where loop = (op <$> p <*> loop) <?> e+pList 			= pFoldr (:) []+pSome p           	= (:) <$> p <*> pList p+pChainr op p 		= loop+			  where loop = p <**> ((flip <$> op <*> loop) <?> id)+pChainl op p 		= foldl ap <$> p <*> pList (flip <$> op <*> p)+			  where ap x f = f x++pRun (P p) = p just2 fail fail where+    just2 x y		= Just (x,y)+    fail 		= const Nothing++-- EOF --
+ hxml-0.2/Misc.hs view
@@ -0,0 +1,60 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.Misc+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: Misc.hs,v 1.8 2002/10/12 01:58:58 joe Exp $+--+----------------------------------------------------------------------------+--+-- 21 Jan 2000+-- Miscellaneous combinators that I find useful+--+ +module Misc where++errNYI :: String -> a+errNYI msg = error ("Not Yet Implemented: " ++ msg)++-- Kleisli composition:+o :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)+f `o` g = \x -> g x >>= f++-- Some useful anamorphisms:+maybeStar, maybePlus :: (a -> Maybe a) -> a -> [a]+maybeStar f a = a : maybe [] (maybeStar f) (f a)+maybePlus f a =     maybe [] (maybeStar f) (f a)++-- Used to be in Haskell Prelude:+done :: Monad m => m ()+done = return ()++-- H98: found in module Monad:+liftM2 :: (Monad m) => (b->c->d) -> m b -> m c -> m d+liftM2 op x y = x >>= \a ->  y >>= \b -> return (op a b)++-- H98: found in module Maybe:+maybeToList :: Maybe a -> [a]+maybeToList Nothing 	= []+maybeToList (Just a)	= [a]++-- ... other stuff+instance Monad ((->) s) where		-- Reader Monad+    return	= const+    f >>= g  	= \x -> g (f x) x++lift :: (b->c->d) -> (a->b) -> (a->c) -> (a->d)+lift f g h x = f (g x) (h x)++pair :: a -> b -> (a,b)+pair x y = (x,y)++wrap :: a -> [a]+wrap x = [x]++-- EOF --
+ hxml-0.2/NTree.hs view
@@ -0,0 +1,84 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.NTree+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: NTree.hs,v 1.3 2002/10/12 01:58:58 joe Exp $+--+----------------------------------------------------------------------------+--+-- Description: "Navigable trees": allow a program to traverse +-- up the tree as well as down.+--++module NTree where++import Tree+import Misc (maybeStar, maybePlus, maybeToList, o)++data NTree a = NT+    (Tree a)		-- self+    [NTree a]		-- ancestors+    [Tree a]		-- previous siblings (in reverse order)+    [Tree a]		-- following siblings++ntree :: Tree a -> NTree a+ntree nd = NT nd [] [] []++subtreeNT :: NTree a -> Tree a+subtreeNT (NT nd         _ _ _)	= nd++dataNT :: NTree a -> a+dataNT    (NT (Tree a _) _ _ _)	= a++upNT, downNT, leftNT, rightNT :: NTree a -> Maybe (NTree a)++upNT	  (NT _ (p:_) _ _)		= Just p+upNT	  (NT _ [] _ _) 		= Nothing+downNT	t@(NT (Tree _ (c:cs)) u _ _)	= Just (NT c (t:u) [] cs)+downNT 	  (NT (Tree _ []    ) _ _ _)	= Nothing+leftNT	  (NT s u (l:ls) r)		= Just (NT l u ls (s:r))+leftNT	  (NT _ _ []     _)		= Nothing+rightNT   (NT s u l (r:rs))		= Just (NT r u (s:l) rs)+rightNT   (NT _ _ _ []    ) 		= Nothing++-- preorderNT t = t : concatMap preorderNT (children t)+-- where children = maybe [] (maybeStar rightNT) . downNT+preorderNT :: NTree a -> [NTree a]+preorderNT = visit [] where+    visit  k t = t : maybe k (visit' k) (downNT t)+    visit' k t = visit (maybe k (visit' k) (rightNT t)) t++revPreorderNT :: NTree a -> [NTree a]+revPreorderNT t = t : concatMap revPreorderNT (reverse (children t))+	where children = maybe [] (maybeStar rightNT) . downNT++-- XPath axes:++ancestorAxis, ancestorOrSelfAxis, childAxis,+    descendantAxis, descendantOrSelfAxis,+    followingAxis, followingSiblingAxis, parentAxis,+    precedingAxis, precedingSiblingAxis, selfAxis +    :: NTree a -> [NTree a]++-- attributeAxis, namespaceAxis : not supported++parentAxis		= maybeToList . upNT+ancestorAxis 		= \(NT _ u _ _) -> u		-- or: maybePlus upNT+ancestorOrSelfAxis	= \t@(NT _ u _ _) -> t:u	-- or: maybeStar upNT+childAxis		= maybe [] (maybeStar rightNT) . downNT+descendantAxis		= tail . preorderNT -- concatMap preorderNT . childAxis+descendantOrSelfAxis	= preorderNT+followingSiblingAxis	= maybePlus rightNT+precedingSiblingAxis	= maybePlus leftNT+selfAxis		= wrap  where wrap x = [x]++followingAxis = preorderNT     `o` followingSiblingAxis `o` ancestorOrSelfAxis +precedingAxis = revPreorderNT  `o` precedingSiblingAxis `o` ancestorOrSelfAxis++-- EOF --
+ hxml-0.2/PrintXML.hs view
@@ -0,0 +1,91 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.PrintXML+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: PrintXML.hs,v 1.5 2002/10/12 01:58:58 joe Exp $+--+----------------------------------------------------------------------------++module PrintXML +    ( printXML, showXML+    , printEvent, showEvent, showEvents, printEvents+    ) where++import XML+import Tree+import TreeBuild+import XMLParse (XMLEvent(..))++printXML :: XML -> IO ()+printXML = printEvents . serializeTree++showXML :: XML -> String+showXML t = pp t [] where+    pp (Tree nd children) k = case nd of+	RTNode 			-> ppl children k+	TXNode txt 		-> textEscape txt k+	PINode tgt [] 		-> "<?" ++ tgt ++ "?>" ++ k+	PINode tgt val 		-> "<?" ++ tgt ++ " " ++ val ++ "?>" ++ k+	CXNode txt 		-> "<!--" ++ txt ++ "-->" ++ k+	ENNode ename 		-> "&" ++ ename ++ ";" ++ k+	ELNode gi attlist	->+	    let atts = showAttlist attlist+	    in case children of+		[] -> "<" ++ gi ++ atts ++ "/>" ++ k+		_  -> "<" ++ gi ++ atts ++ ">"+		      ++ ppl children ("</" ++ gi ++ "\n>" ++ k)+    ppl [] k = k+    ppl (x:xs) k = pp x (ppl xs k)++showEvent	:: XMLEvent -> String+printEvent	:: XMLEvent -> IO ()+showEvents	:: [XMLEvent] -> String+printEvents	:: [XMLEvent] -> IO ()++showEvents 	= concatMap showEvent+printEvent	= putStr . showEvent+printEvents	= mapM_ printEvent++showEvent (StartEvent gi atts) 	= "<" ++ gi ++ showAttlist atts ++ ">"+showEvent (EmptyEvent gi atts)	= "<" ++ gi ++ showAttlist atts ++ "/>"+showEvent (EndEvent   gi)	= "</" ++ gi ++ "\n>"+showEvent (TextEvent  txt)	= textEscape txt []+showEvent (PIEvent    tgt [])	= "<?" ++ tgt ++ "?>"+showEvent (PIEvent    tgt val)	= "<?" ++ tgt ++ " " ++ val ++ "?>"+showEvent (GERefEvent name)	= "&" ++ name ++ ";"+showEvent (CommentEvent txt)	= "<--" ++ txt ++ "-->"+showEvent (ErrorEvent txt)	= error txt++showAttlist :: [(Name,String)] -> String+showAttlist attlist = concat [' ':patt nm val | (nm,val) <- attlist]+    where+	vi = "="+	patt nm val = nm ++ vi ++ "\"" ++ attvalEscape val "\""++textEscape, attvalEscape :: String -> ShowS++textEscape [] k = k+textEscape (c:cs) k =+    case c of+	'<'	-> "&lt;" ++ textEscape cs k+	'>'	-> "&gt;" ++ textEscape cs k+	'&'	-> "&amp;" ++ textEscape cs k+	_	-> c : textEscape cs k++attvalEscape [] k = k+attvalEscape (c:cs) k =+    case c of+	'<'	-> "&lt;" ++ attvalEscape cs k+	'>'	-> "&gt;" ++ attvalEscape cs k+	'&'	-> "&amp;" ++ attvalEscape cs k+	'\''	-> "&apos;" ++ attvalEscape cs k+	'\"'	-> "&quot;" ++ attvalEscape cs k+	_	-> c : attvalEscape cs k++-- EOF --
+ hxml-0.2/Tree.hs view
@@ -0,0 +1,73 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.Tree+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: Tree.hs,v 1.9 2002/10/12 01:58:58 joe Exp $+--+----------------------------------------------------------------------------+--+-- 7 Jan 2000+--++module Tree where++data Tree a = Tree a [Tree a]+	deriving Show++--+-- Projections:+--+treeRoot    	:: Tree a -> a+treeChildren	:: Tree a -> [Tree a]+treeRoot  	(Tree a _) = a+treeChildren	(Tree _ c) = c++leafNode :: a -> Tree a+leafNode x = Tree x []++-- preorderTree (Tree a c) = a : concatMap preorderTree c+-- preorderTree = cataTree(\(x,bs) -> x : concat bs)+preorderTree :: Tree a -> [a]+preorderTree t = traverse t [] where+    traverse (Tree a c) k 	= a : travlist c k+    travlist (c:cs) k		= traverse c (travlist cs k)+    travlist [] k 		= k++-- The usual polytypic routines:++mapTree :: (a -> b) -> Tree a -> Tree b+mapTree f (Tree a c) = Tree (f a) (map (mapTree f) c)++instance Functor Tree where fmap = mapTree++-- type TreeF a b = (a, [b])+cataTree :: ((a, [b]) -> b) -> Tree a -> b -- (TreeF a b -> b) -> Tree a -> b+anaTree  :: (b -> (a, [b])) -> b -> Tree a -- (b -> TreeF a b) -> b -> Tree a+cataTree f (Tree a c) = f (a,map (cataTree f) c)+anaTree g b = let (a,bs) = g b in Tree a (map (anaTree g) bs)++-- A friendlier variant of cataTree:+--+foldTree :: (a -> b -> c) -> (c -> b -> b) -> b -> Tree a -> c+foldTree tree cons nil (Tree a c)+	= tree a (foldr cons nil (map (foldTree tree cons nil) c))++-- Downwards accumulation:+--+scanTree :: (a -> b -> a) -> a -> Tree b -> Tree a+scanTree op a (Tree b children)+	= let a' = a `op` b in Tree a' (map (scanTree op a') children)++-- A variant:+--+accumTree :: (a -> b -> (c, a)) -> a -> Tree b -> Tree c+accumTree op a (Tree b children)+	= let (c,a') = a `op` b in Tree c (map (accumTree op a') children)++-- EOF --
+ hxml-0.2/TreeBuild.hs view
@@ -0,0 +1,69 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.TreeBuild+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: TreeBuild.hs,v 1.7 2002/10/12 01:58:58 joe Exp $+--+----------------------------------------------------------------------------+--+-- 30 Jan 2000+--++module TreeBuild (buildTree, constructTree, serializeTree) where++import XMLParse+import XML+import Tree++--+-- TODO: add basic error-checks: matching end-tags, ensure input exhausted+--+-- %%% There is apparently a space leak here, but I can't find it.+-- %%% Update 28 Feb 2000: There is a leak, but it's fixed+-- %%% by a well-known GC implementation technique.  Hugs 98 happens+-- %%% not to implement this technique, but STG Hugs (and most other+-- %%% Haskell systems) do implement it.+-- %%% Thanks to Simon Peyton-Jones, Malcolm Wallace, Colin Runcinman+-- %%% Mark Jones, and others for investigating this.++buildTree :: [XMLEvent] -> Tree XMLNode+buildTree = constructTree Tree (:) []++constructTree :: (XMLNode -> f -> t) -> (t -> f -> f) -> f -> [XMLEvent] -> t+constructTree tree cons nil events = let+	pair x y 		= (x,y)+	addNode nd children es	= addTree (tree nd children) es+	addLeaf nd es		= addTree (tree nd nil) es+	addTree t es		= let (s,es') = build es in pair (cons t s) es'+	build [] 		= pair nil []+	build (e:es) = case e of+	    StartEvent gi atts	-> let (c,es') = build es +	    			   in addNode (ELNode gi atts) c es'+	    EndEvent _		-> pair nil es+	    EmptyEvent gi atts	-> addLeaf (ELNode gi atts) es+	    TextEvent s		-> addLeaf (TXNode s) es+	    PIEvent tgt val	-> addLeaf (PINode tgt val) es+	    CommentEvent txt	-> addLeaf (CXNode txt) es+	    GERefEvent name	-> addLeaf (ENNode name) es+	    ErrorEvent s	-> error s  -- %%% deal with this+	in tree RTNode (fst (build events))++serializeTree :: Tree XMLNode -> [XMLEvent]+serializeTree tree = sn tree [] where+    sn (Tree node content) k = case node of+	RTNode 		-> sl content k+	ELNode gi atts	-> StartEvent gi atts : sl content (EndEvent gi : k)+	TXNode txt	-> TextEvent txt : k+	PINode tgt val	-> PIEvent tgt val : k+	CXNode txt	-> CommentEvent txt : k+	ENNode name	-> GERefEvent name : k+    sl [] k 	= k+    sl (x:xs) k = sn x (sl xs k)++-- EOF --
+ hxml-0.2/XML.hs view
@@ -0,0 +1,102 @@+----------------------------------------------------------------------------+--+-- Module	: HXML.XML+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: XML.hs,v 1.9 2002/10/12 01:58:59 joe Exp $+--+----------------------------------------------------------------------------+--+-- 16 Jan 2000+-- Basic XML data types+--++module XML+    ( XMLNode(..)+    , Name, XML, AttList+    , stringValue, nodeName+    , xAttlist, xAttval+    , attributes, attval+    , xELNode, xTXNode, xPINode+    ) where++import Tree++type Name 	= String		-- %%% XMLNS makes this more complex+type GI 	= Name			-- generic identifier, element type name+type AttList	= [(Name,String)]	-- attribute list+type XML	= Tree XMLNode++data XMLNode =+      RTNode				-- root node+    | ELNode	GI AttList		-- element node: GI, attributes+    | TXNode	String			-- text node+    | PINode	Name String		-- processing instruction (target,value)+    | CXNode	String			-- comment node+    | ENNode	Name			-- general entity reference++    -- XPath also defines:+    --  ATNodeP	Name String		-- attribute node+    --  NSNodeP	Name {- prefix-} String {-URI-}	-- namespace node+    deriving Show++stringValue :: XML -> String		-- [XPATH, 5]+stringValue nd@(Tree d _) = case d of+    RTNode	-> concat [sv | TXNode sv <- preorderTree nd] 	-- [XPATH 5.1]+    ELNode _ _	-> concat [sv | TXNode sv <- preorderTree nd] 	-- [XPATH 5.2]+    TXNode s	-> s			-- [XPATH 5.7]+    PINode _ v	-> v			-- [XPATH 5.5]+    CXNode s	-> s			-- [XPATH 5.6]+    ENNode  _    -> ""			-- [not defined in XPATH]+    -- ATNodeP _ v	-> v		-- [XPATH 5.3]+    -- NSNodeP _ uri -> uri		-- [XPATH 5.4]++-- %%% need to fix this to account for [XMLNS]+nodeName :: XMLNode -> Maybe Name	-- [XPATH, 5; "expanded-name"]+nodeName nd = case nd of+    ELNode gi _	-> Just gi		-- %%% Check [XMLNS]+    PINode tgt _-> Just tgt		-- [XPATH 5.5], pi target, null URI+    ENNode name	-> Just name		-- [not defined in XPATH]+    --ATNodeP n _-> Just n		-- %%% Check [XMLNS]+    --NSNodeP p _-> Just p		-- [XPATH 5.4], ns prefix, null URI+    RTNode	-> Nothing		-- [XPATH 5.1]+    TXNode _	-> Nothing		-- [XPATH 5.7]+    CXNode _	-> Nothing		-- [XPATH 5.6]++--+-- Accessors:+--+xAttlist :: XMLNode -> AttList+xAttlist (ELNode _ attlist) 	= attlist+xAttlist _			= []++xAttval :: Name -> XMLNode -> Maybe String+xAttval name = lookup name . xAttlist++xELNode :: (Name -> AttList -> a)	-> XMLNode -> Maybe a+xTXNode :: (String -> a)		-> XMLNode -> Maybe a+xPINode :: (String -> String -> a)	-> XMLNode -> Maybe a++xELNode f (ELNode gi atts) 		= Just (f gi atts)+xELNode _ _		   		= Nothing+xTXNode f (TXNode txt) 			= Just (f txt)+xTXNode _ _				= Nothing+xPINode f (PINode tgt val) 		= Just (f tgt val)+xPINode _  _				= Nothing++--+-- Tree +--++attributes :: XML -> AttList+attributes = xAttlist . treeRoot++attval :: Name -> XML -> Maybe String+attval name = xAttval name . treeRoot++-- EOF --
+ hxml-0.2/XMLCombinators.hs view
@@ -0,0 +1,182 @@+----------------------------------------------------------------------------+--+-- Module	: XMLCombinators+-- Copyright	: (C) 2001,2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: XMLCombinators.hs,v 1.6 2003/06/18 18:47:03 joe Exp $+--+----------------------------------------------------------------------------+--+-- 2 Nov 2001; revised 5 Nov 2001 to use Arrows.+--++module XMLCombinators+    ( module Arrow, module Filter, module HXML+    , xmlFilterMain, testFilter+    , qSelf, qChildren, qDescendants, qSubtree+    , qElem, qElems, qText, qEntity+    , qAttval, qAttlist, qNodeName+    , mkElem, mkElement+    , mkText, mkLiteral+    , mkAtt+    , apChildren, keepText+    , qInner, qOuter, qFirst+    , qMatch, qTest+    , aFoldTree, aScanTree+    , (.//), (./), (|>|), (|?>), qChildElem+    )+    where++import Monad+import Arrow+import Filter+import HXML++infixr 2 |?>		-- same as ?>, :>+infixl 1 ./, .//	-- same as >>>++--+-- Predicate adapters:+--++qMatch :: Filter a b -> Filter a a+qMatch f = aGuard (not . null . runFilter f)++qTest :: Filter a b -> Filter a Bool+qTest f = makeFilter (return . not . null . runFilter f)++(|?>) :: Filter a x -> Choice (Filter a b) -> Filter a b+f |?> choice = (not . null . runFilter f) ?> choice++--+-- Constructors:+--++mkNode :: a -> Filter s (Tree a) -> Filter s (Tree a)+mkNode nd body = makeFilter (\x -> [Tree nd (runFilter body x)])++mkLiteral :: String -> Filter a XML+mkLiteral = aConst . leafNode . TXNode++mkElem :: Name -> Filter a XML -> Filter a XML+mkElem name = mkNode (ELNode name [])++mkElement :: Name -> Filter a (Name,String) -> Filter a XML -> Filter a XML+mkElement name atts body = arr $ \x ->+	Tree (ELNode name (runFilter atts x)) (runFilter body x)++mkAtt :: Name -> Filter a String -> Filter a (Name,String)+mkAtt name val = aConst name &&& val++mkText :: Filter String XML+mkText = arr (leafNode . TXNode)++--+-- Navigation:+--++qChildren, qDescendants, qSubtree :: Filter (Tree a) (Tree a)+qChildren	= makeFilter treeChildren+qSubtree	= qSelf +++ (qChildren >>> qSubtree)+qDescendants	= qChildren >>> qSubtree++qInner, qOuter :: Filter (Tree a) b -> Filter (Tree a) b+qOuter p = p |>| (qChildren >>> qOuter p)+qInner p = (qChildren >>> qInner p) |>| p+++(|>|) :: Filter a b -> Filter a b -> Filter a b+f |>| g = makeFilter choose where+    choose x = let fx = runFilter f x in if null fx then runFilter g x else fx++qFirst :: Filter a b -> Filter a b+qFirst = apFilter take1 where+	take1 [] 	= []+	take1 (x:_)	= [x]++--+-- Editing:+--++apChildren :: Filter (Tree a) (Tree a) -> Filter (Tree a) (Tree a)+apChildren f = arr (\(Tree x ts) -> Tree x (ts >>= runFilter f))++aFoldTree, aScanTree :: Filter (Tree a) (Tree a) -> Filter (Tree a) (Tree a)++aFoldTree f = apChildren (aFoldTree f) >>> f+aScanTree f = f >>> apChildren (aScanTree f)++--+-- Predicates:+--++qElem :: Name -> Filter XML XML+qElem name = aGuard (q . treeRoot) where+    q (ELNode gi _)	= gi == name+    q _			= False++qElems :: [Name] -> Filter XML XML	-- =  foldr1 (|>|) . map qElem+qElems gis = aGuard (test . treeRoot) where+    test (ELNode gi _)	= elem gi gis+    test _		= False++qText :: Filter XML XML+qText = aGuard (isTXNode . treeRoot) where+    isTXNode (TXNode _)	= True+    isTXNode _		= False++qEntity :: Filter XML XML+qEntity = aGuard (isENNode . treeRoot) where+    isENNode (ENNode _)	= True+    isENNode _		= False++qSelf :: Filter x x+qSelf = arr id++--+-- Extractions:+--++keepText :: Filter XML XML+keepText = qSubtree >>> (qText |>| qEntity)+-- ALT: arr stringValue >>> mkText++qAttval :: Name -> Filter XML String+qAttval name = arr (attval name) >>> aMaybe++qAttlist :: Filter XML (Name,String)+qAttlist = makeFilter attributes++qNodeName :: Filter XML Name+qNodeName = arr (nodeName . treeRoot) >>> aMaybe++--+-- Shorthand:+--++(./), (.//) :: Filter a XML -> String -> Filter a XML+f ./  gi = f >>> qChildren >>> qElem gi+f .// gi = f >>> qOuter (qElem gi)++qChildElem :: String -> Filter XML XML+qChildElem gi = qFirst (qChildren >>> qElem gi)++--+-- Utilities:+--++xmlFilterMain :: Filter XML XML -> IO ()+xmlFilterMain f =+    getContents >>= mapM_ printXML . runFilter f . parseXML+    >> putChar '\n'++testFilter :: FilePath -> Filter XML XML -> IO ()+testFilter filename f =+    readFile filename >>= mapM_ printXML . runFilter f . parseXML++-- EOF --
+ hxml-0.2/XMLParse.hs view
@@ -0,0 +1,278 @@+{-# OPTIONS -fno-warn-missing-signatures #-}+----------------------------------------------------------------------------+--+-- Module	: XMLParse+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: XMLParse.hs,v 1.9 2002/10/12 01:58:59 joe Exp $+--+----------------------------------------------------------------------------+--+-- started 23 Jan 2000+--+-- TODO: expand parameter entity references in DTD and parameter literals+-- TODO: implement marked sections in DTD+--++module XMLParse+    ( XMLEvent(..)+    , parseInstance, parseDTD, parseDocument+    ) where++import XMLScanner+import LLParsing+import XML+import DTD+import Misc+import List(unfoldr)++parseInstance :: String -> [XMLEvent]++newtype UNPARSED = UNPARSED String	-- Unparsed literal+	deriving Show++replaceGERefs (UNPARSED s) = expandReferences DTD.predefinedEntities s+replacePERefs (UNPARSED s) = s		-- %%% FIX+attributeValueLiteral 	=   replaceGERefs <$> pLiteral+parameterLiteral 	=   replacePERefs <$> pLiteral+systemLiteral 		=   unparsed <$> pLiteral+			    where unparsed (UNPARSED s) = s++-- External interface:++data XMLEvent =+      StartEvent Name [(Name,String)]	-- start-tag (gi, attspecs)+    | EmptyEvent Name [(Name,String)]	-- empty element tag (gi,attspecs)+    | EndEvent   Name			-- end-tag (gi)+    | TextEvent	 String			-- character data (text)+    | PIEvent	 Name String		-- processing instruction (tgt value)+    | GERefEvent Name			-- general entity reference (ename)+    | CommentEvent String		-- comment+    | ErrorEvent String			-- error report+    	deriving (Read,Show)++-- Too strict: parseInstance = fmap fst . pRun (pList instanceItem) . pcdataMode+parseInstance = unfoldr (pRun instanceItem) . pcdataMode+parseDTD = foldl (\a b->b a) emptyDTD . unfoldr (pRun dtdItem) . markupMode++parseDocument text = +    case pRun prolog (pcdataMode text) of+    	Just (_, rest)	-> unfoldr (pRun instanceItem) rest+	Nothing		-> [ErrorEvent "Error parsing prolog"]	-- can't happen.++-- Interface to scanner:++pDelim d 	= pTest (==d)+pKeyword kw	= pTest  (\d->case d of NAME n    -> n == kw; _ -> False)+rniName  kw	= pTest  (\d->case d of RNINAME n -> n == kw; _ -> False)+pName		= pCheck (\d->case d of NAME n    -> Just n ; _ -> Nothing)+pGEREF 		= pCheck (\d->case d of GEREF n   -> Just n ; _ -> Nothing)+pPEREF 		= pCheck (\d->case d of PEREF n   -> Just n ; _ -> Nothing)+pLiteral	= pCheck literal where+		  literal (LITERAL s)	= Just (UNPARSED s)+		  literal _		= Nothing+pCDATA		= pCheck cdata where+		  cdata (CDATA txt)	= Just txt+		  cdata (WS ws)		= Just ws+		  cdata _		= Nothing++-- Main grammar:++-- dtdItem :: Parser Delimiter (DTD -> DTD)+dtdItem =+	dtdDeclaration+    <|> const id <$> processingInstruction	-- %%% REPORT THESE+    <|> const id <$> sgmlCommentDeclaration+    <|> const id <$> pPEREF			-- %%% FIX++dtdDeclaration =+    pDelim MDO *> (+	    pKeyword "ELEMENT"  *> elementDeclaration+	<|> pKeyword "ATTLIST"  *> attlistDeclaration+	<|> pKeyword "ENTITY"   *> entityDeclaration+	<|> pKeyword "NOTATION" *> notationDeclaration+    ) <* pDelim MDC++prolog =+    pair <$> (ws *> pMaybe xmlDeclaration) <*> (ws *> pMaybe doctypeDeclaration)++ws = () <$ pList (pTest (\d -> case d of WS _ -> True ; _ -> False))++xmlDeclaration = processingInstruction++doctypeDeclaration = +	pDelim MDO *> pKeyword "DOCTYPE" *> doctype <* pDelim MDC+doctype =+	() <$ pName <* externalIdentifier {-pMaybe internalSubset-}++--+-- Common constructs:+--++elementNames =+	wrap <$> pName <|> nameGroup+nameGroup =+    (:) <$ pDelim GRPO <*> pName <*>+	   (    (:) <$ pDelim SEQ <*> pName <*> pList (pDelim SEQ *> pName)+	    <|> (:) <$ pDelim OR  <*> pName <*> pList (pDelim OR  *> pName)+	    <|> (:) <$ pDelim AND <*> pName <*> pList (pDelim AND *> pName)+	    <|> pSucceed []+	   ) <* pDelim GRPC++externalIdentifier =+	pair Nothing+		<$  pKeyword "SYSTEM" <*> pMaybe systemLiteral+    <|> pair	<$  pKeyword "PUBLIC"+		<*> (Just <$> systemLiteral) <*> pMaybe systemLiteral+    <|> pSucceed (Nothing,Nothing)	-- implicit identifier++-- This works for XML:+xmlCommentDeclaration =+    pDelim MDOCOM *> pcdata <* pDelim COM <* pDelim MDC+    where pcdata = pFoldr (++) [] pCDATA++-- This works for SGML:+sgmlCommentDeclaration =+    (++) <$ pDelim MDOCOM <*> (pcdata <* pDelim COM) <*> comments <* pDelim MDC+    where pcdata   = pFoldr (++) [] pCDATA+	  comments = pFoldr (++) [] (pDelim COM *> pcdata <* pDelim COM)++processingInstruction =+    makePI . concat <$ pDelim PIO <*> pList pCDATA <* pDelim PIC where +	makePI string =+	    let (pitgt, rest)	= span isNMCHAR string+		pival 		= dropWhile isSEPCHAR rest+	    in (pitgt,pival)++--+-- Instance items:+--++instanceItem =+    	pTag+    <|> TextEvent		<$> pCDATA	 -- also: WSEvent+    <|> GERefEvent		<$> pGEREF+    <|> uncurry PIEvent		<$> processingInstruction+    <|> CommentEvent 		<$> xmlCommentDeclaration++pTag =+	startEvent <$ pDelim STAGO <*> pName <*> attributes <*> tagc+    <|> EndEvent   <$ pDelim ETAGO <*> pName                <*  pDelim TAGC+    where+	attributes = pList (pName <* pDelim VI <^> attributeValue)+	tagc = StartEvent <$ pDelim TAGC +	   <|> EmptyEvent <$ pDelim EETAGC+    	startEvent name atts closing = closing name atts++attributeValue =	-- XML: attributeValueLiteral only+	attributeValueLiteral <|> pName++--+-- <!ELEMENT ...> declarations+--+elementDeclaration =+    declareElements+    <$> elementNames <*> omissibility <*> contentDefinition <*> exceptions+    where+	omissibility =+	    (pair <$> dashoro <*> dashoro) <?> (False,False)+	dashoro =+	    (True <$ pKeyword "O" <|> False <$ pDelim MINUS)+	exceptions =	-- NOTE ambiguity+	    pair <$> (pDelim MINUS *> nameGroup <?> [])+		 <*> (pDelim PLUS  *> nameGroup <?> [])++contentDefinition = -- in SGML: "declared content-or-content-model-w/oexc"+	DC_EMPTY	<$  pKeyword "EMPTY"+    <|> DC_ANY		<$  pKeyword "ANY"+    <|> DC_MODELGRP	<$> contentModel++contentModel =+    (     Prim . ELEMENT <$> pName+      <|> Prim PCDATA    <$  rniName "#PCDATA"+      <|> pDelim GRPO *> contentModel <**>+	    (     mk Seq <$> pSome (pDelim SEQ *> contentModel)+	      <|> mk And <$> pSome (pDelim AND *> contentModel)+	      <|> mk Or  <$> pSome (pDelim OR  *> contentModel)+	      <|> pSucceed id ) <* pDelim GRPC+    ) <**> occurrenceIndicator+	where mk f l a = f (a:l)++occurrenceIndicator =+	Plus <$ pDelim PLUS+    <|> Rep  <$ pDelim REP+    <|> Opt  <$ pDelim OPT+    <|> pSucceed id++--+-- <!ATTLIST ...> declarations:+--+-- Also need: <!ATTLIST #NOTATION ... > , <!ATTLIST #ANY ...>+--+attlistDeclaration =+    declareAttlist <$> elementNames <*> pList attributeDefinition++attributeDefinition =+    ATTDEF <$> pName <*> declaredValue <*> defaultValue+declaredValue =+	ATcdata		<$  pKeyword "CDATA"+    <|> ATid    	<$  pKeyword "ID"+    <|> ATidref 	<$  pKeyword "IDREF"+    <|> ATidrefs	<$  pKeyword "IDREFS"+    <|> ATentity	<$  pKeyword "ENTITY"+    <|> ATentities	<$  pKeyword "ENTITIES"+    <|> ATnmtoken	<$  pKeyword "NMTOKEN"+    <|> ATnmtokens	<$  pKeyword "NMTOKENS"+    <|> ATnotation	<$  pKeyword "NOTATION" <*> nameGroup+    <|> ATenumerated	<$> nameGroup+    -- SGML only: (NB: currently ignore distinction between these)+    <|> ATnmtoken	<$  pKeyword "NAME"+    <|> ATnmtoken	<$  pKeyword "NUMBER"+    <|> ATnmtoken	<$  pKeyword "NUTOKEN"+    <|> ATnmtokens 	<$  pKeyword "NAMES"+    <|> ATnmtokens 	<$  pKeyword "NUMBERS"+    <|> ATnmtokens 	<$  pKeyword "NUTOKENS"+defaultValue =		-- SGML: also #CURRENT, #CONREF+	ADVimplied	<$  rniName "#IMPLIED"+    <|> ADVrequired	<$  rniName "#REQUIRED"+    <|> ADVfixed	<$  rniName "#FIXED" <*> attributeValue+    <|> ADVdefault	<$> attributeValue+    -- SGML only:+    <|> ADVcurrent	<$  rniName "#CURRENT"+    <|> ADVconref	<$  rniName "#CONREF"++-- Entity declarations:+-- %%% In SGML grammar there are a few more restrictions++entityDeclaration =+	declareParameterEntity <$  pDelim PERO <*> pName <*> entityText+    <|> declareGeneralEntity   <$>                 pName <*> entityText++-- @@@ Discards entity type, DCN, and data attributes+entityText =+	EN_INTERNAL <$> parameterLiteral+    <|> EN_EXTERNAL <$> externalIdentifier <* entityType where+	entityType =+		ETsubdoc <$  pKeyword "SUBDOC"+	    <|> csndata <* pName <* dataAttributes+	dataAttributes =+		pDelim DSO+	     *> pList (pair <$> pName <* pDelim VI <*> attributeValue)+	    <* pDelim DSC+	csndata = +		ETcdata 	<$  pKeyword "CDATA" +	    <|> ETsdata 	<$  pKeyword "SDATA"+	    <|> ETndata 	<$  pKeyword "NDATA"++notationDeclaration =+	declareNotation <$> pName <*> externalIdentifier++-- SGML: also need SHORTREF, USEMAP(1) in DTDs;+-- LINKTYPE in prolog; USEMAP(2), USELINK in instance.++-- EOF --
+ hxml-0.2/XMLScanner.hs view
@@ -0,0 +1,269 @@+----------------------------------------------------------------------------+--+-- Module	: XMLScanner+-- Copyright	: (C) 2000-2002 Joe English.  Freely redistributable.+-- License	: "MIT-style"+--+-- Author	: Joe English <jenglish@flightlab.com>+-- Stability	: experimental+-- Portability	: portable+--+-- CVS  	: $Id: XMLScanner.hs,v 1.9 2002/10/12 01:58:59 joe Exp $+--+----------------------------------------------------------------------------+--+-- 9 Jan 2000+--++-- doesn't check as many errors as it ought to...++module XMLScanner+    ( Delimiter(..)+    , pcdataMode, markupMode+    , isNMCHAR, isSEPCHAR+    , expandReferences+    ) where++import XML		-- for "Name"+import Char++import qualified DTD++isSEPCHAR, isNMCHAR, isNMSTART :: Char -> Bool++isSEPCHAR 	= isSpace+isNMCHAR c	= isAlphaNum c || c `elem` ".-_:"	-- 2.3 prodn 4+--isNMSTART c	= isAlpha c    || c `elem` "_:"		-- 2.3 prodn 5+isNMSTART c	= isAlphaNum c || c `elem` "_:"	-- for NUTOKEN, NMTOKEN attvals++-- Utility:+--+-- doSpan pred k f g s = k (f x) (g y) where (x,y) = span pred s+--+doSpan :: (a -> Bool) -> (b -> c -> d) -> ([a] -> b) -> ([a] -> c) -> [a] -> d+doSpan pred k f g = sp f where+    sp f' [] 		= k (f' []) (g [])+    sp f' s@(c:cs)+    	| pred c 	= sp (f' . (c:)) cs+	| otherwise	= k (f' []) (g s)++drop1 :: [a] -> [a]	 -- drop1 == drop 1; safe version of tail+drop1 [] 	= []+drop1 (_:xs)	= xs++data Delimiter =+    -- character data mode:+      WS String		-- whitespace+    | CDATA String	-- character data+    | GEREF Name 	-- general entity reference+    | STAGO		-- start tag open, "<"+    | ETAGO		-- end tag open, "</"++    -- Markup mode and character data mode:+    | MDO	-- markup declaration open, "<!"+	| MDOCOM	-- MDO + COM delimiter-in-context, "<!--"+	| MDODSO	-- MDO + DSO delimiter-in-context, "<!["+    | PIO	-- processing instruction open, "<?"+    | PIC	-- processing instruction close, "?>" (">" in SGML)++    -- Errors:+    | LEXERR String	-- lexical error+    | REST String	-- rest of input++    -- Markup mode:+    | NAME Name 	-- name+    | RNINAME Name	-- name prefixed with RNI (#)+    | PEREF Name	-- parameter entity reference+    | LITERAL String	-- attribute value literal or parameter literal++    | TAGC	-- tag close, ">"+    | VI	-- value indicator, "="+    | EETAGC	-- empty element tag close (XML), "/>"++    | MDC	-- markup declaration close, ">"+    | DSO	-- declaration subset open,  "["+    | DSC	-- declaration subset close, "]"+    | MSC	-- DSC+MDC, delimiter-in-context, "]]>"+    | COM	-- comment, "--"+    | GRPO	-- group open, "("+    | GRPC	-- group close, ")"+    | AND	-- and connector, "&"+    | OR	-- or connector, "|"+    | SEQ	-- seq connector, ","+    | OPT	-- opt occurrence indicator, "?"+    | REP	-- rep occurrence indicator, "*"+    | PLUS	-- plus occurrence indicator, inclusion, "+"+    | MINUS	-- exclusion, omission flag, "-"+    | PERO	-- parameter entity reference open, "%"+    -- ALSO:+    -- Shortref	-- short reference string (SGML only)+    -- NET		-- null end-tag (SGML only)+    -- RNI	-- reserved name indicator, "#"+    -- LIT	-- literal, """+    -- LITA	-- alternative literal, "'"+    -- CRO	-- character reference open, "&#"+    -- HCRO	-- hex character reference open, "&#X" (new in XML)+    -- ERO	-- entity reference open, "&"+    -- REFC	-- reference close, ";"+  deriving (Eq, Show)++pcdataMode, tagMode, markupMode :: String -> [Delimiter]++-- [STAGO, ETAGO, NET, CRO, ERO, MDO, MDOCOM, MDODSO, PIO, MSC]+pcdataMode [] = []+pcdataMode ('<':s) = case s of+    '!':'-':'-':r	-> MDOCOM : comMode pcdataMode r+    '!':'[':r		-> {- MDODSO : -} msMode r+    '!':r 		-> MDO : markupMode r+    '/':r		-> ETAGO : tagMode r+    '?':r		-> PIO : piMode pcdataMode r+    ']':']':'>':r	-> MSC : pcdataMode r+    r			-> STAGO : tagMode r+pcdataMode ('&':'#':s) = doSpan (';'/=) (:) mkCREF (pcdataMode . drop1) s+	where mkCREF = CDATA . return . chr . stringToInt 10+pcdataMode ('&':s) =+	case span isNMCHAR s of+	    (ename,';':r)	-> GEREF ename : pcdataMode r+	    (junk,r)		-> LEXERR ("Bad entity reference " ++ junk)+				    : pcdataMode r+pcdataMode ('>':r) = LEXERR "Warning: %%% SKIPPING UNESCAPED '>'":pcdataMode r+pcdataMode (c:s)+    | isSEPCHAR c = doSpan isSEPCHAR  (:) (WS . (c:)) pcdataMode s+    | otherwise	  = doSpan isDATACHAR (:) (CDATA . (c:)) pcdataMode s+		    where  isDATACHAR ch =+			      case ch of '<' -> False; '&' ->False; _ -> True++tagMode []		= []+tagMode ('/':'>':r) 	= EETAGC : pcdataMode r+tagMode ('>':r)		= TAGC   : pcdataMode r+tagMode ('=':r)  	= VI     : tagMode r+tagMode ('"':r)  	= doSpan ('"'/=)  (:) LITERAL (tagMode . drop1) r+tagMode ('\'':r) 	= doSpan ('\''/=) (:) LITERAL (tagMode . drop1) r+tagMode ('<':'/':r) 	= ETAGO  : tagMode r		-- not allowed in XML+tagMode ('<':r)     	= STAGO  : tagMode r		-- not allowed in XML+tagMode cs@(c:s)+    | isSEPCHAR c	= tagMode (dropWhile isSEPCHAR s)+    | isNMSTART c	= doSpan isNMCHAR (:) NAME tagMode cs+    | otherwise		= LEXERR [c] : tagMode s+++-- [ERO, CRO, HCRO]+expandReferences :: DTD.EntityMap -> String -> String+expandReferences entities = expand where+    expand s = case s of+	[]		-> []+	'&':'#':'X':r	-> doCharRef 16 expand r+	'&':'#':r	-> doCharRef 10 expand r+	'&':r		-> doEntityRef entities expand r+	x:r		-> x : expand r++doCharRef :: Int -> (String -> String) -> [Char] -> [Char]+doCharRef base k = doSpan (';'/=) (:) (chr . stringToInt base) (k . drop1)+stringToInt :: Int -> String -> Int+stringToInt base = foldl digit 0 . map digitToInt+    where digit num next = base*num + next++-- @@@ This is not quite right: should rescan the replacement text.+doEntityRef :: DTD.EntityMap -> (String -> String) -> String -> String+doEntityRef entities k r = doSpan (';'/=) (++) replacement (k . drop1) r where+    replacement ename = case DTD.expandInternalEntity entities ename of+	    Just s 	-> s+	    _		-> error ("entity " ++ ename ++ " not defined")++-- [...]+markupMode []	= []+markupMode ('%':s)	= case span isNMCHAR s of+	([], ' ':r)	-> PERO : markupMode r	-- %%% Not Quite Right+	(ename,';':r)	-> PEREF ename : markupMode r+	(ename,r)	-> LEXERR ("Bad parameter entity reference %" ++ ename)+				: markupMode r+markupMode ('-':'-':r) 	= eatComment r+markupMode ('>':r)  	= MDC : markupMode r	-- %%% or pcdataMode?+markupMode ('"':r)  	= doSpan ('"'/=)  (:) LITERAL (markupMode . drop1) r+markupMode ('\'':r) 	= doSpan ('\''/=) (:) LITERAL (markupMode . drop1) r+markupMode ('#':r)	= doSpan isNMCHAR (:) (RNINAME . ('#':)) markupMode r+markupMode ('<':'!':'-':'-':r)+			= MDOCOM : comMode markupMode r+markupMode ('<':'!':r)	= MDO : markupMode r+markupMode ('<':'?':r)	= PIO : piMode markupMode r+markupMode s@('<':_)	= pcdataMode s	-- %%% Not strictly correct, but+					-- %%% needed to parse the prolog.+markupMode cs@(c:s)+    | isSEPCHAR c	= markupMode (dropWhile isSEPCHAR s)+    | isNMSTART c	= doSpan isNMCHAR (:) NAME markupMode cs+    | otherwise = (case c of+	'&'	-> AND+	'|'	-> OR+	','	-> SEQ+	'?'	-> OPT+	'*'	-> REP+	'+'	-> PLUS+	'-'	-> MINUS+	'['	-> DSO+	']'	-> DSC+	'('	-> GRPO+	')'	-> GRPC+	_	-> LEXERR [c]) : markupMode s++--+-- Internal recognition modes:+--++msMode, cdataMode, eatComment :: String -> [Delimiter]++piMode, comMode, cdMode :: (String -> [Delimiter]) -> String -> [Delimiter]++--+-- msMode: marked section in instance. +-- @@@ Only supports XML instance syntax (<![CDATA[ ... ]]>);+-- In SGML (and XML DTDs), parameter entity references and whitespace+-- are also allowed, in addition to INCLUDE and IGNORE keywords.+-- 'cdataMode' checks for nested occurrences of <![. this is not+-- an error according to the XML or SGML specs, but it ought to be.+-- ++msMode ('C':'D':'A':'T':'A':'[':rest) = cdataMode rest+msMode s = +    let (ms, rest) = span ('['/=) s+    in LEXERR ("Illegal marked section ["++ms) : pcdataMode (drop1 rest)++cdataMode (']':']':'>':rest) = pcdataMode rest+cdataMode ('<':'!':'[':rest) = error "Nested <![ in marked section"+cdataMode [] = []+cdataMode (c:cs) = doSpan spn (:) (CDATA . (c:)) cdataMode cs where+	spn '\n' = False+	spn ']'  = False+	spn '<'  = False+	spn _    = True++--+-- comMode (inside comments):  [COM]+--+comMode prevMode cs = case cs of+    []		-> []+    '-':'-':r	-> COM : cdMode prevMode r+    (c:s)	-> doSpan brk (:) (CDATA . (c:)) (comMode prevMode) s where+    			brk '-' = False+			brk '\n' = False -- split long comments at line breaks+			brk _ = True++-- cdMode (inside comment declarations): [COM,MDC, ignore whitespace]+cdMode prevMode cs = case cs of+    []		-> []+    '>':r	-> MDC : prevMode r+    '-':'-':r	-> COM : comMode prevMode r+    c:s 	-> if isSEPCHAR c+    	           then cdMode prevMode (dropWhile isSEPCHAR s)+		   else LEXERR [c] : cdMode prevMode s++eatComment cs = case cs of+    []		-> []+    '-':'-':r	-> markupMode r+    (_:r)	-> eatComment r++piMode prevMode cs = case cs of+    []		-> []+    '?':'>':r	-> PIC : prevMode r+    (c:s)	-> doSpan ('?'/=) (:) (CDATA . (c:)) (piMode prevMode) s++-- EOF --
+ index.html view
@@ -0,0 +1,105 @@+<html>+<head><title>HXQ: A Compiler from XQuery to Haskell</title></head>+<body>+<center>+<h1>HXQ: A Compiler from XQuery to Haskell</h1>+</center>+<p>+<h2>Description</h2>+<p>+HXQ is a fast and space-efficient translator from XQuery to+embedded Haskell code (the translation is based on GHC templates).+It takes full advantage+of Haskell's lazy evaluation to keep in memory only those parts of XML data+needed at each point of evaluation, thus performing stream-based evaluation.+This results to an implementation that is as fast and space-efficient as+any stream-based+implementation based on SAX filters or finite state machines. Furthermore,+the coding is far simpler and extensible since its based on XML trees, rather+than SAX events (both the code generator and the the XQuery parser are about 400 lines each).+For example, the XQuery below against the <a href="http://dblp.uni-trier.de/xml/">DBLP XML database</a>+(420MB) runs in 1.5 minutes on my laptop.+My high-performance Java implementation of XQuery, called <a href="/XQPull/">XQPull</a>,+which is stream-based (based on a StAX events), took about the same time.+<p>+<h2>Installation Instructions</h2>+<p>+If you haven't done so, install the Glasgow Haskell Compiler,+<a href="http://www.haskell.org/ghc/">ghc</a>,+and the parser generator for Haskell,+<a href="http://www.haskell.org/happy/">happy</a>.+For example, in Fedora Linux, you install both using:+<pre>+yum install ghc happy+</pre>+Then download <a href="/HXQ-0.1.tar.gz">HXQ</a> and untar it.+You can either use cabal or make to build it. Then run xquery to test drive it.+<p>+<h2>Current Status</h2>+<p>+HXQ supports most essential XQuery features, although some system functions are missing (but are easy to add).+It does not have static typechecking; it leaves all checking to Haskell. This means that it distinguishes regular predicates+from indexing at run time: if an XPath predicate returns an integer at run time, it is indexing and this index is+checked against the current node position. The most important omission is backward step axes, such as /.. (parent).+Some, but not all, parent axis steps are removed using optimization rules, all others cause a compilation error.+<p>+<h2>Use</h2>+<p>+HXQ represents XML data as rose trees:+<pre>+type Tag = String++type AttList = [(String,String)]++data XTree =  XElem Tag AttList [XTree]+           |  XText String+           |  XInt Int+           |  XFloat Float++type XSeq = [XTree]+</pre>+which basically means that one cannot implement backward navigation steps directly.+The main functions for embedding XQueries in Haskell are:+<ul>+<li> <tt>$(xe query)</tt>+<li> <tt>$(xq query)</tt>+</ul>+where <tt>query</tt> is a string value (a Haskell expression that evaluates+to a string <b>at compile-time</b>), They both translate the query into Haskell+code, which is compiled and optimized into machine code directly. The code that xe generates has type <tt>XSeq</tt> (a sequence of XML trees)+while the code that xq generates has type <tt>(IO XSeq)</tt>. If the query reads+at least one document (using doc(...)), then you should use xq since it requires+IO. To define constant XML data or a function body, it is better to use xe.+You can use the value of a Haskell variable <tt>v</tt> inside a query using+<tt>$v</tt> as long as <tt>v</tt> has type <tt>XSeq</tt>.+To use a function in a query, it should be defined in Haskell+with type <tt>(XSeq,...,XSeq) -&gt XSeq</tt>.+<p>+Here is an example of a main program:+<pre>+f(x,y) = $(xe "&lt;article&gt;&lt;first&gt;{$x}&lt;/first&gt;&lt;second&gt;{$y}&lt;/second&gt;&lt;/article&gt;")++main = do a &lt;- $(xq ("&lt;result&gt;{                                                        "+                 ++"     for $x in doc('data/dblp.xml')//inproceedings at $i           "+                 ++"     where $x/author = 'Leonidas Fegaras'                          "+                 ++"     orderby $x/year descending                                    "+                 ++"     return &lt;paper&gt;{ $i, ') ', $x/booktitle/text(),                "+                 ++"                     ': ', $x/title/text()                         "+                 ++"            }&lt;/paper&gt;                                              "+                 ++"  }&lt;/result&gt;                                                       "))+          putStrLn (show a)+          b &lt;- $(xq " f( $a/paper[10], $a/paper[8] ) ")+          putStrLn (show b)+</pre>+Another example, can be found in <a href="Main.hs">Main.hs</a>.+<p>+If you want to extend HXQ, you need to read about <a href="http://www.haskell.org/bz/thdoc.htm">Template Haskell</a>.+Use <tt>make test</tt> to do various translation tests in ghci. You can look at the+Abstract Syntax Trees and the generated code from a query by evaluating+<tt>cq query</tt>. Basically, the way you generate Haskell code is+similar to operational semantics (where [| ... |] are syntactic brackets).+</body>+<p>+<hr>+<p>+<address>Last modified: 03/18/08 by <a href="http://lambda.uta.edu/">Leonidas Fegaras</a></address>