module Comando where import ParseLib import Asignaciones import Formula data Comando = Salir | Cmd2 Cmd2 Formula | Evaluar Asignacion Formula | Asignar VarAsignacion Asignacion | CmdVacio deriving Show data Cmd2 = Fnc | Fnd | Tabla deriving Show {- Gramatica: comando := 'salir' | cmd2 Formula | 'evaluar' Asignacion Formula | 'asignar' VariableAsignacion Asignacion cmd2 := 'fnc' | 'fnd' | 'tabla' -} parse1Espacio :: Parse Char [Char] parse1Espacio = neList (token ' ') -- Parse Comando comando :: Parse Char Comando comando = parseCmdVacio`alt` parseSalir `alt` parseCmd2 `alt` parseEvaluar `alt` parseAsignar parseCmdVacio :: Parse Char Comando parseCmdVacio = (succeed []) `build` \_ -> CmdVacio -- Parse Salir parseSalir :: Parse Char Comando parseSalir = (parse0Espacio >*> (token 's' >*> token 'a' >*> token 'l' >*>token 'i' >*>token 'r') >*> parse0Espacio) `build` \_ -> Salir -- Parse Cmd2 parseCmd2 :: Parse Char Comando parseCmd2 = (parse0Espacio >*>parseCmd2' >*> parse1Espacio >*> formula >*> parse0Espacio) `build` \(_,(cmd,(_,(f,_)))) -> Cmd2 cmd f parseCmd2' :: Parse Char Cmd2 parseCmd2' = parseFnc `alt` parseFnd `alt` parseTabla parseFnc :: Parse Char Cmd2 parseFnc = (token 'f' >*> token 'n' >*> token 'c') `build` \_ -> Fnc parseFnd :: Parse Char Cmd2 parseFnd = (token 'f' >*> token 'n' >*> token 'd') `build` \_ -> Fnd parseTabla:: Parse Char Cmd2 parseTabla = (token 't' >*> token 'a' >*> token 'b' >*> token 'l' >*> token 'a') `build` \_ -> Tabla -- Parse Evaluar parseEvaluar :: Parse Char Comando parseEvaluar = (parse0Espacio >*> parseEvaluar'>*> parse1Espacio >*> asignacion >*> parse1Espacio >*> formula >*> parse0Espacio) `build` \(_,(_,(_,(asign,(_,(formula,_)))))) -> Evaluar asign formula where parseEvaluar' = (token 'e' >*> token 'v' >*> token 'a' >*> token 'l' >*> token 'u' >*> token 'a' >*> token 'r') -- Parse Asignar parseAsignar :: Parse Char Comando parseAsignar = (parse0Espacio >*> parseAsignar' >*> parse1Espacio >*> parseVariableAsignacion >*> parse1Espacio >*> asignacion >*> parse0Espacio) `build` \(_,(_,(_,(var,(_,(asign,_)))))) -> Asignar var asign where parseAsignar' = (token 'a' >*> token 's' >*> token 'i' >*> token 'g' >*> token 'n' >*> token 'a' >*> token 'r') ------------------ -- el parser tiene exito si se consume todo el string parseComando :: String -> Maybe Comando parseComando cs = devuelvoComando (comando cs) devuelvoComando :: [(Comando,String)] -> Maybe Comando devuelvoComando (x:xs) | length (snd x) == 0 = Just (fst x) | otherwise = devuelvoComando xs devuelvoComando [] = Nothing getString :: Comando -> String getString Salir = "salir" getString (Cmd2 Fnc f) = "fnc" getString (Cmd2 Fnd f) = "fnd" getString (Cmd2 Tabla f) = "tabla" getString (Evaluar a f) = "evaluar" getString (Asignar va f) = "asignar" getString (CmdVacio) = "vacio" getF :: Comando -> Formula getF (Cmd2 _ f) = f getF (Evaluar _ f) = f getAsignacion :: Comando -> Asignacion getAsignacion (Evaluar a _) = a getAsignacion (Asignar _ a) = a getVarAsignacion :: Comando -> VarAsignacion getVarAsignacion (Asignar var _) = var