diff options
Diffstat (limited to 'testsuite/tests/programs/joao-circular/Funcs_Lexer.hs')
-rw-r--r-- | testsuite/tests/programs/joao-circular/Funcs_Lexer.hs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs b/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs new file mode 100644 index 0000000000..c9f5c07b16 --- /dev/null +++ b/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs @@ -0,0 +1,111 @@ +-- +-- Lexer for MicroC +-- +-- Joćo Saraiva +-- 2002 +-- + + +module Funcs_Lexer where +import Data.Char + +-- +-- Tokens passed to the parser +-- + +data Token + = Tsemicolon + | TopenB + | TcloseB + | TopenSB + | TcloseSB + | TopenCB + | TcloseCB + | Ttowdots + | Tcomma + | Tequal + | Tand + | Tor + | Tassing + | Tadd + | Tmul + | Tsub + | Tdiv + | Tgt + | Tlt + | Tnot + | Ttrue + | Tfalse + | Tint + | Treal + | Tbool + | Tchar + | Tif + | Tthen + | Telse + | Twhile + | Tinput + | Tprint + | TIdent String + | TintVal Int + | TrealVal Float + deriving Show + +lexer [] = [] +lexer (';':cs) = Tsemicolon : lexer cs +lexer ('(':cs) = TopenB : lexer cs +lexer (')':cs) = TcloseB : lexer cs +lexer ('[':cs) = TopenSB : lexer cs +lexer (']':cs) = TcloseSB : lexer cs +lexer ('{':cs) = TopenCB : lexer cs +lexer ('}':cs) = TcloseCB : lexer cs +lexer (':':cs) = Ttowdots : lexer cs +lexer (',':cs) = Tcomma : lexer cs + +lexer ('=':'=':cs) = Tequal : lexer cs +lexer ('&':'&':cs) = Tor : lexer cs +lexer ('|':'|':cs) = Tand : lexer cs + +lexer ('=':cs) = Tassing : lexer cs +lexer ('+':cs) = Tadd : lexer cs +lexer ('*':cs) = Tmul : lexer cs +lexer ('-':cs) = Tsub : lexer cs +lexer ('/':cs) = Tdiv : lexer cs +lexer ('>':cs) = Tgt : lexer cs +lexer ('<':cs) = Tlt : lexer cs +lexer ('!':cs) = Tnot : lexer cs + +lexer (c:cs) + | isSpace c = lexer cs + | isAlpha c = lexSTR (c:cs) + | isDigit c = lexINT (c:cs) + +lexINT cs = + case span isDigit cs of + (var,rest) -> TintVal ((read var)::Int) : lexer rest + + +lexSTR cs = + case span isLegalChar cs of + ("true",rest) -> Ttrue : lexer rest + ("false",rest) -> Tfalse : lexer rest + ("int",rest) -> Tint : lexer rest + ("real",rest) -> Treal : lexer rest + ("bool",rest) -> Tbool : lexer rest + ("char",rest) -> Tchar : lexer rest + ("if",rest) -> Tif : lexer rest + ("then",rest) -> Tthen : lexer rest + ("else",rest) -> Telse : lexer rest + ("while",rest) -> Twhile : lexer rest + ("input",rest) -> Tinput : lexer rest + ("print",rest) -> Tprint : lexer rest + (var,rest) -> TIdent var : lexer rest + +isLegalChar c = let x = ord c + in (isAlpha c) || (isDigit c) || (c == '_') + +runScan = do s <- readFile "input" + let t = lexer s + putStr (show t) + return () -- (scanner inp)) + |