Skip to content

Commit

Permalink
Fix references when rules are unused, and fix missing cloneExpr
Browse files Browse the repository at this point in the history
Fix references when unused rules are removed
Add missing cloneExpr when optimizing ZeroOrOneExpr

Improves situation for #70
  • Loading branch information
mna authored and breml committed May 20, 2019
1 parent b16e08c commit 9fec389
Show file tree
Hide file tree
Showing 11 changed files with 5,381 additions and 2 deletions.
12 changes: 12 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,18 @@ $(TEST_DIR)/issue_65/optimized/issue_65.go: $(TEST_DIR)/issue_65/issue_65.peg $(
$(TEST_DIR)/issue_65/optimized-grammar/issue_65.go: $(TEST_DIR)/issue_65/issue_65.peg $(BINDIR)/pigeon
$(BINDIR)/pigeon -nolint -optimize-grammar $< > $@

$(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
$(BINDIR)/pigeon -nolint $< > $@

$(TEST_DIR)/issue_70/optimized/issue_70.go: $(TEST_DIR)/issue_70/issue_70.peg $(BINDIR)/pigeon
$(BINDIR)/pigeon -nolint -optimize-parser -optimize-basic-latin $< > $@

$(TEST_DIR)/issue_70/optimized-grammar/issue_70.go: $(TEST_DIR)/issue_70/issue_70.peg $(BINDIR)/pigeon
$(BINDIR)/pigeon -nolint -optimize-grammar $< > $@

$(TEST_DIR)/issue_70b/issue_70b.go: $(TEST_DIR)/issue_70b/issue_70b.peg $(BINDIR)/pigeon
$(BINDIR)/pigeon -nolint --optimize-grammar $< > $@

$(TEST_DIR)/issue_80/issue_80.go: $(TEST_DIR)/issue_80/issue_80.peg $(BINDIR)/pigeon
$(BINDIR)/pigeon -nolint $< > $@

Expand Down
17 changes: 16 additions & 1 deletion ast/ast_optimize.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,20 @@ func (r *grammarOptimizer) optimize(expr0 Expression) Visitor {
_, protected := r.protectedRules[rule.Name.Val]
if !used && !protected {
expr.Rules = append(expr.Rules[:i], expr.Rules[i+1:]...)
// Compensate for the removed item
i--

for k, v := range r.ruleUsedByRules {
for kk := range v {
if kk == rule.Name.Val {
delete(r.ruleUsedByRules[k], kk)
if len(r.ruleUsedByRules[k]) == 0 {
delete(r.ruleUsedByRules, k)
}
}
}
}

r.optimized = true
continue
}
Expand All @@ -165,6 +179,7 @@ func (r *grammarOptimizer) optimize(expr0 Expression) Visitor {
expr.Expr = r.optimizeRule(expr.Expr)
case *Rule:
r.rule = expr.Name.Val
expr.Expr = r.optimizeRule(expr.Expr)
case *SeqExpr:
expr.Exprs = r.optimizeRules(expr.Exprs)

Expand Down Expand Up @@ -333,7 +348,7 @@ func cloneExpr(expr Expression) Expression {
}
case *ZeroOrOneExpr:
return &ZeroOrOneExpr{
Expr: expr.Expr,
Expr: cloneExpr(expr.Expr),
p: expr.p,
}
}
Expand Down
13 changes: 12 additions & 1 deletion test/issue_65/optimized-grammar/issue_65.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 9fec389

Please sign in to comment.