Skip to content

Commit 4d5a210

Browse files
update and fix locally scala-parser-combinators (#10)
1 parent 5c48ce1 commit 4d5a210

File tree

22 files changed

+359
-93
lines changed

22 files changed

+359
-93
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ name := "tapl-scala"
44

55
scalacOptions ++= Seq("-deprecation", "-feature")
66

7-
libraryDependencies += ("org.scala-lang.modules" %% "scala-parser-combinators" % "1.2.0-M2").withDottyCompat(scalaVersion.value)
7+
libraryDependencies += ("org.scala-lang.modules" %% "scala-parser-combinators" % "1.2.0-M2")
88
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.5" % "test"

src/main/scala/tapl/arith/parser.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ object ArithParsers extends StandardTokenParsers with ImplicitConversions {
4040
case _ => TmSucc(num(x - 1))
4141
}
4242

43-
private def eof: Parser[String] = elem("<eof>", _ == lexical.EOF) ^^ { _.chars }
43+
private def eof: Parser[String] =
44+
elem("<eof>", _ == lexical.EOF) ^^ { _.chars }
4445

4546
def input(s: String): List[Command] =
4647
phrase(topLevel)(new lexical.Scanner(s)) match {

src/main/scala/tapl/bot/parser.scala

Lines changed: 24 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,31 @@
11
package tapl.bot
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object BotParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._
99
import Command._
1010
import Term._
1111
import Ty._
1212

13-
lexical.reserved ++= Seq(
14-
"lambda",
15-
"Bool",
16-
"true",
17-
"false",
18-
"if",
19-
"then",
20-
"else",
21-
"Nat",
22-
"String",
23-
"Unit",
24-
"Float",
25-
"unit",
26-
"case",
27-
"let",
28-
"in",
29-
"succ",
30-
"pred",
31-
"as",
32-
"of",
33-
"fix",
34-
"iszero",
35-
"letrec",
36-
"_",
37-
"Top",
38-
"Bot",
39-
)
40-
lexical.delimiters ++= Seq(
41-
"(",
42-
")",
43-
";",
44-
"/",
45-
".",
46-
":",
47-
"->",
48-
"=",
49-
"<",
50-
">",
51-
"{",
52-
"}",
53-
"=>",
54-
"==>",
55-
",",
56-
"|",
57-
)
13+
lexical.reserved ++=
14+
Seq("lambda", "Top", "Bot")
15+
lexical.delimiters ++=
16+
Seq("(", ")", ";", ".", ":", "->")
5817

59-
// lower-case identifier
60-
lazy val lcid: PackratParser[String] = ident ^? { case id if id.charAt(0).isLower => id }
61-
// upper-case identifier
62-
lazy val ucid: PackratParser[String] = ident ^? { case id if id.charAt(0).isUpper => id }
63-
lazy val eof: PackratParser[String] = elem("<eof>", _ == lexical.EOF) ^^ { _.chars }
18+
private lazy val lcid: PackratParser[String] =
19+
ident ^? { case id if id.charAt(0).isLower => id }
20+
private lazy val ucid: PackratParser[String] =
21+
ident ^? { case id if id.charAt(0).isUpper => id }
22+
private lazy val eof: PackratParser[String] =
23+
elem("<eof>", _ == lexical.EOF) ^^ { _.chars }
6424

6525
type Res[A] = Context => A
6626
type Res1[A] = Context => (A, Context)
6727

68-
lazy val topLevel: PackratParser[Res1[List[Command]]] =
28+
private lazy val topLevel: PackratParser[Res1[List[Command]]] =
6929
((command <~ ";") ~ topLevel) ^^ {
7030
case f ~ g =>
7131
(ctx: Context) =>
@@ -74,57 +34,48 @@ object BotParsers extends StandardTokenParsers with PackratParsers with Implicit
7434
(cmd1 :: cmds, ctx2)
7535
} | success { (ctx: Context) => (List(), ctx) }
7636

77-
lazy val command: PackratParser[Res1[Command]] =
37+
private lazy val command: PackratParser[Res1[Command]] =
7838
lcid ~ binder ^^ { case id ~ bind => (ctx: Context) => (Bind(id, bind(ctx)), ctx.addName(id)) } |
7939
term ^^ { t => (ctx: Context) =>
8040
val t1 = t(ctx); (Eval(t1), ctx)
8141
}
8242

83-
lazy val binder: Parser[Context => Binding] =
43+
private lazy val binder: PackratParser[Res[Binding]] =
8444
":" ~> typ ^^ { t => (ctx: Context) => VarBind(t(ctx)) }
8545

86-
lazy val typ: PackratParser[Res[Ty]] = arrowType
87-
lazy val aType: PackratParser[Res[Ty]] =
46+
private lazy val typ: PackratParser[Res[Ty]] =
47+
arrowType
48+
private lazy val aType: PackratParser[Res[Ty]] =
8849
"(" ~> typ <~ ")" |
8950
"Bot" ^^ { _ => (ctx: Context) => TyBot } |
9051
"Top" ^^ { _ => (ctx: Context) => TyTop }
9152

92-
lazy val fieldTypes: PackratParser[Res[List[(String, Ty)]]] =
93-
repsep(fieldType, ",") ^^ { fs => (ctx: Context) =>
94-
fs.zipWithIndex.map { case (ft, i) => ft(ctx, i + 1) }
95-
}
96-
97-
lazy val fieldType: PackratParser[(Context, Int) => (String, Ty)] =
98-
lcid ~ (":" ~> typ) ^^ { case id ~ ty => (ctx: Context, i: Int) => (id, ty(ctx)) } |
99-
typ ^^ { ty => (ctx: Context, i: Int) => (i.toString, ty(ctx)) }
100-
101-
lazy val arrowType: PackratParser[Res[Ty]] =
53+
private lazy val arrowType: PackratParser[Res[Ty]] =
10254
(aType <~ "->") ~ arrowType ^^ { case t1 ~ t2 => (ctx: Context) => TyArr(t1(ctx), t2(ctx)) } |
10355
aType
10456

105-
// TERMS
106-
lazy val term: PackratParser[Res[Term]] =
57+
private lazy val term: PackratParser[Res[Term]] =
10758
appTerm |
10859
("lambda" ~> lcid) ~ (":" ~> typ) ~ ("." ~> term) ^^ {
10960
case v ~ ty ~ t => (ctx: Context) => TmAbs(v, ty(ctx), t(ctx.addName(v)))
11061
} |
11162
("lambda" ~ "_") ~> (":" ~> typ) ~ ("." ~> term) ^^ {
11263
case ty ~ t => (ctx: Context) => TmAbs("_", ty(ctx), t(ctx.addName("_")))
11364
}
114-
lazy val appTerm: PackratParser[Res[Term]] =
65+
private lazy val appTerm: PackratParser[Res[Term]] =
11566
appTerm ~ aTerm ^^ { case t1 ~ t2 => (ctx: Context) => TmApp(t1(ctx), t2(ctx)) } |
11667
aTerm
11768

118-
lazy val aTerm: PackratParser[Res[Term]] =
69+
private lazy val aTerm: PackratParser[Res[Term]] =
11970
"(" ~> term <~ ")" |
12071
lcid ^^ { i => (ctx: Context) => TmVar(ctx.name2index(i), ctx.length) }
12172

122-
lazy val phraseTopLevel: PackratParser[Res1[List[Command]]] = phrase(topLevel)
73+
private lazy val phraseTopLevel: PackratParser[Res1[List[Command]]] =
74+
phrase(topLevel)
12375

124-
def input(s: String) =
76+
def input(s: String): Res1[List[Command]] =
12577
phraseTopLevel(new lexical.Scanner(s)) match {
12678
case t if t.successful => t.get
12779
case t => sys.error(t.toString)
12880
}
129-
13081
}

src/main/scala/tapl/equirec/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.equirec
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object EquirecParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullequirec/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullequirec
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullEquirecParsers
88
extends StandardTokenParsers

src/main/scala/tapl/fullerror/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullerror
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullErrorParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullfomsub/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullfomsub
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
import Syntax._
88

src/main/scala/tapl/fullfomsubref/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullfomsubref
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66
import Syntax._
77

88
object FullFomSubRefParsers

src/main/scala/tapl/fullfsub/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullfsub
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullFSubParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullisorec/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullisorec
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullIsorecParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullomega/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullomega
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullOmegaParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullpoly/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullpoly
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullPolyParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullrecon/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullrecon
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullReconParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullref/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullref
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullRefParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullsimple/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullsimple
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullSimpleParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fullsub/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fullsub
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullSubParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/fulluntyped/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.fulluntyped
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object FullUntypedParsers
88
extends StandardTokenParsers

src/main/scala/tapl/rcdsubbot/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.rcdsubbot
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object RcdSubBotParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/recon/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.recon
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object ReconParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/simplebool/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.simplebool
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
object SimpleBoolParsers extends StandardTokenParsers with PackratParsers with ImplicitConversions {
88
import Binding._

src/main/scala/tapl/untyped/parser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package tapl.untyped
22

33
import scala.util.parsing.combinator.ImplicitConversions
4-
import scala.util.parsing.combinator.PackratParsers
54
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
5+
import util.PackratParsers
66

77
// This parser is done exactly in the same way as in TAPL.
88
// The oddity of this parser (elementary parsers return functions) is driven by the desire

0 commit comments

Comments
 (0)