{-# OPTIONS_GHC -w #-} module Language.Dot.Parser (parse , GraphType(..) , Name(..) , Stmt(..) , Subgraph(..) , Port(..) , Compass(..) ) where import HappyDot.Parser import Language.Dot.Graph import Data.Char import Control.Monad.Trans.State import qualified Debug.Trace as D import qualified Data.Array as Happy_Data_Array import qualified Data.Bits as Bits import Control.Applicative(Applicative(..)) import Control.Monad (ap) -- parser produced by Happy Version 1.19.12 data HappyAbsSyn t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 = HappyTerminal (Token) | HappyErrorToken Int | HappyAbsSyn4 t4 | HappyAbsSyn5 t5 | HappyAbsSyn6 t6 | HappyAbsSyn7 t7 | HappyAbsSyn8 t8 | HappyAbsSyn9 t9 | HappyAbsSyn10 t10 | HappyAbsSyn11 t11 | HappyAbsSyn12 t12 | HappyAbsSyn13 t13 | HappyAbsSyn14 t14 | HappyAbsSyn15 t15 | HappyAbsSyn16 t16 | HappyAbsSyn17 t17 | HappyAbsSyn18 t18 | HappyAbsSyn19 t19 | HappyAbsSyn20 t20 | HappyAbsSyn21 t21 | HappyAbsSyn22 t22 | HappyAbsSyn23 t23 | HappyAbsSyn24 t24 | HappyAbsSyn25 t25 | HappyAbsSyn26 t26 | HappyAbsSyn27 t27 happyExpList :: Happy_Data_Array.Array Int Int happyExpList = Happy_Data_Array.listArray (0,147) ([0,0,4,0,0,8,0,24576,0,0,0,0,0,0,0,0,0,96,8,0,0,0,0,0,0,0,8192,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57344,0,0,4,0,0,0,0,0,0,0,32768,1598,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,896,0,32768,16,0,0,0,0,0,384,0,0,0,0,0,0,0,0,0,0,0,16,0,0,32,0,0,0,0,0,0,0,0,0,0,0,192,16,0,0,0,0,8192,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,57344,4872,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,8,0,192,16,0,0,0,0,0,2,0,0,0,0,0,0,0,7168,513,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53248,0,0,0,0,0,0,0,0,128,0,0,0,0,0,1536,128,0,0,0,0,32768,0,0,12288,1024,0,0,0,0 ]) {-# NOINLINE happyExpListPerState #-} happyExpListPerState st = token_strs_expected where token_strs = ["error","%dummy","%start_dot","Graph","Strictness","GraphType","Name_empty","Name","Quoted_string","Quoted_sum","Stmt_list","Stmt_list_aux","Stmt_sep","Stmt","Attr_stmt","Attr_list","Attr_list_aux","A_list","Edge_stmt","EdgeRHS","Node_stmt","Node","Port","Subgraph","Xml","XmlList","XmlElement","graph","digraph","node","edge","subgraph","label","qlabel","strict","arrow","'='","'{'","'}'","'['","']'","':'","';'","','","'+'","xmlClose","xmlOpen","xmlProc","%eof"] bit_start = st * 49 bit_end = (st + 1) * 49 read_bit = readArrayBit happyExpList bits = map read_bit [bit_start..bit_end - 1] bits_indexed = zip bits [0..48] token_strs_expected = concatMap f bits_indexed f (False, _) = [] f (True, nr) = [token_strs !! nr] action_0 (35) = happyShift action_3 action_0 (4) = happyGoto action_4 action_0 (5) = happyGoto action_2 action_0 _ = happyReduce_3 action_1 (35) = happyShift action_3 action_1 (5) = happyGoto action_2 action_1 _ = happyFail (happyExpListPerState 1) action_2 (28) = happyShift action_6 action_2 (29) = happyShift action_7 action_2 (6) = happyGoto action_5 action_2 _ = happyFail (happyExpListPerState 2) action_3 _ = happyReduce_2 action_4 (49) = happyAccept action_4 _ = happyFail (happyExpListPerState 4) action_5 (33) = happyShift action_13 action_5 (34) = happyShift action_14 action_5 (47) = happyShift action_15 action_5 (7) = happyGoto action_8 action_5 (8) = happyGoto action_9 action_5 (9) = happyGoto action_10 action_5 (10) = happyGoto action_11 action_5 (25) = happyGoto action_12 action_5 _ = happyReduce_7 action_6 _ = happyReduce_4 action_7 _ = happyReduce_5 action_8 (38) = happyShift action_19 action_8 (11) = happyGoto action_18 action_8 _ = happyFail (happyExpListPerState 8) action_9 _ = happyReduce_6 action_10 _ = happyReduce_9 action_11 (45) = happyShift action_17 action_11 _ = happyReduce_11 action_12 _ = happyReduce_10 action_13 _ = happyReduce_8 action_14 _ = happyReduce_12 action_15 (26) = happyGoto action_16 action_15 _ = happyReduce_50 action_16 (46) = happyShift action_23 action_16 (47) = happyShift action_24 action_16 (48) = happyShift action_25 action_16 (27) = happyGoto action_22 action_16 _ = happyFail (happyExpListPerState 16) action_17 (34) = happyShift action_21 action_17 _ = happyFail (happyExpListPerState 17) action_18 _ = happyReduce_1 action_19 (12) = happyGoto action_20 action_19 _ = happyReduce_16 action_20 (28) = happyShift action_35 action_20 (30) = happyShift action_36 action_20 (31) = happyShift action_37 action_20 (32) = happyShift action_38 action_20 (33) = happyShift action_13 action_20 (34) = happyShift action_14 action_20 (38) = happyShift action_19 action_20 (39) = happyShift action_39 action_20 (47) = happyShift action_15 action_20 (8) = happyGoto action_27 action_20 (9) = happyGoto action_10 action_20 (10) = happyGoto action_11 action_20 (11) = happyGoto action_28 action_20 (14) = happyGoto action_29 action_20 (15) = happyGoto action_30 action_20 (19) = happyGoto action_31 action_20 (21) = happyGoto action_32 action_20 (22) = happyGoto action_33 action_20 (24) = happyGoto action_34 action_20 (25) = happyGoto action_12 action_20 _ = happyFail (happyExpListPerState 20) action_21 _ = happyReduce_13 action_22 _ = happyReduce_49 action_23 _ = happyReduce_48 action_24 (26) = happyGoto action_26 action_24 _ = happyReduce_50 action_25 _ = happyReduce_52 action_26 (46) = happyShift action_55 action_26 (47) = happyShift action_24 action_26 (48) = happyShift action_25 action_26 (27) = happyGoto action_22 action_26 _ = happyFail (happyExpListPerState 26) action_27 (37) = happyShift action_53 action_27 (42) = happyShift action_54 action_27 (23) = happyGoto action_52 action_27 _ = happyReduce_42 action_28 _ = happyReduce_47 action_29 (43) = happyShift action_50 action_29 (44) = happyShift action_51 action_29 (13) = happyGoto action_49 action_29 _ = happyReduce_19 action_30 _ = happyReduce_20 action_31 _ = happyReduce_22 action_32 _ = happyReduce_21 action_33 (36) = happyShift action_46 action_33 (16) = happyGoto action_47 action_33 (17) = happyGoto action_42 action_33 (20) = happyGoto action_48 action_33 _ = happyReduce_30 action_34 (36) = happyShift action_46 action_34 (20) = happyGoto action_45 action_34 _ = happyReduce_24 action_35 (16) = happyGoto action_44 action_35 (17) = happyGoto action_42 action_35 _ = happyReduce_30 action_36 (16) = happyGoto action_43 action_36 (17) = happyGoto action_42 action_36 _ = happyReduce_30 action_37 (16) = happyGoto action_41 action_37 (17) = happyGoto action_42 action_37 _ = happyReduce_30 action_38 (33) = happyShift action_13 action_38 (34) = happyShift action_14 action_38 (47) = happyShift action_15 action_38 (7) = happyGoto action_40 action_38 (8) = happyGoto action_9 action_38 (9) = happyGoto action_10 action_38 (10) = happyGoto action_11 action_38 (25) = happyGoto action_12 action_38 _ = happyReduce_7 action_39 _ = happyReduce_14 action_40 (38) = happyShift action_19 action_40 (11) = happyGoto action_67 action_40 _ = happyFail (happyExpListPerState 40) action_41 _ = happyReduce_26 action_42 (40) = happyShift action_66 action_42 _ = happyReduce_28 action_43 _ = happyReduce_25 action_44 _ = happyReduce_27 action_45 (36) = happyShift action_59 action_45 (16) = happyGoto action_65 action_45 (17) = happyGoto action_42 action_45 _ = happyReduce_30 action_46 (32) = happyShift action_38 action_46 (33) = happyShift action_13 action_46 (34) = happyShift action_14 action_46 (38) = happyShift action_19 action_46 (43) = happyShift action_63 action_46 (44) = happyShift action_64 action_46 (47) = happyShift action_15 action_46 (8) = happyGoto action_60 action_46 (9) = happyGoto action_10 action_46 (10) = happyGoto action_11 action_46 (11) = happyGoto action_28 action_46 (22) = happyGoto action_61 action_46 (24) = happyGoto action_62 action_46 (25) = happyGoto action_12 action_46 _ = happyFail (happyExpListPerState 46) action_47 _ = happyReduce_41 action_48 (36) = happyShift action_59 action_48 (16) = happyGoto action_58 action_48 (17) = happyGoto action_42 action_48 _ = happyReduce_30 action_49 _ = happyReduce_15 action_50 _ = happyReduce_17 action_51 _ = happyReduce_18 action_52 _ = happyReduce_43 action_53 (33) = happyShift action_13 action_53 (34) = happyShift action_14 action_53 (47) = happyShift action_15 action_53 (8) = happyGoto action_57 action_53 (9) = happyGoto action_10 action_53 (10) = happyGoto action_11 action_53 (25) = happyGoto action_12 action_53 _ = happyFail (happyExpListPerState 53) action_54 (33) = happyShift action_13 action_54 (34) = happyShift action_14 action_54 (47) = happyShift action_15 action_54 (8) = happyGoto action_56 action_54 (9) = happyGoto action_10 action_54 (10) = happyGoto action_11 action_54 (25) = happyGoto action_12 action_54 _ = happyFail (happyExpListPerState 54) action_55 _ = happyReduce_51 action_56 (42) = happyShift action_71 action_56 _ = happyReduce_44 action_57 _ = happyReduce_23 action_58 _ = happyReduce_33 action_59 (32) = happyShift action_38 action_59 (33) = happyShift action_13 action_59 (34) = happyShift action_14 action_59 (38) = happyShift action_19 action_59 (47) = happyShift action_15 action_59 (8) = happyGoto action_60 action_59 (9) = happyGoto action_10 action_59 (10) = happyGoto action_11 action_59 (11) = happyGoto action_28 action_59 (22) = happyGoto action_69 action_59 (24) = happyGoto action_70 action_59 (25) = happyGoto action_12 action_59 _ = happyFail (happyExpListPerState 59) action_60 (42) = happyShift action_54 action_60 (23) = happyGoto action_52 action_60 _ = happyReduce_42 action_61 _ = happyReduce_37 action_62 _ = happyReduce_38 action_63 _ = happyReduce_39 action_64 _ = happyReduce_40 action_65 _ = happyReduce_34 action_66 (18) = happyGoto action_68 action_66 _ = happyReduce_32 action_67 _ = happyReduce_46 action_68 (41) = happyShift action_74 action_68 (43) = happyShift action_50 action_68 (44) = happyShift action_51 action_68 (13) = happyGoto action_73 action_68 _ = happyReduce_19 action_69 _ = happyReduce_35 action_70 _ = happyReduce_36 action_71 (33) = happyShift action_72 action_71 _ = happyFail (happyExpListPerState 71) action_72 _ = happyReduce_45 action_73 (33) = happyShift action_13 action_73 (34) = happyShift action_14 action_73 (47) = happyShift action_15 action_73 (8) = happyGoto action_75 action_73 (9) = happyGoto action_10 action_73 (10) = happyGoto action_11 action_73 (25) = happyGoto action_12 action_73 _ = happyFail (happyExpListPerState 73) action_74 _ = happyReduce_29 action_75 (37) = happyShift action_76 action_75 _ = happyFail (happyExpListPerState 75) action_76 (33) = happyShift action_13 action_76 (34) = happyShift action_14 action_76 (47) = happyShift action_15 action_76 (8) = happyGoto action_77 action_76 (9) = happyGoto action_10 action_76 (10) = happyGoto action_11 action_76 (25) = happyGoto action_12 action_76 _ = happyFail (happyExpListPerState 76) action_77 _ = happyReduce_31 happyReduce_1 = happyReduce 4 4 happyReduction_1 happyReduction_1 ((HappyAbsSyn11 happy_var_4) `HappyStk` (HappyAbsSyn7 happy_var_3) `HappyStk` (HappyAbsSyn6 happy_var_2) `HappyStk` (HappyAbsSyn5 happy_var_1) `HappyStk` happyRest) = HappyAbsSyn4 ((happy_var_1, happy_var_2, happy_var_3, happy_var_4) ) `HappyStk` happyRest happyReduce_2 = happySpecReduce_1 5 happyReduction_2 happyReduction_2 _ = HappyAbsSyn5 (True ) happyReduce_3 = happySpecReduce_0 5 happyReduction_3 happyReduction_3 = HappyAbsSyn5 (False ) happyReduce_4 = happySpecReduce_1 6 happyReduction_4 happyReduction_4 _ = HappyAbsSyn6 (Graph ) happyReduce_5 = happySpecReduce_1 6 happyReduction_5 happyReduction_5 _ = HappyAbsSyn6 (Digraph ) happyReduce_6 = happySpecReduce_1 7 happyReduction_6 happyReduction_6 (HappyAbsSyn8 happy_var_1) = HappyAbsSyn7 (happy_var_1 ) happyReduction_6 _ = notHappyAtAll happyReduce_7 = happySpecReduce_0 7 happyReduction_7 happyReduction_7 = HappyAbsSyn7 (StringID "" ) happyReduce_8 = happySpecReduce_1 8 happyReduction_8 happyReduction_8 (HappyTerminal (TokenLabel happy_var_1)) = HappyAbsSyn8 (StringID happy_var_1 ) happyReduction_8 _ = notHappyAtAll happyReduce_9 = happySpecReduce_1 8 happyReduction_9 happyReduction_9 (HappyAbsSyn9 happy_var_1) = HappyAbsSyn8 (StringID happy_var_1 ) happyReduction_9 _ = notHappyAtAll happyReduce_10 = happySpecReduce_1 8 happyReduction_10 happyReduction_10 (HappyAbsSyn25 happy_var_1) = HappyAbsSyn8 (XMLID happy_var_1 ) happyReduction_10 _ = notHappyAtAll happyReduce_11 = happySpecReduce_1 9 happyReduction_11 happyReduction_11 (HappyAbsSyn10 happy_var_1) = HappyAbsSyn9 (concat $ reverse happy_var_1 ) happyReduction_11 _ = notHappyAtAll happyReduce_12 = happySpecReduce_1 10 happyReduction_12 happyReduction_12 (HappyTerminal (TokenQuotedLabel happy_var_1)) = HappyAbsSyn10 ([happy_var_1] ) happyReduction_12 _ = notHappyAtAll happyReduce_13 = happySpecReduce_3 10 happyReduction_13 happyReduction_13 (HappyTerminal (TokenQuotedLabel happy_var_3)) _ (HappyAbsSyn10 happy_var_1) = HappyAbsSyn10 (happy_var_3 : happy_var_1 ) happyReduction_13 _ _ _ = notHappyAtAll happyReduce_14 = happySpecReduce_3 11 happyReduction_14 happyReduction_14 _ (HappyAbsSyn12 happy_var_2) _ = HappyAbsSyn11 (reverse happy_var_2 ) happyReduction_14 _ _ _ = notHappyAtAll happyReduce_15 = happySpecReduce_3 12 happyReduction_15 happyReduction_15 _ (HappyAbsSyn14 happy_var_2) (HappyAbsSyn12 happy_var_1) = HappyAbsSyn12 (happy_var_2 : happy_var_1 ) happyReduction_15 _ _ _ = notHappyAtAll happyReduce_16 = happySpecReduce_0 12 happyReduction_16 happyReduction_16 = HappyAbsSyn12 ([] ) happyReduce_17 = happySpecReduce_1 13 happyReduction_17 happyReduction_17 (HappyTerminal happy_var_1) = HappyAbsSyn13 (Just happy_var_1 ) happyReduction_17 _ = notHappyAtAll happyReduce_18 = happySpecReduce_1 13 happyReduction_18 happyReduction_18 (HappyTerminal happy_var_1) = HappyAbsSyn13 (Just happy_var_1 ) happyReduction_18 _ = notHappyAtAll happyReduce_19 = happySpecReduce_0 13 happyReduction_19 happyReduction_19 = HappyAbsSyn13 (Nothing ) happyReduce_20 = happySpecReduce_1 14 happyReduction_20 happyReduction_20 (HappyAbsSyn15 happy_var_1) = HappyAbsSyn14 (happy_var_1 ) happyReduction_20 _ = notHappyAtAll happyReduce_21 = happySpecReduce_1 14 happyReduction_21 happyReduction_21 (HappyAbsSyn21 happy_var_1) = HappyAbsSyn14 (happy_var_1 ) happyReduction_21 _ = notHappyAtAll happyReduce_22 = happySpecReduce_1 14 happyReduction_22 happyReduction_22 (HappyAbsSyn19 happy_var_1) = HappyAbsSyn14 (happy_var_1 ) happyReduction_22 _ = notHappyAtAll happyReduce_23 = happySpecReduce_3 14 happyReduction_23 happyReduction_23 (HappyAbsSyn8 happy_var_3) _ (HappyAbsSyn8 happy_var_1) = HappyAbsSyn14 (AttributeStatement (show happy_var_1, show happy_var_3) ) happyReduction_23 _ _ _ = notHappyAtAll happyReduce_24 = happySpecReduce_1 14 happyReduction_24 happyReduction_24 (HappyAbsSyn24 happy_var_1) = HappyAbsSyn14 (SubgraphStatement happy_var_1 ) happyReduction_24 _ = notHappyAtAll happyReduce_25 = happySpecReduce_2 15 happyReduction_25 happyReduction_25 (HappyAbsSyn16 happy_var_2) _ = HappyAbsSyn15 (NodeAttribute happy_var_2 ) happyReduction_25 _ _ = notHappyAtAll happyReduce_26 = happySpecReduce_2 15 happyReduction_26 happyReduction_26 (HappyAbsSyn16 happy_var_2) _ = HappyAbsSyn15 (EdgeAttribute happy_var_2 ) happyReduction_26 _ _ = notHappyAtAll happyReduce_27 = happySpecReduce_2 15 happyReduction_27 happyReduction_27 (HappyAbsSyn16 happy_var_2) _ = HappyAbsSyn15 (GraphAttribute happy_var_2 ) happyReduction_27 _ _ = notHappyAtAll happyReduce_28 = happySpecReduce_1 16 happyReduction_28 happyReduction_28 (HappyAbsSyn17 happy_var_1) = HappyAbsSyn16 (reverse happy_var_1 ) happyReduction_28 _ = notHappyAtAll happyReduce_29 = happyReduce 4 17 happyReduction_29 happyReduction_29 (_ `HappyStk` (HappyAbsSyn18 happy_var_3) `HappyStk` _ `HappyStk` (HappyAbsSyn17 happy_var_1) `HappyStk` happyRest) = HappyAbsSyn17 (happy_var_3 ++ happy_var_1 ) `HappyStk` happyRest happyReduce_30 = happySpecReduce_0 17 happyReduction_30 happyReduction_30 = HappyAbsSyn17 ([] ) happyReduce_31 = happyReduce 5 18 happyReduction_31 happyReduction_31 ((HappyAbsSyn8 happy_var_5) `HappyStk` _ `HappyStk` (HappyAbsSyn8 happy_var_3) `HappyStk` _ `HappyStk` (HappyAbsSyn18 happy_var_1) `HappyStk` happyRest) = HappyAbsSyn18 (( happy_var_3, happy_var_5) : happy_var_1 ) `HappyStk` happyRest happyReduce_32 = happySpecReduce_0 18 happyReduction_32 happyReduction_32 = HappyAbsSyn18 ([] ) happyReduce_33 = happySpecReduce_3 19 happyReduction_33 happyReduction_33 (HappyAbsSyn16 happy_var_3) (HappyAbsSyn20 happy_var_2) (HappyAbsSyn22 happy_var_1) = HappyAbsSyn19 (EdgeStatement ((uncurry NodeRef happy_var_1):(reverse happy_var_2)) happy_var_3 ) happyReduction_33 _ _ _ = notHappyAtAll happyReduce_34 = happySpecReduce_3 19 happyReduction_34 happyReduction_34 (HappyAbsSyn16 happy_var_3) (HappyAbsSyn20 happy_var_2) (HappyAbsSyn24 happy_var_1) = HappyAbsSyn19 (EdgeStatement (happy_var_1:(reverse happy_var_2)) happy_var_3 ) happyReduction_34 _ _ _ = notHappyAtAll happyReduce_35 = happySpecReduce_3 20 happyReduction_35 happyReduction_35 (HappyAbsSyn22 happy_var_3) _ (HappyAbsSyn20 happy_var_1) = HappyAbsSyn20 ((uncurry NodeRef happy_var_3) : happy_var_1 ) happyReduction_35 _ _ _ = notHappyAtAll happyReduce_36 = happySpecReduce_3 20 happyReduction_36 happyReduction_36 (HappyAbsSyn24 happy_var_3) _ (HappyAbsSyn20 happy_var_1) = HappyAbsSyn20 (happy_var_3 : happy_var_1 ) happyReduction_36 _ _ _ = notHappyAtAll happyReduce_37 = happySpecReduce_2 20 happyReduction_37 happyReduction_37 (HappyAbsSyn22 happy_var_2) _ = HappyAbsSyn20 ([uncurry NodeRef happy_var_2] ) happyReduction_37 _ _ = notHappyAtAll happyReduce_38 = happySpecReduce_2 20 happyReduction_38 happyReduction_38 (HappyAbsSyn24 happy_var_2) _ = HappyAbsSyn20 ([happy_var_2] ) happyReduction_38 _ _ = notHappyAtAll happyReduce_39 = happyMonadReduce 2 20 happyReduction_39 happyReduction_39 (_ `HappyStk` _ `HappyStk` happyRest) tk = happyThen ((( getLineNumber `thenE` \line -> failE $ "Unfinished edge statement.")) ) (\r -> happyReturn (HappyAbsSyn20 r)) happyReduce_40 = happyMonadReduce 2 20 happyReduction_40 happyReduction_40 (_ `HappyStk` _ `HappyStk` happyRest) tk = happyThen ((( getLineNumber `thenE` \line -> failE $ "Unfinished edge statement.")) ) (\r -> happyReturn (HappyAbsSyn20 r)) happyReduce_41 = happySpecReduce_2 21 happyReduction_41 happyReduction_41 (HappyAbsSyn16 happy_var_2) (HappyAbsSyn22 happy_var_1) = HappyAbsSyn21 ((uncurry NodeStatement) happy_var_1 happy_var_2 ) happyReduction_41 _ _ = notHappyAtAll happyReduce_42 = happySpecReduce_1 22 happyReduction_42 happyReduction_42 (HappyAbsSyn8 happy_var_1) = HappyAbsSyn22 ((happy_var_1, Nothing) ) happyReduction_42 _ = notHappyAtAll happyReduce_43 = happySpecReduce_2 22 happyReduction_43 happyReduction_43 (HappyAbsSyn23 happy_var_2) (HappyAbsSyn8 happy_var_1) = HappyAbsSyn22 ((happy_var_1, (Just happy_var_2)) ) happyReduction_43 _ _ = notHappyAtAll happyReduce_44 = happySpecReduce_2 23 happyReduction_44 happyReduction_44 (HappyAbsSyn8 happy_var_2) _ = HappyAbsSyn23 (case toCompass $ show happy_var_2 of Just c -> Port Nothing (Just c) Nothing -> Port (if show happy_var_2 == "_" then Nothing else (Just happy_var_2)) Nothing ) happyReduction_44 _ _ = notHappyAtAll happyReduce_45 = happyReduce 4 23 happyReduction_45 happyReduction_45 ((HappyTerminal (TokenLabel happy_var_4)) `HappyStk` _ `HappyStk` (HappyAbsSyn8 happy_var_2) `HappyStk` _ `HappyStk` happyRest) = HappyAbsSyn23 (Port (Just happy_var_2) (toCompass happy_var_4) ) `HappyStk` happyRest happyReduce_46 = happySpecReduce_3 24 happyReduction_46 happyReduction_46 (HappyAbsSyn11 happy_var_3) (HappyAbsSyn7 happy_var_2) _ = HappyAbsSyn24 (Subgraph happy_var_2 happy_var_3 ) happyReduction_46 _ _ _ = notHappyAtAll happyReduce_47 = happySpecReduce_1 24 happyReduction_47 happyReduction_47 (HappyAbsSyn11 happy_var_1) = HappyAbsSyn24 (Subgraph (StringID "") happy_var_1 ) happyReduction_47 _ = notHappyAtAll happyReduce_48 = happySpecReduce_3 25 happyReduction_48 happyReduction_48 (HappyTerminal (TokenCT happy_var_3)) (HappyAbsSyn26 happy_var_2) (HappyTerminal (TokenOT happy_var_1)) = HappyAbsSyn25 (show happy_var_1 ++ (concat $ reverse happy_var_2) ++ show happy_var_3 ) happyReduction_48 _ _ _ = notHappyAtAll happyReduce_49 = happySpecReduce_2 26 happyReduction_49 happyReduction_49 (HappyAbsSyn27 happy_var_2) (HappyAbsSyn26 happy_var_1) = HappyAbsSyn26 (happy_var_2 : happy_var_1 ) happyReduction_49 _ _ = notHappyAtAll happyReduce_50 = happySpecReduce_0 26 happyReduction_50 happyReduction_50 = HappyAbsSyn26 ([] ) happyReduce_51 = happySpecReduce_3 27 happyReduction_51 happyReduction_51 (HappyTerminal (TokenCT happy_var_3)) (HappyAbsSyn26 happy_var_2) (HappyTerminal (TokenOT happy_var_1)) = HappyAbsSyn27 (show happy_var_1 ++ (concat $ reverse happy_var_2) ++ show happy_var_3 ) happyReduction_51 _ _ _ = notHappyAtAll happyReduce_52 = happySpecReduce_1 27 happyReduction_52 happyReduction_52 (HappyTerminal (TokenProc happy_var_1)) = HappyAbsSyn27 (show happy_var_1 ) happyReduction_52 _ = notHappyAtAll happyNewToken action sts stk = lexer(\tk -> let cont i = action i i tk (HappyState action) sts stk in case tk of { TokenEOF -> action 49 49 tk (HappyState action) sts stk; TokenGraph -> cont 28; TokenDigraph -> cont 29; TokenNode -> cont 30; TokenEdge -> cont 31; TokenSubgraph -> cont 32; TokenLabel happy_dollar_dollar -> cont 33; TokenQuotedLabel happy_dollar_dollar -> cont 34; TokenStrict -> cont 35; TokenArrow happy_dollar_dollar -> cont 36; TokenEQ -> cont 37; TokenOCB -> cont 38; TokenCCB -> cont 39; TokenOSB -> cont 40; TokenCSB -> cont 41; TokenCo -> cont 42; TokenSemiCo -> cont 43; TokenComma -> cont 44; TokenPlus -> cont 45; TokenCT happy_dollar_dollar -> cont 46; TokenOT happy_dollar_dollar -> cont 47; TokenProc happy_dollar_dollar -> cont 48; _ -> happyError' (tk, []) }) happyError_ explist 49 tk = happyError' (tk, explist) happyError_ explist _ tk = happyError' (tk, explist) happyThen :: () => P a -> (a -> P b) -> P b happyThen = (thenE) happyReturn :: () => a -> P a happyReturn = (returnE) happyThen1 :: () => P a -> (a -> P b) -> P b happyThen1 = happyThen happyReturn1 :: () => a -> P a happyReturn1 = happyReturn happyError' :: () => ((Token), [String]) -> P a happyError' tk = (\(tokens, _) -> parseError tokens) tk dot = happySomeParser where happySomeParser = happyThen (happyParse action_0) (\x -> case x of {HappyAbsSyn4 z -> happyReturn z; _other -> notHappyAtAll }) happySeq = happyDontSeq data Except a = Success a | Failure String type P a = String -> Int -> Except a thenE :: P a -> (a -> P b) -> P b thenE m k s l = case m s l of Success a -> k a s l Failure e -> Failure e returnE :: a -> P a returnE a s l = Success a failE :: String -> P a failE e s l = Failure $ "Error on line " ++ show l ++ ": " ++ e catchE :: P a -> (String -> P a) -> P a catchE m k s l = case m s l of Success a -> Success a Failure e -> k e s l getLineNumber s l = Success l parseError :: Token -> P a parseError t = getLineNumber `thenE` \line -> failE $ "Parse error on line " ++ show line ++ "." data Token = TokenGraph | TokenDigraph | TokenNode | TokenEdge | TokenSubgraph | TokenStrict | TokenLabel String | TokenQuotedLabel String | TokenXML String | TokenCompass Compass | TokenArrow Char | TokenEQ | TokenOCB | TokenCCB | TokenOSB | TokenCSB | TokenCo | TokenSemiCo | TokenComma | TokenCT String | TokenOT String | TokenProc String | TokenPlus | TokenEOF deriving (Eq) instance Show Token where show tk = case tk of TokenGraph -> "graph" TokenDigraph -> "digraph" TokenNode -> "node" TokenEdge -> "edge" TokenSubgraph -> "subgraph" TokenStrict -> "strict" TokenLabel label -> label TokenQuotedLabel label -> label TokenXML xml -> xml TokenCompass compass -> show compass TokenArrow c -> [c] TokenEQ -> "=" TokenOCB -> "{" TokenCCB -> "]" TokenOSB -> "[" TokenCSB -> "]" TokenCo -> ":" TokenSemiCo -> ";" TokenComma -> "," TokenCT tag -> "" TokenOT tag -> "<" ++ tag ++ ">" TokenProc xml -> "" TokenPlus -> "+" TokenEOF -> "" parse s = case dot ('\n':s) 0 of -- A newline is added to treat '#' in the beginning of a line properly. Success ast -> Right ast Failure msg -> Left msg toCompass l = case map toLower l of "n" -> Just $ North "ne" -> Just $ NorthEast "e" -> Just $ East "se" -> Just $ SouthEast "s" -> Just $ South "sw" -> Just $ SouthWest "w" -> Just $ West "nw" -> Just $ NorthWest "c" -> Just $ Center "_" -> Nothing _ -> Nothing lexer :: (Token -> (P a)) -> (P a) lexer cont str line = case dropWhile (\c -> c /= '\n' && isSpace c) str of '\n':'#':s' -> let s'' = dropWhile (/= '\n') s' in lexer cont s'' (line + 1) '\n':s' -> lexer cont s' (line +1) ',':s' -> cont TokenComma s' line ';':s' -> cont TokenSemiCo s' line 's':'u':'b':'g':'r':'a':'p':'h':s' -> cont TokenSubgraph s' line 'g':'r':'a':'p':'h':s' -> cont TokenGraph s' line 'd':'i':'g':'r':'a':'p':'h':s' -> cont TokenDigraph s' line 'e':'d':'g':'e':s' -> cont TokenEdge s' line 'n':'o':'d':'e':s' -> cont TokenNode s' line 's':'t':'r':'i':'c':'t':s' -> cont TokenStrict s' line '{':s' -> cont TokenOCB s' line '}':s' -> cont TokenCCB s' line '[':s' -> cont TokenOSB s' line ']':s' -> cont TokenCSB s' line '+':s' -> cont TokenPlus s' line '=':s' -> cont TokenEQ s' line ':':s' -> cont TokenCo s' line '-':'-':s' -> cont (TokenArrow '-') s' line '-':'>':s' -> cont (TokenArrow '>') s' line '/':'/':s' -> let s'' = dropWhile (/= '\n') s' in lexer cont s'' line '/':'*':s' -> let (s'', line') = execState consumeComment (s', line) in lexer cont s'' (line') '"':s' -> let (qs, (s'', line')) = runState consumeQuotedString (s', line) in case qs of Right string -> cont (TokenQuotedLabel string) s'' line' Left msg -> failE msg s' line' '<':'/':s' -> let (tag, (s'', line')) = runState consumeTag (s', line) in cont (TokenCT tag) (tail s'') line' '<':'!':'-':'-':s' -> let (s'', line') = execState consumeXMLComment (s', line) in lexer cont s'' line' '<':'?':s' -> let (proc, (s'', line')) = runState consumeProcessing (s', line) in cont (TokenProc proc) s'' line' [] -> cont TokenEOF [] line s' -> let (label, s'') = span (\x -> not $ isSpace x || x `elem` ";,{}[]=\"") s' in if null label then failE ("Unexpected character: " ++ [head s'']) s' line else cont (TokenLabel label) s'' line --consumeToken = do -- consumeWhile (\c -> isSpace c || c `elem` ";,") -- t <- consumeSomeString -- TODO: This can be made faster by using a trie -- [ ("subgraph", TokenSubgraph) -- , ("graph", TokenGraph) -- , ("digraph", TokenDigraph) -- , ("edge", TokenEdge) -- , ("node", TokenNode) -- , ("strict", TokenStrict) -- , ("{", TokenOCB) -- , ("}", TokenCCB) -- , ("[", TokenOSB) -- , ("]", TokenCSB) -- , ("+", TokenPlus) -- , ("=", TokenEQ) -- , (":", TokenCo) -- , ("--", TokenArrow '-') -- , ("->", TokenArrow '>')] -- case t of -- Just t' -> return t -- Nothing -> do -- action <- consumeSomeString -- [ ('/':"/", consumeWhile (/= '\n') >> consumeToken) -- , ('#', consumeWhile (/= '\n') >> consumeToken) -- , ('/':"*", consumeComment >> consumeToken) -- , ("\"", consumeQuotedString >>= (\s -> return (Just $ TokenLabel s))) -- , (" x /= '>') -- consumeOnce (=='>') -- return $ Just $ TokenCT) -- , ("