/
MiniMLParser.scala
84 lines (63 loc) · 1.51 KB
/
MiniMLParser.scala
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
84
package miniml
import com.codecommit.gll._
object MiniMLParser extends common.Example[Any] with RegexParsers {
override val whitespace = """(\s|\(\*([^*]|\*[^)])*\*\))+"""r
// %%
lazy val decs = dec*
lazy val dec = (
"val" ~ pat ~ "=" ~ exp
| "val" ~ "rec" ~ x ~ "=" ~ "fn" ~ matcher
) ^^^ null
lazy val exp: Parser[Any] = (
x
| b
| "if" ~ exp ~ "then" ~ exp ~ "else" ~ exp
| n
| exp ~ op ~ exp
| "(" ~ ")"
| "(" ~ commaExps ~ ")"
| "fn" ~ matcher
| exp ~ exp
| "nil"
| exp ~ "::" ~ exp
| "case" ~ exp ~ "of" ~ matcher
| "let" ~ decs ~ "in" ~ exp ~ "end"
) ^^^ null
lazy val commaExps: Parser[Any] = (
exp
| commaExps ~ "," ~ exp
)
lazy val matcher: Parser[Any] = (
mrule
| mrule ~ "|" ~ matcher
) ^^^ null
lazy val mrule = pat ~ "=>" ~ exp ^^^ null
lazy val pat: Parser[Any] = (
"_"
| x
| b
| n
| "(" ~ ")"
| "(" ~ commaPats ~ ")"
| "nil"
| pat ~ "::" ~ pat
) ^^^ null
lazy val commaPats: Parser[Any] = (
pat
| commaPats ~ "," ~ pat
) ^^^ null
val x = """[a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])*"""r
val b = "true" | "false"
val n = """~?\d+"""r
val op = (
"=" | "<" | ">" | "<=" | ">="
| "+" | "-" | "*" | "div" | "mod"
| "@" | "o" | "andalso" | "orelse"
)
// %%
def parser = decs
def handleSuccesses(v: Stream[Any]) {
if (!v.isEmpty)
println(" Successfully recognized!")
}
}