simplify scanner error type
This commit is contained in:
parent
ef7dc3603d
commit
8eeb671692
2 changed files with 8 additions and 8 deletions
|
|
@ -8,7 +8,7 @@ run :: String -> IO ()
|
||||||
run source = do
|
run source = do
|
||||||
let tokensMaybe = scanTokensFromSource source
|
let tokensMaybe = scanTokensFromSource source
|
||||||
case tokensMaybe of
|
case tokensMaybe of
|
||||||
Left UnexpectedCharacterError -> putStrLn "Unexpected character"
|
Left (LexicalError s) -> putStrLn s
|
||||||
Right tokens -> do
|
Right tokens -> do
|
||||||
let stmtMaybe = parse tokens
|
let stmtMaybe = parse tokens
|
||||||
case stmtMaybe of
|
case stmtMaybe of
|
||||||
|
|
@ -19,7 +19,7 @@ runEval :: String -> IO ()
|
||||||
runEval source = do
|
runEval source = do
|
||||||
let tokensMaybe = scanTokensFromSource source
|
let tokensMaybe = scanTokensFromSource source
|
||||||
object <- case tokensMaybe of
|
object <- case tokensMaybe of
|
||||||
Left UnexpectedCharacterError -> putStrLn "Unexpected character" >> return NullObject
|
Left (LexicalError s) -> putStrLn s >> return NullObject
|
||||||
Right tokens -> do
|
Right tokens -> do
|
||||||
let exprMaybe = parseExpression tokens
|
let exprMaybe = parseExpression tokens
|
||||||
case exprMaybe of
|
case exprMaybe of
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ module Lox.Scanner (
|
||||||
TokenType (..),
|
TokenType (..),
|
||||||
Object (..),
|
Object (..),
|
||||||
Token (..),
|
Token (..),
|
||||||
ScannerError (..),
|
LexicalError (..),
|
||||||
scanTokensFromSource
|
scanTokensFromSource
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
@ -45,16 +45,16 @@ data Token = Token {
|
||||||
|
|
||||||
data ScannerState = ScannerState {source :: String, current :: String, lineNumber :: Int}
|
data ScannerState = ScannerState {source :: String, current :: String, lineNumber :: Int}
|
||||||
|
|
||||||
data ScannerError = UnexpectedCharacterError deriving Show
|
data LexicalError = LexicalError String
|
||||||
|
|
||||||
emptyScannerState :: String -> ScannerState
|
emptyScannerState :: String -> ScannerState
|
||||||
emptyScannerState source =
|
emptyScannerState source =
|
||||||
ScannerState {source=source, current="", lineNumber=1}
|
ScannerState {source=source, current="", lineNumber=1}
|
||||||
|
|
||||||
scanTokensFromSource :: String -> Either ScannerError [Token]
|
scanTokensFromSource :: String -> Either LexicalError [Token]
|
||||||
scanTokensFromSource source = evalState scanTokens (emptyScannerState source)
|
scanTokensFromSource source = evalState scanTokens (emptyScannerState source)
|
||||||
|
|
||||||
scanTokens :: State ScannerState (Either ScannerError [Token])
|
scanTokens :: State ScannerState (Either LexicalError [Token])
|
||||||
scanTokens = do
|
scanTokens = do
|
||||||
atEnd <- isAtEnd
|
atEnd <- isAtEnd
|
||||||
if atEnd then return . return <$> addToken EOF else do
|
if atEnd then return . return <$> addToken EOF else do
|
||||||
|
|
@ -70,7 +70,7 @@ isAtEnd = gets scannerIsAtEnd
|
||||||
scannerIsAtEnd :: ScannerState -> Bool
|
scannerIsAtEnd :: ScannerState -> Bool
|
||||||
scannerIsAtEnd ScannerState {source=source} = null source
|
scannerIsAtEnd ScannerState {source=source} = null source
|
||||||
|
|
||||||
scanToken :: State ScannerState (Either ScannerError (Maybe Token))
|
scanToken :: State ScannerState (Either LexicalError (Maybe Token))
|
||||||
scanToken = do
|
scanToken = do
|
||||||
resetCurrent
|
resetCurrent
|
||||||
c <- advance
|
c <- advance
|
||||||
|
|
@ -97,7 +97,7 @@ scanToken = do
|
||||||
'\r' -> return nothing
|
'\r' -> return nothing
|
||||||
'\t' -> return nothing
|
'\t' -> return nothing
|
||||||
'\n' -> modify (\s@(ScannerState {lineNumber=n}) -> s {lineNumber=n+1}) >> return nothing
|
'\n' -> modify (\s@(ScannerState {lineNumber=n}) -> s {lineNumber=n+1}) >> return nothing
|
||||||
c -> if isDigit c then ok <$> scanNumber else if isAlpha c then ok <$> scanIdentifier else return $ Left UnexpectedCharacterError
|
c -> if isDigit c then ok <$> scanNumber else if isAlpha c then ok <$> scanIdentifier else return $ Left $ LexicalError "Unexpected character"
|
||||||
|
|
||||||
scanString :: State ScannerState Token
|
scanString :: State ScannerState Token
|
||||||
scanString = do
|
scanString = do
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue