-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathParserTerminals.sml
83 lines (66 loc) · 1.71 KB
/
ParserTerminals.sml
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
71
72
73
74
75
76
77
78
79
80
81
82
83
structure ParserTerminals:> ParserTerminals =
struct
open Parser
open ParserMonad
infixr **>
infix |||
infix >>
fun inrange s1 s2 c =
let val c1 = String.compare (s1, c)
in
(c1 = LESS orelse c1 = EQUAL) andalso
let val c2 = String.compare (c, s2)
in c2 = LESS orelse c2 = EQUAL
end
end
fun isa s c =
String.compare (s, c) = EQUAL
fun isn'ta s c =
not (String.compare (s, c) = EQUAL)
fun inlist [] _ = false
| inlist (h::t) c = isa h c orelse inlist t c
val is_ws = inlist [" ", "\t", "\n"]
val parse_ws =
(parse_one is_ws **> (parse_while "ws" is_ws))
>> (fn (s1,s2) => (Substring.span(s1,s2)))
val parse_optws =
(((parse_one is_ws **> (parse_while "ws" is_ws))
>> (fn (s1,s2) => (Substring.span(s1,s2))))
||| (always >> (fn _ => (Substring.all ""))))
val parse_AZs =
let val pred = inrange "A" "Z"
in
(parse_one pred **> (parse_while "AZs" pred))
>> (fn (s1,s2) => (Substring.span(s1,s2)))
end
val parse_azs =
let val pred = inrange "a" "z"
in
(parse_one pred **> (parse_while "azs" pred))
>> (fn (s1,s2) => (Substring.span(s1,s2)))
end
val parse_azAZs =
let val pred =
fn c => inrange "A" "Z" c
orelse inrange "a" "z" c
in
(parse_one pred **> (parse_while "azAZs" pred))
>> (fn (s1,s2) => (Substring.span(s1,s2)))
end
val parse_notdquote =
let val pred = isn'ta "\""
in
parse_while "notdquote" pred
end
val parse_notgt =
let val pred = isn'ta ">"
in
parse_while "notgt" pred
end
val parse_notsquote =
let val pred = isn'ta "'"
in
parse_while "notsquote" pred
end
val parse_lws_a = parse_a_ilws
end (* struct *)