HsLexerPass1a.hs

Plain text version of HsLexerPass1a.hs

module HsLexerPass1a where
import HsLex(haskellLex)
import HsTokens
import List(mapAccumL)

default(Int)

-- Tokenize, add position information and remove white space:
lexerPass1 = filter (notWhite.fst) . lexerPass0
  where
    notWhite t = t/=Whitespace && t/=Commentstart

-- Tokenize and add position information:
lexerPass0 = addPos . haskellLex
  where
    addPos = snd . mapAccumL pos startPos


    pos p (t,r) = (nextPos p s,(t,(p,s)))
      where s = reverse r

-- The first column is designated column 1, not 0.
startPos = (1,1)

nextPos = foldl nextPos1

nextPos1 (y,x) c =
      case c of
        -- The characters newline, return, linefeed, and formfeed, all start
	-- a new line.
	'\n'  -> (y+1, 1)
	'\CR'  -> (y+1, 1)
	'\LF' -> (y+1, 1)
	'\FF' -> (y+1, 1)
        -- Tab stops are 8 characters apart.
	-- A tab character causes the insertion of enough spaces to align the
	-- current position with the next tab stop.
	-- + (not in the report) the first tab stop is column 1.
	'\t'  -> (y, x+8-(x-1) `mod` 8)
	_ -> (y, x+1)

Valid HTML?