-- tests `Lexer'

module Main(main)
where

import Position
import Errors
import Lexers


data Token = IdentTok  Position String
	   | PlusTok   Position
	   | StarTok   Position
	   | LParenTok Position
	   | RParenTok Position
	   deriving (Show)

initialState    :: String -> LexerState s
initialState cs  = (cs, ("<string>", 1, 1), undefined)

lexide :: Lexer s Token
lexide  = alt alpha +> (alt alpha >|< alt num) `star` epsilon
	  `lexaction` makeIde
	  where
	    alpha = ['a'..'z'] ++ ['A'..'Z']
	    num   = ['0'..'9']

	    makeIde lexeme pos = Just (IdentTok pos lexeme)

lexer :: Lexer s Token
lexer  =      lexide
         >||< char '+' `lexaction` makeSym PlusTok
         >||< char '*' `lexaction` makeSym StarTok
         >||< char '(' `lexaction` makeSym LParenTok
         >||< char ')' `lexaction` makeSym RParenTok
	 where
	   makeSym sym _ pos = Just (sym pos)

testlex    :: String -> IO ()
testlex cs  = let (ts, _, errs) = (execLexer lexer . initialState) cs
	      in do
	      print ts
	      mapM (putStr . showError) errs
	      return ()

main = testlex "foo*(x+y)"
