aboutsummaryrefslogtreecommitdiff
path: root/grammar/parsing_table.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-08-29 23:40:10 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-08-29 23:40:10 +0900
commitbb85dcc57cc3c0fff6cc9dc09540d58fef400d6f (patch)
tree2fc6a20d0c644a79d454a48c49baa26423fbd10d /grammar/parsing_table.go
parentAdd describe command to print a description file (diff)
downloadurubu-bb85dcc57cc3c0fff6cc9dc09540d58fef400d6f.tar.gz
urubu-bb85dcc57cc3c0fff6cc9dc09540d58fef400d6f.tar.xz
Add precedences and associativities to the description file
Diffstat (limited to 'grammar/parsing_table.go')
-rw-r--r--grammar/parsing_table.go30
1 files changed, 29 insertions, 1 deletions
diff --git a/grammar/parsing_table.go b/grammar/parsing_table.go
index fe5a619..a82ef60 100644
--- a/grammar/parsing_table.go
+++ b/grammar/parsing_table.go
@@ -347,6 +347,19 @@ func (b *lrTableBuilder) genDescription(tab *ParsingTable, gram *Grammar) (*spec
term.Pattern = pat
}
+ prec := b.precAndAssoc.terminalPrecedence(sym.num())
+ if prec != precNil {
+ term.Precedence = prec
+ }
+
+ assoc := b.precAndAssoc.terminalAssociativity(sym.num())
+ switch assoc {
+ case assocTypeLeft:
+ term.Associativity = "l"
+ case assocTypeRight:
+ term.Associativity = "r"
+ }
+
terms[sym.num()] = term
}
}
@@ -382,11 +395,26 @@ func (b *lrTableBuilder) genDescription(tab *ParsingTable, gram *Grammar) (*spec
}
}
- prods[p.num.Int()] = &spec.Production{
+ prod := &spec.Production{
Number: p.num.Int(),
LHS: p.lhs.num().Int(),
RHS: rhs,
}
+
+ prec := b.precAndAssoc.productionPredence(p.num)
+ if prec != precNil {
+ prod.Precedence = prec
+ }
+
+ assoc := b.precAndAssoc.productionAssociativity(p.num)
+ switch assoc {
+ case assocTypeLeft:
+ prod.Associativity = "l"
+ case assocTypeRight:
+ prod.Associativity = "r"
+ }
+
+ prods[p.num.Int()] = prod
}
}