module Language.WebIDL.Lexer (
Token (..)
,pickToken
,lexStdin) where
import HS_LEXER_H
import Control.Monad
import Data.ByteString (ByteString(..), packCString)
import Data.ByteString.UTF8 (toString)
data Token = Token {
tag :: Int
,line :: Int
,column:: Int
,name :: String
} deriving (Show)
fromIntegralM = return . fromIntegral
tokValue :: IO String
tokValue = do
tok <- v_p_yylval
nm <- tok --> V_name
if nm == nullPtr
then return ""
else do
s <- packCString nm >>= return . toString
f_free nm
(tok, V_name) <-- nullPtr
return s
pickToken :: IO Token
pickToken = do
tag <- f_yylex
loc <- v_p_yylloc
line <- loc --> V_first_line
column <- loc --> V_first_column
return Token `ap` fromIntegralM tag
`ap` fromIntegralM line
`ap` fromIntegralM column
`ap` tokValue
lexStdin :: IO [Token]
lexStdin = lsin [] where
lsin ts = do
t <- pickToken
let ts' = t:ts
case tag t of
0 -> return (reverse ts')
_ -> lsin ts'