diff options
Diffstat (limited to 'grammar/grammar.go')
-rw-r--r-- | grammar/grammar.go | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/grammar/grammar.go b/grammar/grammar.go index 60f1705..3268902 100644 --- a/grammar/grammar.go +++ b/grammar/grammar.go @@ -203,7 +203,7 @@ func (b *GrammarBuilder) genSymbolTableAndLexSpec(root *spec.RootNode) (*symbolT for _, prod := range root.LexProductions { if _, exist := symTab.toSymbol(prod.LHS); exist { b.errs = append(b.errs, &verr.SpecError{ - Cause: semErrDuplicateSym, + Cause: semErrDuplicateTerminal, Detail: prod.LHS, Row: prod.Pos.Row, }) @@ -280,7 +280,7 @@ func (b *GrammarBuilder) genSymbolTableAndLexSpec(root *spec.RootNode) (*symbolT for _, fragment := range root.Fragments { if _, exist := checkedFragments[fragment.LHS]; exist { b.errs = append(b.errs, &verr.SpecError{ - Cause: semErrDuplicateSym, + Cause: semErrDuplicateTerminal, Detail: fragment.LHS, Row: fragment.Pos.Row, }) @@ -432,10 +432,17 @@ func (b *GrammarBuilder) genProductionsAndActions(root *spec.RootNode, symTabAnd prods.append(p) for _, prod := range root.Productions { - _, err := symTab.registerNonTerminalSymbol(prod.LHS) + sym, err := symTab.registerNonTerminalSymbol(prod.LHS) if err != nil { return nil, err } + if sym.isTerminal() { + b.errs = append(b.errs, &verr.SpecError{ + Cause: semErrDuplicateName, + Detail: prod.LHS, + Row: prod.Pos.Row, + }) + } } for _, prod := range root.Productions { |