-- UUAGC 0.9.38.6 (./src/SistemaL.ag) module SistemaL where {-# LINE 3 "./src/SistemaL.ag" #-} import Data.List {-# LINE 9 "./src/SistemaL.hs" #-} {-# LINE 69 "./src/SistemaL.ag" #-} addIdentProds prods alfa = let prods' = map (\(Simbolo e,_) -> e) prods resto = alfa \\ prods' iprods = map (\e -> (Simbolo e, [Simbolo e])) resto in prods ++ iprods myElem _ [] = False myElem e1 ((Simbolo e2,_):xs) = if e1 == e2 then True else myElem e1 xs {-# LINE 23 "./src/SistemaL.hs" #-} {-# LINE 125 "./src/SistemaL.ag" #-} ejemplo1 = SistemaL "Koch" alfaK initK prodK alfaK = [Simbolo "F", Simbolo "f", Simbolo "+", Simbolo "-"] initK = [Simbolo "F", Simbolo "a"] prodK = [ (Simbolo "F", [Simbolo "F", Simbolo "g"]) , (Simbolo "F", []) ] ejemplo2 = SistemaL "Koch" alfaK2 initK2 prodK2 alfaK2 = [Simbolo "F", Simbolo "f", Simbolo "+", Simbolo "-"] initK2 = [Simbolo "F", Simbolo "f"] prodK2 = [ (Simbolo "F", [Simbolo "F", Simbolo "+"]) , (Simbolo "f", []) ] getNombre (SistemaL nm _ _ _) = nm testSistemaL :: SistemaL -> Either [String] SistemaL testSistemaL = sem_SistemaL {-# LINE 45 "./src/SistemaL.hs" #-} -- Alfabeto ---------------------------------------------------- type Alfabeto = [Simbolo ] -- cata sem_Alfabeto :: Alfabeto -> T_Alfabeto sem_Alfabeto list = (Prelude.foldr sem_Alfabeto_Cons sem_Alfabeto_Nil (Prelude.map sem_Simbolo list) ) -- semantic domain type T_Alfabeto = ([String]) -> ( ([String]),([String]),Alfabeto ) sem_Alfabeto_Cons :: T_Simbolo -> T_Alfabeto -> T_Alfabeto sem_Alfabeto_Cons hd_ tl_ = (\ _lhsIalf -> (let _tlOalf :: ([String]) _lhsOalf :: ([String]) _lhsOerrores :: ([String]) _lhsOself :: Alfabeto _hdIself :: Simbolo _hdIsimb :: String _tlIalf :: ([String]) _tlIerrores :: ([String]) _tlIself :: Alfabeto _verificar = ({-# LINE 31 "./src/SistemaL.ag" #-} elem _hdIsimb _lhsIalf {-# LINE 73 "./src/SistemaL.hs" #-} ) _tlOalf = ({-# LINE 32 "./src/SistemaL.ag" #-} if _verificar then _lhsIalf else _hdIsimb : _lhsIalf {-# LINE 80 "./src/SistemaL.hs" #-} ) _lhsOalf = ({-# LINE 35 "./src/SistemaL.ag" #-} _tlIalf {-# LINE 85 "./src/SistemaL.hs" #-} ) _lhsOerrores = ({-# LINE 93 "./src/SistemaL.ag" #-} if _verificar then ("El simbolo: '" ++ _hdIsimb ++ "' esta repetido mas de una ves en el alfabeto.") : _tlIerrores else _tlIerrores {-# LINE 92 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} (:) _hdIself _tlIself {-# LINE 97 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 102 "./src/SistemaL.hs" #-} ) ( _hdIself,_hdIsimb) = hd_ ( _tlIalf,_tlIerrores,_tlIself) = tl_ _tlOalf in ( _lhsOalf,_lhsOerrores,_lhsOself))) sem_Alfabeto_Nil :: T_Alfabeto sem_Alfabeto_Nil = (\ _lhsIalf -> (let _lhsOalf :: ([String]) _lhsOerrores :: ([String]) _lhsOself :: Alfabeto _lhsOalf = ({-# LINE 36 "./src/SistemaL.ag" #-} _lhsIalf {-# LINE 118 "./src/SistemaL.hs" #-} ) _lhsOerrores = ({-# LINE 96 "./src/SistemaL.ag" #-} [] {-# LINE 123 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} [] {-# LINE 128 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 133 "./src/SistemaL.hs" #-} ) in ( _lhsOalf,_lhsOerrores,_lhsOself))) -- Inicio ------------------------------------------------------ type Inicio = [Simbolo ] -- cata sem_Inicio :: Inicio -> T_Inicio sem_Inicio list = (Prelude.foldr sem_Inicio_Cons sem_Inicio_Nil (Prelude.map sem_Simbolo list) ) -- semantic domain type T_Inicio = ([String]) -> ( ([String]),Inicio ) sem_Inicio_Cons :: T_Simbolo -> T_Inicio -> T_Inicio sem_Inicio_Cons hd_ tl_ = (\ _lhsIalfabeto -> (let _lhsOerrores :: ([String]) _lhsOself :: Inicio _tlOalfabeto :: ([String]) _hdIself :: Simbolo _hdIsimb :: String _tlIerrores :: ([String]) _tlIself :: Inicio _lhsOerrores = ({-# LINE 99 "./src/SistemaL.ag" #-} if elem _hdIsimb _lhsIalfabeto then _tlIerrores else ("El simbolo de inicio: '" ++ _hdIsimb ++ "' no se encuentra en el alfabeto.") : _tlIerrores {-# LINE 163 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} (:) _hdIself _tlIself {-# LINE 168 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 173 "./src/SistemaL.hs" #-} ) _tlOalfabeto = ({-# LINE 39 "./src/SistemaL.ag" #-} _lhsIalfabeto {-# LINE 178 "./src/SistemaL.hs" #-} ) ( _hdIself,_hdIsimb) = hd_ ( _tlIerrores,_tlIself) = tl_ _tlOalfabeto in ( _lhsOerrores,_lhsOself))) sem_Inicio_Nil :: T_Inicio sem_Inicio_Nil = (\ _lhsIalfabeto -> (let _lhsOerrores :: ([String]) _lhsOself :: Inicio _lhsOerrores = ({-# LINE 102 "./src/SistemaL.ag" #-} [] {-# LINE 193 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} [] {-# LINE 198 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 203 "./src/SistemaL.hs" #-} ) in ( _lhsOerrores,_lhsOself))) -- Produccion -------------------------------------------------- type Produccion = ( Simbolo ,Succesor ) -- cata sem_Produccion :: Produccion -> T_Produccion sem_Produccion ( x1,x2) = (sem_Produccion_Tuple (sem_Simbolo x1 ) (sem_Succesor x2 ) ) -- semantic domain type T_Produccion = ([String]) -> ( ([String]),Produccion ,String) sem_Produccion_Tuple :: T_Simbolo -> T_Succesor -> T_Produccion sem_Produccion_Tuple x1_ x2_ = (\ _lhsIalfabeto -> (let _lhsOerrores :: ([String]) _lhsOself :: Produccion _lhsOsimb :: String _x2Oalfabeto :: ([String]) _x1Iself :: Simbolo _x1Isimb :: String _x2Ierrores :: ([String]) _x2Iself :: Succesor _lhsOerrores = ({-# LINE 114 "./src/SistemaL.ag" #-} if elem _x1Isimb _lhsIalfabeto then _x2Ierrores else ("El simbolo de la produccion (izq): '" ++ _x1Isimb ++ "' no se encuentra en el alfabeto.") : _x2Ierrores {-# LINE 234 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} (_x1Iself,_x2Iself) {-# LINE 239 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 244 "./src/SistemaL.hs" #-} ) _lhsOsimb = ({-# LINE 45 "./src/SistemaL.ag" #-} _x1Isimb {-# LINE 249 "./src/SistemaL.hs" #-} ) _x2Oalfabeto = ({-# LINE 39 "./src/SistemaL.ag" #-} _lhsIalfabeto {-# LINE 254 "./src/SistemaL.hs" #-} ) ( _x1Iself,_x1Isimb) = x1_ ( _x2Ierrores,_x2Iself) = x2_ _x2Oalfabeto in ( _lhsOerrores,_lhsOself,_lhsOsimb))) -- Producciones ------------------------------------------------ type Producciones = [Produccion ] -- cata sem_Producciones :: Producciones -> T_Producciones sem_Producciones list = (Prelude.foldr sem_Producciones_Cons sem_Producciones_Nil (Prelude.map sem_Produccion list) ) -- semantic domain type T_Producciones = ([String]) -> Producciones -> ( ([String]),Producciones) sem_Producciones_Cons :: T_Produccion -> T_Producciones -> T_Producciones sem_Producciones_Cons hd_ tl_ = (\ _lhsIalfabeto _lhsIprods -> (let _tlOprods :: Producciones _lhsOprods :: Producciones _lhsOerrores :: ([String]) _hdOalfabeto :: ([String]) _tlOalfabeto :: ([String]) _hdIerrores :: ([String]) _hdIself :: Produccion _hdIsimb :: String _tlIerrores :: ([String]) _tlIprods :: Producciones _verificar = ({-# LINE 60 "./src/SistemaL.ag" #-} myElem _hdIsimb _lhsIprods {-# LINE 291 "./src/SistemaL.hs" #-} ) _tlOprods = ({-# LINE 61 "./src/SistemaL.ag" #-} if _verificar then _lhsIprods else _hdIself : _lhsIprods {-# LINE 298 "./src/SistemaL.hs" #-} ) _lhsOprods = ({-# LINE 64 "./src/SistemaL.ag" #-} _tlIprods {-# LINE 303 "./src/SistemaL.hs" #-} ) _lhsOerrores = ({-# LINE 105 "./src/SistemaL.ag" #-} if _verificar then let error = "La produccion con el simb. izq.:'" ++ _hdIsimb ++ "' esta repetida mas de una ves en la lista de producciones." in (error : _hdIerrores) ++ _tlIerrores else _hdIerrores ++ _tlIerrores {-# LINE 313 "./src/SistemaL.hs" #-} ) _hdOalfabeto = ({-# LINE 39 "./src/SistemaL.ag" #-} _lhsIalfabeto {-# LINE 318 "./src/SistemaL.hs" #-} ) _tlOalfabeto = ({-# LINE 39 "./src/SistemaL.ag" #-} _lhsIalfabeto {-# LINE 323 "./src/SistemaL.hs" #-} ) ( _hdIerrores,_hdIself,_hdIsimb) = hd_ _hdOalfabeto ( _tlIerrores,_tlIprods) = tl_ _tlOalfabeto _tlOprods in ( _lhsOerrores,_lhsOprods))) sem_Producciones_Nil :: T_Producciones sem_Producciones_Nil = (\ _lhsIalfabeto _lhsIprods -> (let _lhsOerrores :: ([String]) _lhsOprods :: Producciones _lhsOerrores = ({-# LINE 111 "./src/SistemaL.ag" #-} [] {-# LINE 339 "./src/SistemaL.hs" #-} ) _lhsOprods = ({-# LINE 58 "./src/SistemaL.ag" #-} _lhsIprods {-# LINE 344 "./src/SistemaL.hs" #-} ) in ( _lhsOerrores,_lhsOprods))) -- Simbolo ----------------------------------------------------- data Simbolo = Simbolo (String) deriving ( Eq,Show) -- cata sem_Simbolo :: Simbolo -> T_Simbolo sem_Simbolo (Simbolo _string ) = (sem_Simbolo_Simbolo _string ) -- semantic domain type T_Simbolo = ( Simbolo ,String) sem_Simbolo_Simbolo :: String -> T_Simbolo sem_Simbolo_Simbolo string_ = (let _lhsOsimb :: String _lhsOself :: Simbolo _lhsOsimb = ({-# LINE 47 "./src/SistemaL.ag" #-} string_ {-# LINE 365 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} Simbolo string_ {-# LINE 370 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 375 "./src/SistemaL.hs" #-} ) in ( _lhsOself,_lhsOsimb)) -- SistemaL ---------------------------------------------------- data SistemaL = SistemaL (String) (Alfabeto ) (Inicio ) (Producciones ) deriving ( Show) -- cata sem_SistemaL :: SistemaL -> T_SistemaL sem_SistemaL (SistemaL _nombre _alfabeto _inicio _producciones ) = (sem_SistemaL_SistemaL _nombre (sem_Alfabeto _alfabeto ) (sem_Inicio _inicio ) (sem_Producciones _producciones ) ) -- semantic domain type T_SistemaL = ( (Either [String] SistemaL)) sem_SistemaL_SistemaL :: String -> T_Alfabeto -> T_Inicio -> T_Producciones -> T_SistemaL sem_SistemaL_SistemaL nombre_ alfabeto_ inicio_ producciones_ = (let _alfabetoOalf :: ([String]) _inicioOalfabeto :: ([String]) _produccionesOalfabeto :: ([String]) _lhsOresultado :: (Either [String] SistemaL) _produccionesOprods :: Producciones _alfabetoIalf :: ([String]) _alfabetoIerrores :: ([String]) _alfabetoIself :: Alfabeto _inicioIerrores :: ([String]) _inicioIself :: Inicio _produccionesIerrores :: ([String]) _produccionesIprods :: Producciones _alfabetoOalf = ({-# LINE 28 "./src/SistemaL.ag" #-} [] {-# LINE 409 "./src/SistemaL.hs" #-} ) _inicioOalfabeto = ({-# LINE 41 "./src/SistemaL.ag" #-} _alfabetoIalf {-# LINE 414 "./src/SistemaL.hs" #-} ) _produccionesOalfabeto = ({-# LINE 42 "./src/SistemaL.ag" #-} _alfabetoIalf {-# LINE 419 "./src/SistemaL.hs" #-} ) _lhsOresultado = ({-# LINE 52 "./src/SistemaL.ag" #-} if null _errores then let producciones = addIdentProds _produccionesIprods _alfabetoIalf in Right (SistemaL nombre_ _alfabetoIself _inicioIself producciones) else Left _errores {-# LINE 427 "./src/SistemaL.hs" #-} ) _produccionesOprods = ({-# LINE 67 "./src/SistemaL.ag" #-} [] {-# LINE 432 "./src/SistemaL.hs" #-} ) _errores = ({-# LINE 85 "./src/SistemaL.ag" #-} let inicioErr = if null _inicioIself then "La lista de simbolos de inicio no puede ser vacia" : _inicioIerrores else _inicioIerrores errores = map (\err -> nombre_ ++ ": " ++ err) (_alfabetoIerrores ++ inicioErr ++ _produccionesIerrores) in errores {-# LINE 441 "./src/SistemaL.hs" #-} ) ( _alfabetoIalf,_alfabetoIerrores,_alfabetoIself) = alfabeto_ _alfabetoOalf ( _inicioIerrores,_inicioIself) = inicio_ _inicioOalfabeto ( _produccionesIerrores,_produccionesIprods) = producciones_ _produccionesOalfabeto _produccionesOprods in ( _lhsOresultado)) -- Succesor ---------------------------------------------------- type Succesor = [Simbolo ] -- cata sem_Succesor :: Succesor -> T_Succesor sem_Succesor list = (Prelude.foldr sem_Succesor_Cons sem_Succesor_Nil (Prelude.map sem_Simbolo list) ) -- semantic domain type T_Succesor = ([String]) -> ( ([String]),Succesor ) sem_Succesor_Cons :: T_Simbolo -> T_Succesor -> T_Succesor sem_Succesor_Cons hd_ tl_ = (\ _lhsIalfabeto -> (let _lhsOerrores :: ([String]) _lhsOself :: Succesor _tlOalfabeto :: ([String]) _hdIself :: Simbolo _hdIsimb :: String _tlIerrores :: ([String]) _tlIself :: Succesor _lhsOerrores = ({-# LINE 119 "./src/SistemaL.ag" #-} if elem _hdIsimb _lhsIalfabeto then _tlIerrores else ("El simbolo de la produccion (der): '" ++ _hdIsimb ++ "' no se encuentra en el alfabeto.") : _tlIerrores {-# LINE 477 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} (:) _hdIself _tlIself {-# LINE 482 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 487 "./src/SistemaL.hs" #-} ) _tlOalfabeto = ({-# LINE 39 "./src/SistemaL.ag" #-} _lhsIalfabeto {-# LINE 492 "./src/SistemaL.hs" #-} ) ( _hdIself,_hdIsimb) = hd_ ( _tlIerrores,_tlIself) = tl_ _tlOalfabeto in ( _lhsOerrores,_lhsOself))) sem_Succesor_Nil :: T_Succesor sem_Succesor_Nil = (\ _lhsIalfabeto -> (let _lhsOerrores :: ([String]) _lhsOself :: Succesor _lhsOerrores = ({-# LINE 122 "./src/SistemaL.ag" #-} [] {-# LINE 507 "./src/SistemaL.hs" #-} ) _self = ({-# LINE 57 "./src/SistemaL.ag" #-} [] {-# LINE 512 "./src/SistemaL.hs" #-} ) _lhsOself = ({-# LINE 57 "./src/SistemaL.ag" #-} _self {-# LINE 517 "./src/SistemaL.hs" #-} ) in ( _lhsOerrores,_lhsOself)))