packages feed

lambdacube-engine-0.2.1: Graphics/LambdaCube/Loader/OverlayScriptScanner.x

{
{-# OPTIONS_GHC -w #-}
-- alex scanner for use with uulib
--   compile with alex -o Scanner.hs -g Scanner.x
module Graphics.LambdaCube.Loader.Generated.OverlayScriptScanner(tokenize) where

import UU.Scanner
}

$litChar   = [^[\" \\]]
$identChar = [a-zA-Z0-9_\.\-\/\~]


tokens :-
  $white+                                      ;                               -- whitespace
  "//".*                                       ;                               -- comment

  \" ($litChar | \\ \\ | \\ \" )* \"           { valueToken TkString }         -- string
  [0-9]+                                       { valueToken TkInteger16 }      -- int

  ( zorder | element | container |
    metrics_mode | pixels | relative |
    horz_align | left | center | right |
    vert_align | top | center | bottom |
    left | top | width | height |
    material | caption | rotation |
    Panel | transparent | true | false |
    tiling | uv_coords |
    BorderPanel | border_size |
    border_material | border_topleft_uv |
    border_topright_uv | border_bottomleft_uv |
    border_bottomright_uv | border_left_uv |
    border_right_uv | border_top_uv | border_bottom_uv |
    TextArea | font_name | char_height | colour |
    colour_top | colour_bottom | alignment |
    space_width |
    Panel | BorderPanel | TextArea)            { reserved }                    -- reserved keywords
  [\{\}\:\(\)]                                 { reserved }                    -- reserved symbols

  $identChar+                                  { valueToken TkVarid }          -- identifier


{
-- boilerplate code needed for Alex
type AlexInput = (Pos, String)

alexInputPrevChar :: AlexInput -> Char
alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."

alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
alexGetChar (_, []) = Nothing
alexGetChar (p, (c:cs))
  = let p' = adv p c
    in Just (c, (p', cs))

-- use the Alex scanner to generate a list of tokens for the uulib token parsers
tokenize :: String -> String -> [Token]
tokenize filename str
  = go (initpos, str)
  where
    initpos = Pos 1 1 filename

    go inp@(pos, cs)
      = case alexScan inp 0 of
          AlexEOF         -> []
          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
          AlexSkip inp' _ -> go inp'
          AlexToken inp' len act -> act (take len cs) pos : go inp'
}