Skip to content

Commit a14efb6

Browse files
committed
Updated generated parser and added utilities.
1 parent 566dc2d commit a14efb6

File tree

5 files changed

+229
-184
lines changed

5 files changed

+229
-184
lines changed

ast/shared/src/main/scala/org/sireum/lang/ast/SlangLl2AstBuilder.scala

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
package org.sireum.lang.ast
2828

2929
import org.sireum._
30+
import org.sireum.S32._
3031
import org.sireum.lang.{ast => AST}
3132
import org.sireum.message.Position
3233
import org.sireum.parser.ParseTree
@@ -61,7 +62,7 @@ object SlangLl2AstBuilder {
6162

6263
@strictpure def mkName(ids: ISZ[AST.Id], tree: ParseTree): AST.Name = AST.Name(ids, attr(tree))
6364

64-
def children(tree: ParseTree): ISZ[ParseTree] = {
65+
def children(tree: ParseTree): IS[S32, ParseTree] = {
6566
return tree.asInstanceOf[ParseTree.Node].children
6667
}
6768

@@ -181,7 +182,7 @@ object SlangLl2AstBuilder {
181182
// ─── Annotations / mods ────────────────────────────────────────────
182183

183184
@datatype class ModInfo(val names: ISZ[String],
184-
val args: ISZ[(String, ISZ[ParseTree])])
185+
val args: ISZ[(String, IS[S32, ParseTree])])
185186

186187
def buildMods(mods: ISZ[ParseTree.Node]): ISZ[ModInfo] = {
187188
var r = ISZ[ModInfo]()
@@ -197,7 +198,7 @@ object SlangLl2AstBuilder {
197198
val argsNode = findChild(node, "args")
198199
argsNode match {
199200
case Some(an) =>
200-
var argPairs = ISZ[(String, ISZ[ParseTree])]()
201+
var argPairs = ISZ[(String, IS[S32, ParseTree])]()
201202
// For now, just store raw children
202203
argPairs = argPairs :+ ((name, an.children))
203204
return ModInfo(names = ISZ(name), args = argPairs)
@@ -226,15 +227,15 @@ object SlangLl2AstBuilder {
226227

227228
// ─── Annotations (LL2 annotation block) ────────────────────────────
228229

229-
def buildAnnot(nodeOpt: Option[ParseTree.Node], reporter: message.Reporter): ISZ[(String, ISZ[ParseTree])] = {
230+
def buildAnnot(nodeOpt: Option[ParseTree.Node], reporter: message.Reporter): ISZ[(String, IS[S32, ParseTree])] = {
230231
nodeOpt match {
231232
case Some(node) =>
232233
// annot: AT LSQUARE annotArg* RSQUARE
233234
val annotArgs = findChildren(node, "annotArg")
234-
var r = ISZ[(String, ISZ[ParseTree])]()
235+
var r = ISZ[(String, IS[S32, ParseTree])]()
235236
for (aa <- annotArgs) {
236237
val key = firstLeaf(aa).text
237-
var values = ISZ[ParseTree]()
238+
var values = IS[S32, ParseTree]()
238239
for (c <- aa.children) {
239240
c match {
240241
case c: ParseTree.Leaf if c.ruleName == "ID" || c.ruleName == "STRING" =>
@@ -1473,9 +1474,9 @@ object SlangLl2AstBuilder {
14731474
def buildBinaryFromTree(tree: ParseTree, contextNode: ParseTree, reporter: message.Reporter): AST.Exp = {
14741475
tree match {
14751476
case n: ParseTree.Node if n.ruleName == "Binary" =>
1476-
val left = buildBinaryFromTree(n.children(0), contextNode, reporter)
1477-
val opLeaf = n.children(1).asInstanceOf[ParseTree.Leaf]
1478-
val right = buildBinaryFromTree(n.children(2), contextNode, reporter)
1477+
val left = buildBinaryFromTree(n.children.atS32(s32"0"), contextNode, reporter)
1478+
val opLeaf = n.children.atS32(s32"1").asInstanceOf[ParseTree.Leaf]
1479+
val right = buildBinaryFromTree(n.children.atS32(s32"2"), contextNode, reporter)
14791480
return AST.Exp.Binary(
14801481
left = left,
14811482
op = opLeaf.text,
@@ -1751,7 +1752,7 @@ object SlangLl2AstBuilder {
17511752
if (expNodes.nonEmpty) {
17521753
val innerExp = buildExp(expNodes(0), reporter)
17531754
// Check for num argument
1754-
val numOpt: Option[AST.Exp.LitZ] = if (aa.children.size > 1) {
1755+
val numOpt: Option[AST.Exp.LitZ] = if (aa.children.sizeS32 > s32"1") {
17551756
var found: Option[AST.Exp.LitZ] = None()
17561757
for (c <- aa.children) {
17571758
c match {

ast/shared/src/main/scala/org/sireum/lang/ast/SlangLl2ParseTreeUtil.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@ package org.sireum.lang.ast
2828

2929

3030
import org.sireum._
31+
import org.sireum.S32._
3132
import org.sireum.message.Position
3233
import org.sireum.parser._
33-
import org.sireum.U32._
34-
3534
object SlangLl2ParseTreeUtil {
3635

3736
@datatype class BinaryPrecedenceOps extends ParseTree.BinaryPrecedenceOps[B, ParseTree, ParseTree] {
@@ -48,7 +47,7 @@ object SlangLl2ParseTreeUtil {
4847
case "___>:" => T
4948
case _ => F
5049
}
51-
case t: ParseTree.Node if isBinary(t) => isRightAssoc(t.children(1))
50+
case t: ParseTree.Node if isBinary(t) => isRightAssoc(t.children.atS32(s32"1"))
5251
case _ => F
5352
}
5453

@@ -80,17 +79,17 @@ object SlangLl2ParseTreeUtil {
8079
case _ => Some(lowestPrecedence)
8180
}
8281
}
83-
case t: ParseTree.Node if isBinary(t) => precedence(t.children(1))
82+
case t: ParseTree.Node if isBinary(t) => precedence(t.children.atS32(s32"1"))
8483
case _ => None()
8584
}
8685

8786
@strictpure override def posOpt(t: ParseTree): Option[Position] = t.posOpt
8887

8988
@strictpure override def parenthesize(builder: B, t: ParseTree): ParseTree =
90-
ParseTree.Node(ISZ(t), "paren", u32"0")
89+
ParseTree.Node(IS[S32, ParseTree](t), "paren", s32"0")
9190

9291
@strictpure override def binary(builder: B, left: ParseTree, op: ParseTree, right: ParseTree): ParseTree =
93-
ParseTree.Node(ISZ(left, op, right), "Binary", U32.Max)
92+
ParseTree.Node(IS[S32, ParseTree](left, op, right), "Binary", s32"-1")
9493

9594
@strictpure override def transform(builder: B, tree: ParseTree): ParseTree = tree match {
9695
case tree: ParseTree.Leaf if tree.text == "->" => tree(text = "__>:")
@@ -117,7 +116,7 @@ object SlangLl2ParseTreeUtil {
117116
for (c <- n.children) {
118117
c match {
119118
case m: ParseTree.Node if m.ruleName == "infixOp" =>
120-
newChildren = newChildren :+ m.children(0)
119+
newChildren = newChildren :+ m.children.atS32(s32"0")
121120
case _ =>
122121
newChildren = newChildren :+ c
123122
}

parser/shared/src/main/scala/org/sireum/lang/parser/SlangLl2Parser.scala

Lines changed: 12 additions & 13 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)