aboutsummaryrefslogtreecommitdiff
path: root/compiler/ast.go
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/ast.go')
-rw-r--r--compiler/ast.go20
1 files changed, 19 insertions, 1 deletions
diff --git a/compiler/ast.go b/compiler/ast.go
index e9c1b50..803d5a9 100644
--- a/compiler/ast.go
+++ b/compiler/ast.go
@@ -331,7 +331,7 @@ func newRepeatOneOrMoreNode(left astNode) *concatNode {
return newConcatNode(
left,
&repeatNode{
- left: left,
+ left: copyAST(left),
})
}
@@ -369,6 +369,24 @@ func (n *optionNode) last() symbolPositionSet {
return s
}
+func copyAST(src astNode) astNode {
+ switch n := src.(type) {
+ case *symbolNode:
+ return newRangeSymbolNode(n.from, n.to)
+ case *endMarkerNode:
+ return newEndMarkerNode(n.id)
+ case *concatNode:
+ return newConcatNode(copyAST(n.left), copyAST(n.right))
+ case *altNode:
+ return newAltNode(copyAST(n.left), copyAST(n.right))
+ case *repeatNode:
+ return newRepeatNode(copyAST(n.left))
+ case *optionNode:
+ return newOptionNode(copyAST(n.left))
+ }
+ panic(fmt.Errorf("copyAST cannot handle %T type; AST: %v", src, src))
+}
+
type followTable map[symbolPosition]symbolPositionSet
func genFollowTable(root astNode) followTable {