module Language.Elna.Parser ( Parser , programP ) where import Control.Monad (void) import Data.Text (Text) import Data.Void (Void) import Language.Elna.AST ( Statement(..) , Program(..) ) import Text.Megaparsec (Parsec) import Text.Megaparsec.Char (space1) import qualified Text.Megaparsec.Char.Lexer as Lexer type Parser = Parsec Void Text space :: Parser () space = Lexer.space space1 (Lexer.skipLineComment "//") $ Lexer.skipBlockComment "{" "}" lexeme :: forall a. Parser a -> Parser a lexeme = Lexer.lexeme space symbol :: Text -> Parser Text symbol = Lexer.symbol space beginP :: Parser () beginP = void $ symbol "begin" endP :: Parser () endP = void $ symbol "end" programP :: Parser Program programP = beginP >> endP >> symbol "." >> pure (Program mempty $ CompoundStatement mempty)