-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lexer.x
70 lines (59 loc) · 1.92 KB
/
Lexer.x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{
module Lexer (Token(..), AlexPosn(..), alexScanTokens, token_posn) where
}
%wrapper "posn"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
tokens :-
$white+ ;
"--".* ;
while { tok (\p s -> While p) }
do { tok (\p s -> Do p) }
:= { tok (\p s -> Assign p) }
\[ { tok (\p s -> BracketOpen p) }
\] { tok (\p s -> BracketClose p) }
\( { tok (\p s -> ParensOpen p) }
\) { tok (\p s -> ParensClose p) }
\; { tok (\p s -> Semicolon p) }
\< { tok (\p s -> TLT p) }
\> { tok (\p s -> TGT p) }
\&\& { tok (\p s -> TAND p) }
$digit+ { tok (\p s -> Int p (read s)) }
[\=\+\-\*\/] { tok (\p s -> Sym p (head s)) }
$alpha [$alpha $digit \_ \']* { tok (\p s -> Var p s) }
{
-- Each right-hand side has type :: AlexPosn -> String -> Token
-- Some action helpers:
tok f p s = f p s
-- The token type:
data Token =
While AlexPosn |
Do AlexPosn |
BracketOpen AlexPosn |
BracketClose AlexPosn |
ParensOpen AlexPosn |
ParensClose AlexPosn |
Semicolon AlexPosn |
Assign AlexPosn |
Sym AlexPosn Char |
Var AlexPosn String |
Int AlexPosn Int |
TLT AlexPosn |
TGT AlexPosn |
TAND AlexPosn
deriving (Eq,Show)
token_posn (While p) = p
token_posn (Do p) = p
token_posn (Assign p) = p
token_posn (Sym p _) = p
token_posn (Var p _) = p
token_posn (Int p _) = p
token_posn (Semicolon p) = p
token_posn (BracketOpen p) = p
token_posn (BracketClose p) = p
token_posn (ParensOpen p) = p
token_posn (ParensClose p) = p
token_posn (TLT p) = p
token_posn (TGT p) = p
token_posn (TAND p) = p
}