summaryrefslogtreecommitdiff
path: root/testsuite/tests/programs/joao-circular/Funcs_Lexer.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/programs/joao-circular/Funcs_Lexer.hs')
-rw-r--r--testsuite/tests/programs/joao-circular/Funcs_Lexer.hs111
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))
+