aboutsummaryrefslogtreecommitdiff
path: root/cmd/vartan/describe.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 /cmd/vartan/describe.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 'cmd/vartan/describe.go')
-rw-r--r--cmd/vartan/describe.go34
1 files changed, 31 insertions, 3 deletions
diff --git a/cmd/vartan/describe.go b/cmd/vartan/describe.go
index d9c3b01..c2cde93 100644
--- a/cmd/vartan/describe.go
+++ b/cmd/vartan/describe.go
@@ -153,12 +153,40 @@ func writeDescription(w io.Writer, desc *spec.Description) error {
return "No conflict was detected."
},
"printTerminal": func(term spec.Terminal) string {
+ var prec string
+ if term.Precedence != 0 {
+ prec = fmt.Sprintf("%2v", term.Precedence)
+ } else {
+ prec = " -"
+ }
+
+ var assoc string
+ if term.Associativity != "" {
+ assoc = term.Associativity
+ } else {
+ assoc = "-"
+ }
+
if term.Alias != "" {
- return fmt.Sprintf("%4v %v (%v)", term.Number, term.Name, term.Alias)
+ return fmt.Sprintf("%4v %v %v %v (%v)", term.Number, prec, assoc, term.Name, term.Alias)
}
- return fmt.Sprintf("%4v %v", term.Number, term.Name)
+ return fmt.Sprintf("%4v %v %v %v", term.Number, prec, assoc, term.Name)
},
"printProduction": func(prod spec.Production) string {
+ var prec string
+ if prod.Precedence != 0 {
+ prec = fmt.Sprintf("%2v", prod.Precedence)
+ } else {
+ prec = " -"
+ }
+
+ var assoc string
+ if prod.Associativity != "" {
+ assoc = prod.Associativity
+ } else {
+ assoc = "-"
+ }
+
var b strings.Builder
fmt.Fprintf(&b, "%v →", nonTermName(prod.LHS))
if len(prod.RHS) > 0 {
@@ -173,7 +201,7 @@ func writeDescription(w io.Writer, desc *spec.Description) error {
fmt.Fprintf(&b, " ε")
}
- return fmt.Sprintf("%4v %v", prod.Number, b.String())
+ return fmt.Sprintf("%4v %v %v %v", prod.Number, prec, assoc, b.String())
},
"printItem": func(item spec.Item) string {
prod := desc.Productions[item.Production]