1
-- This Alex file was machine-generated by the BNF converter
9
{ ^l = [a-zA-Z^192-^255] # [^215 ^247]} -- isolatin1 letter
10
{ ^c = [A-Z^192-^221] # [^215]} -- capital isolatin1 letter
11
{ ^s = [a-z^222-^255] # [^247]} -- small isolatin1 letter
12
{ ^d = [0-9] } -- digit
13
{ ^i = [^l^d^'^_] } -- identifier character
14
{ ^u = [^0-^255] } -- universal: any character
16
{ %s = -- reserved words consisting of special symbols
17
^; | ^. | ^: ^: ^= | ^[ | ^] | ^_ | ^( | ^: | ^) | ^, | ^| | ^- | ^* | ^+ | ^? | ^{ | ^}
20
"tokens_lx"/"tokens_acts":-
22
<> ::= ^{ ^- ([^u # ^-] | ^- [^u # ^}])* (^-)+ ^}
25
<pTSpec> ::= %s %{ pTSpec p = PT p . TS %}
27
<ident> ::= ^l ^i* %{ ident p = PT p . eitherResIdent TV %}
28
<string> ::= ^" ([^u # [^"^\^n]] | (^\ (^" | ^\ | ^' | n | t)))* ^"%{ string p = PT p . TL . unescapeInitTail %}
29
<char> ::= ^' (^u # [^'^\] | ^\ [^\ ^' n t]) ^' %{ char p = PT p . TC %}
30
<int> ::= ^d+ %{ int p = PT p . TI %}
36
TS String -- reserved words
37
| TL String -- string literals
38
| TI String -- integer literals
39
| TV String -- identifiers
40
| TD String -- double precision float literals
41
| TC String -- character literals
50
tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
51
tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
52
tokenPos _ = "end of file"
62
tokens:: String -> [Token]
63
tokens inp = scan tokens_scan inp
65
tokens_scan:: Scan Token
66
tokens_scan = load_scan (tokens_acts,stop_act) tokens_lx
69
stop_act p inp = [Err p]
71
eitherResIdent :: (String -> Tok) -> String -> Tok
72
eitherResIdent tv s = if isResWord s then (TS s) else (tv s) where
73
isResWord s = isInTree s $
74
B "lower" (B "entrypoints" (B "comment" (B "coercions" (B "char" N N) N) (B "digit" N N)) (B "layout" (B "internal" (B "eps" N N) N) (B "letter" N N))) (B "terminator" (B "separator" (B "rules" (B "nonempty" N N) N) (B "stop" N N)) (B "toplevel" (B "token" N N) (B "upper" N N)))
76
data BTree = N | B String BTree BTree deriving (Show)
78
isInTree :: String -> BTree -> Bool
79
isInTree x tree = case tree of
82
| x < a -> isInTree x left
83
| x > a -> isInTree x right
86
unescapeInitTail :: String -> String
87
unescapeInitTail = unesc . tail where
89
'\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
90
'\\':'n':cs -> '\n' : unesc cs
91
'\\':'t':cs -> '\t' : unesc cs