Skip to content

Commit 9fec389

Browse files
mnabreml
authored andcommitted
Fix references when rules are unused, and fix missing cloneExpr
Fix references when unused rules are removed Add missing cloneExpr when optimizing ZeroOrOneExpr Improves situation for #70
1 parent b16e08c commit 9fec389

File tree

11 files changed

+5381
-2
lines changed

11 files changed

+5381
-2
lines changed

Makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ $(TEST_DIR)/issue_65/optimized/issue_65.go: $(TEST_DIR)/issue_65/issue_65.peg $(
154154
$(TEST_DIR)/issue_65/optimized-grammar/issue_65.go: $(TEST_DIR)/issue_65/issue_65.peg $(BINDIR)/pigeon
155155
$(BINDIR)/pigeon -nolint -optimize-grammar $< > $@
156156

157+
$(TEST_DIR)/issue_70/issue_70.go: $(TEST_DIR)/issue_70/issue_70.peg $(TEST_DIR)/issue_70/optimized/issue_70.go $(TEST_DIR)/issue_70/optimized-grammar/issue_70.go $(BINDIR)/pigeon
158+
$(BINDIR)/pigeon -nolint $< > $@
159+
160+
$(TEST_DIR)/issue_70/optimized/issue_70.go: $(TEST_DIR)/issue_70/issue_70.peg $(BINDIR)/pigeon
161+
$(BINDIR)/pigeon -nolint -optimize-parser -optimize-basic-latin $< > $@
162+
163+
$(TEST_DIR)/issue_70/optimized-grammar/issue_70.go: $(TEST_DIR)/issue_70/issue_70.peg $(BINDIR)/pigeon
164+
$(BINDIR)/pigeon -nolint -optimize-grammar $< > $@
165+
166+
$(TEST_DIR)/issue_70b/issue_70b.go: $(TEST_DIR)/issue_70b/issue_70b.peg $(BINDIR)/pigeon
167+
$(BINDIR)/pigeon -nolint --optimize-grammar $< > $@
168+
157169
$(TEST_DIR)/issue_80/issue_80.go: $(TEST_DIR)/issue_80/issue_80.peg $(BINDIR)/pigeon
158170
$(BINDIR)/pigeon -nolint $< > $@
159171

ast/ast_optimize.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,20 @@ func (r *grammarOptimizer) optimize(expr0 Expression) Visitor {
153153
_, protected := r.protectedRules[rule.Name.Val]
154154
if !used && !protected {
155155
expr.Rules = append(expr.Rules[:i], expr.Rules[i+1:]...)
156+
// Compensate for the removed item
157+
i--
158+
159+
for k, v := range r.ruleUsedByRules {
160+
for kk := range v {
161+
if kk == rule.Name.Val {
162+
delete(r.ruleUsedByRules[k], kk)
163+
if len(r.ruleUsedByRules[k]) == 0 {
164+
delete(r.ruleUsedByRules, k)
165+
}
166+
}
167+
}
168+
}
169+
156170
r.optimized = true
157171
continue
158172
}
@@ -165,6 +179,7 @@ func (r *grammarOptimizer) optimize(expr0 Expression) Visitor {
165179
expr.Expr = r.optimizeRule(expr.Expr)
166180
case *Rule:
167181
r.rule = expr.Name.Val
182+
expr.Expr = r.optimizeRule(expr.Expr)
168183
case *SeqExpr:
169184
expr.Exprs = r.optimizeRules(expr.Exprs)
170185

@@ -333,7 +348,7 @@ func cloneExpr(expr Expression) Expression {
333348
}
334349
case *ZeroOrOneExpr:
335350
return &ZeroOrOneExpr{
336-
Expr: expr.Expr,
351+
Expr: cloneExpr(expr.Expr),
337352
p: expr.p,
338353
}
339354
}

test/issue_65/optimized-grammar/issue_65.go

Lines changed: 12 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)