発展: セパレートスキャナ

まんま

module Main where

import Text.ParserCombinators.Parsec

type Token  = (SourcePos,Tok)
data Tok    = Identifier String
            | Reserved   String
            | Symbol     String
            | Price      Int
            deriving Show

--scanner :: [Char] -> ([Token],[String])


-- type Parser a   = GenParser Char () a
type MyParser a   = GenParser Token () a

mytoken :: (Tok -> Maybe a) -> MyParser a
mytoken test
  = token showToken posToken testToken
  where
    showToken (pos,tok)   = show tok
    posToken  (pos,tok)   = pos
    testToken (pos,tok)   = test tok


identifier :: MyParser String
identifier 
  = mytoken (\tok -> case tok of 
                       Identifier name -> Just name
                       other           -> Nothing)

reserved :: String -> MyParser ()
reserved name
  = mytoken (\tok -> case tok of
                       Reserved s   | s == name  -> Just ()
                       other        -> Nothing)

全部が書かれていないようなので、、、