headergen-0.1.1.1: src/Headergen/Template/Parser.hs
{- |
Module : $Header$
Description : A parser for the template language.
Author : Nils 'bash0r' Jonsson
Copyright : (c) 2015 Nils 'bash0r' Jonsson
License : MIT
Maintainer : aka.bash0r@gmail.com
Stability : unstable
Portability : non-portable (Portability is untested.)
This package contains a simple parser for the templating language.
-}
module Headergen.Template.Parser
( parseTemplate
) where
import Control.Applicative
import Control.Monad
import Headergen.Template
-- | Parse a template definition.
parseTemplate :: String -> Template
parseTemplate xs = parse xs []
where
parse [] ys =
if null ys
then TemplateEOF
else TemplateSequence (TemplateText (reverse ys)) TemplateEOF
parse ('$':xs) ys =
let (zs, res) = parseVariable xs []
rest = parse zs []
in TemplateSequence (TemplateText (reverse ys)) (TemplateSequence (TemplateVariable res) rest)
parse (x :xs) ys =
parse xs (x:ys)
parseVariable [] ys = ([] , reverse ys)
parseVariable (' ' :xs) ys = (' ' :xs, reverse ys)
parseVariable ('\t':xs) ys = ('\t':xs, reverse ys)
parseVariable ('\n':xs) ys = ('\n':xs, reverse ys)
parseVariable ('\r':xs) ys = ('\r':xs, reverse ys)
parseVariable (x :xs) ys = parseVariable xs (x:ys)