diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-29 23:40:10 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-29 23:40:10 +0900 |
commit | bb85dcc57cc3c0fff6cc9dc09540d58fef400d6f (patch) | |
tree | 2fc6a20d0c644a79d454a48c49baa26423fbd10d /grammar/parsing_table.go | |
parent | Add describe command to print a description file (diff) | |
download | urubu-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.go | 30 |
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 } } |