From e7083c1c4089a46d990e9fc2d86bf624518d28bf Mon Sep 17 00:00:00 2001 From: sudoer777 Date: Fri, 29 Sep 2023 22:59:25 -0500 Subject: [PATCH] Change Parser from string to text --- src/Forth/Parser.hs | 19 ++++++++++++++----- src/Forth/Types/Expr.hs | 3 ++- src/Main.hs | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Forth/Parser.hs b/src/Forth/Parser.hs index d2726c7..32247ba 100644 --- a/src/Forth/Parser.hs +++ b/src/Forth/Parser.hs @@ -1,22 +1,24 @@ -- see https://markkarpov.com/tutorial/megaparsec.html {-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE OverloadedStrings #-} module Forth.Parser (parseExpr, ParseResult) where import Control.Monad.Combinators.Expr import Data.Functor.Identity qualified +import Data.Text.Lazy import Data.Void (Void) import Forth.Types.Expr import Text.Megaparsec as MP import Text.Megaparsec.Char as C import Text.Megaparsec.Char.Lexer as L -type Parser = Parsec Void String +type Parser = Parsec Void Text lexemeParser :: Parser a -> Parser a lexemeParser = L.lexeme C.space -symbolParser :: String -> Parser String +symbolParser :: Text -> Parser Text symbolParser = L.symbol C.space intParser :: Parser Int @@ -32,18 +34,25 @@ table = ], [ binaryOp "+" Add, binaryOp "-" Sub + -- binaryOp "." Pop ] ] -binaryOp :: String -> (a -> a -> a) -> Operator (ParsecT Void String Data.Functor.Identity.Identity) a +binaryOp :: Text -> (a -> a -> a) -> Operator (ParsecT Void Text Data.Functor.Identity.Identity) a binaryOp name f = InfixL (f <$ symbolParser name) +-- prefixOp :: Text -> (a -> a) -> Operator (ParsecT Void Text Data.Functor.Identity.Identity) a +-- prefixOp name f = Prefix (f <$ symbolParser name) + +-- postfixOp :: Text -> (a -> a) -> Operator (ParsecT Void Text Data.Functor.Identity.Identity) a +-- postfixOp name f = Postfix (f <$ symbolParser name) + expr :: Parser Expr expr = makeExprParser term table -type ParseResult = Either (ParseErrorBundle String Void) Expr +type ParseResult = Either (ParseErrorBundle Text Void) Expr -parseExpr :: String -> ParseResult +parseExpr :: Text -> ParseResult parseExpr = MP.parse (C.space *> expr <* eof) "" -- parseE = parseExpr \ No newline at end of file diff --git a/src/Forth/Types/Expr.hs b/src/Forth/Types/Expr.hs index ff8741d..71dbcec 100644 --- a/src/Forth/Types/Expr.hs +++ b/src/Forth/Types/Expr.hs @@ -7,5 +7,6 @@ data Expr | Mul Expr Expr | Div Expr Expr deriving - ( Show + ( -- | Pop Expr Expr + Show ) \ No newline at end of file diff --git a/src/Main.hs b/src/Main.hs index d0795c1..4bfc1b6 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -19,7 +19,7 @@ getRight (Right r) = r main :: IO () main = do fileName <- fmap head getArgs - contents <- readFile fileName + contents <- T.readFile fileName T.putStrLn "- Parsing file..." let parsed = getRight (parseExpr contents) T.putStrLn "- Generating LLVM to './a.out.ll'..."