diff options
Diffstat (limited to '')
-rw-r--r-- | grammar/symbol/symbol.go (renamed from grammar/symbol.go) | 136 |
1 files changed, 68 insertions, 68 deletions
diff --git a/grammar/symbol.go b/grammar/symbol/symbol.go index 9eba032..f9e6a93 100644 --- a/grammar/symbol.go +++ b/grammar/symbol/symbol.go @@ -1,4 +1,4 @@ -package grammar +package symbol import ( "fmt" @@ -16,15 +16,15 @@ func (t symbolKind) String() string { return string(t) } -type symbolNum uint16 +type SymbolNum uint16 -func (n symbolNum) Int() int { +func (n SymbolNum) Int() int { return int(n) } -type symbol uint16 +type Symbol uint16 -func (s symbol) String() string { +func (s Symbol) String() string { kind, isStart, isEOF, num := s.describe() var prefix string switch { @@ -56,24 +56,24 @@ const ( symbolNumStart = uint16(0x0001) // 0000 0000 0000 0001 symbolNumEOF = uint16(0x0001) // 0000 0000 0000 0001 - symbolNil = symbol(0) // 0000 0000 0000 0000 - symbolStart = symbol(maskNonTerminal | maskStartOrEOF | symbolNumStart) // 0100 0000 0000 0001 - symbolEOF = symbol(maskTerminal | maskStartOrEOF | symbolNumEOF) // 1100 0000 0000 0001: The EOF symbol is treated as a terminal symbol. + SymbolNil = Symbol(0) // 0000 0000 0000 0000 + symbolStart = Symbol(maskNonTerminal | maskStartOrEOF | symbolNumStart) // 0100 0000 0000 0001 + SymbolEOF = Symbol(maskTerminal | maskStartOrEOF | symbolNumEOF) // 1100 0000 0000 0001: The EOF symbol is treated as a terminal symbol. // The symbol name contains `<` and `>` to avoid conflicting with user-defined symbols. symbolNameEOF = "<eof>" - nonTerminalNumMin = symbolNum(2) // The number 1 is used by a start symbol. - terminalNumMin = symbolNum(2) // The number 1 is used by the EOF symbol. - symbolNumMax = symbolNum(0xffff) >> 2 // 0011 1111 1111 1111 + nonTerminalNumMin = SymbolNum(2) // The number 1 is used by a start symbol. + terminalNumMin = SymbolNum(2) // The number 1 is used by the EOF symbol. + symbolNumMax = SymbolNum(0xffff) >> 2 // 0011 1111 1111 1111 ) -func newSymbol(kind symbolKind, isStart bool, num symbolNum) (symbol, error) { +func newSymbol(kind symbolKind, isStart bool, num SymbolNum) (Symbol, error) { if num > symbolNumMax { - return symbolNil, fmt.Errorf("a symbol number exceeds the limit; limit: %v, passed: %v", symbolNumMax, num) + return SymbolNil, fmt.Errorf("a symbol number exceeds the limit; limit: %v, passed: %v", symbolNumMax, num) } if kind == symbolKindTerminal && isStart { - return symbolNil, fmt.Errorf("a start symbol must be a non-terminal symbol") + return SymbolNil, fmt.Errorf("a start symbol must be a non-terminal symbol") } kindMask := maskNonTerminal @@ -84,58 +84,58 @@ func newSymbol(kind symbolKind, isStart bool, num symbolNum) (symbol, error) { if isStart { startMask = maskStartOrEOF } - return symbol(kindMask | startMask | uint16(num)), nil + return Symbol(kindMask | startMask | uint16(num)), nil } -func (s symbol) num() symbolNum { +func (s Symbol) Num() SymbolNum { _, _, _, num := s.describe() return num } -func (s symbol) byte() []byte { - if s.isNil() { +func (s Symbol) Byte() []byte { + if s.IsNil() { return []byte{0, 0} } return []byte{byte(uint16(s) >> 8), byte(uint16(s) & 0x00ff)} } -func (s symbol) isNil() bool { +func (s Symbol) IsNil() bool { _, _, _, num := s.describe() return num == 0 } -func (s symbol) isStart() bool { - if s.isNil() { +func (s Symbol) IsStart() bool { + if s.IsNil() { return false } _, isStart, _, _ := s.describe() return isStart } -func (s symbol) isEOF() bool { - if s.isNil() { +func (s Symbol) isEOF() bool { + if s.IsNil() { return false } _, _, isEOF, _ := s.describe() return isEOF } -func (s symbol) isNonTerminal() bool { - if s.isNil() { +func (s Symbol) isNonTerminal() bool { + if s.IsNil() { return false } kind, _, _, _ := s.describe() return kind == symbolKindNonTerminal } -func (s symbol) isTerminal() bool { - if s.isNil() { +func (s Symbol) IsTerminal() bool { + if s.IsNil() { return false } return !s.isNonTerminal() } -func (s symbol) describe() (symbolKind, bool, bool, symbolNum) { +func (s Symbol) describe() (symbolKind, bool, bool, SymbolNum) { kind := symbolKindNonTerminal if uint16(s)&maskKindPart > 0 { kind = symbolKindTerminal @@ -149,34 +149,34 @@ func (s symbol) describe() (symbolKind, bool, bool, symbolNum) { isEOF = true } } - num := symbolNum(uint16(s) & maskNumberPart) + num := SymbolNum(uint16(s) & maskNumberPart) return kind, isStart, isEOF, num } -type symbolTable struct { - text2Sym map[string]symbol - sym2Text map[symbol]string +type SymbolTable struct { + text2Sym map[string]Symbol + sym2Text map[Symbol]string nonTermTexts []string termTexts []string - nonTermNum symbolNum - termNum symbolNum + nonTermNum SymbolNum + termNum SymbolNum } -type symbolTableWriter struct { - *symbolTable +type SymbolTableWriter struct { + *SymbolTable } -type symbolTableReader struct { - *symbolTable +type SymbolTableReader struct { + *SymbolTable } -func newSymbolTable() *symbolTable { - return &symbolTable{ - text2Sym: map[string]symbol{ - symbolNameEOF: symbolEOF, +func NewSymbolTable() *SymbolTable { + return &SymbolTable{ + text2Sym: map[string]Symbol{ + symbolNameEOF: SymbolEOF, }, - sym2Text: map[symbol]string{ - symbolEOF: symbolNameEOF, + sym2Text: map[Symbol]string{ + SymbolEOF: symbolNameEOF, }, termTexts: []string{ "", // Nil @@ -191,32 +191,32 @@ func newSymbolTable() *symbolTable { } } -func (t *symbolTable) writer() *symbolTableWriter { - return &symbolTableWriter{ - symbolTable: t, +func (t *SymbolTable) Writer() *SymbolTableWriter { + return &SymbolTableWriter{ + SymbolTable: t, } } -func (t *symbolTable) reader() *symbolTableReader { - return &symbolTableReader{ - symbolTable: t, +func (t *SymbolTable) Reader() *SymbolTableReader { + return &SymbolTableReader{ + SymbolTable: t, } } -func (w *symbolTableWriter) registerStartSymbol(text string) (symbol, error) { +func (w *SymbolTableWriter) RegisterStartSymbol(text string) (Symbol, error) { w.text2Sym[text] = symbolStart w.sym2Text[symbolStart] = text - w.nonTermTexts[symbolStart.num().Int()] = text + w.nonTermTexts[symbolStart.Num().Int()] = text return symbolStart, nil } -func (w *symbolTableWriter) registerNonTerminalSymbol(text string) (symbol, error) { +func (w *SymbolTableWriter) RegisterNonTerminalSymbol(text string) (Symbol, error) { if sym, ok := w.text2Sym[text]; ok { return sym, nil } sym, err := newSymbol(symbolKindNonTerminal, false, w.nonTermNum) if err != nil { - return symbolNil, err + return SymbolNil, err } w.nonTermNum++ w.text2Sym[text] = sym @@ -225,13 +225,13 @@ func (w *symbolTableWriter) registerNonTerminalSymbol(text string) (symbol, erro return sym, nil } -func (w *symbolTableWriter) registerTerminalSymbol(text string) (symbol, error) { +func (w *SymbolTableWriter) RegisterTerminalSymbol(text string) (Symbol, error) { if sym, ok := w.text2Sym[text]; ok { return sym, nil } sym, err := newSymbol(symbolKindTerminal, false, w.termNum) if err != nil { - return symbolNil, err + return SymbolNil, err } w.termNum++ w.text2Sym[text] = sym @@ -240,22 +240,22 @@ func (w *symbolTableWriter) registerTerminalSymbol(text string) (symbol, error) return sym, nil } -func (r *symbolTableReader) toSymbol(text string) (symbol, bool) { +func (r *SymbolTableReader) ToSymbol(text string) (Symbol, bool) { if sym, ok := r.text2Sym[text]; ok { return sym, true } - return symbolNil, false + return SymbolNil, false } -func (r *symbolTableReader) toText(sym symbol) (string, bool) { +func (r *SymbolTableReader) ToText(sym Symbol) (string, bool) { text, ok := r.sym2Text[sym] return text, ok } -func (r *symbolTableReader) terminalSymbols() []symbol { - syms := make([]symbol, 0, r.termNum.Int()-terminalNumMin.Int()) +func (r *SymbolTableReader) TerminalSymbols() []Symbol { + syms := make([]Symbol, 0, r.termNum.Int()-terminalNumMin.Int()) for sym := range r.sym2Text { - if !sym.isTerminal() || sym.isNil() { + if !sym.IsTerminal() || sym.IsNil() { continue } syms = append(syms, sym) @@ -266,17 +266,17 @@ func (r *symbolTableReader) terminalSymbols() []symbol { return syms } -func (r *symbolTableReader) terminalTexts() ([]string, error) { +func (r *SymbolTableReader) TerminalTexts() ([]string, error) { if r.termNum == terminalNumMin { return nil, fmt.Errorf("symbol table has no terminals") } return r.termTexts, nil } -func (r *symbolTableReader) nonTerminalSymbols() []symbol { - syms := make([]symbol, 0, r.nonTermNum.Int()-nonTerminalNumMin.Int()) +func (r *SymbolTableReader) NonTerminalSymbols() []Symbol { + syms := make([]Symbol, 0, r.nonTermNum.Int()-nonTerminalNumMin.Int()) for sym := range r.sym2Text { - if !sym.isNonTerminal() || sym.isNil() { + if !sym.isNonTerminal() || sym.IsNil() { continue } syms = append(syms, sym) @@ -287,8 +287,8 @@ func (r *symbolTableReader) nonTerminalSymbols() []symbol { return syms } -func (r *symbolTableReader) nonTerminalTexts() ([]string, error) { - if r.nonTermNum == nonTerminalNumMin || r.nonTermTexts[symbolStart.num().Int()] == "" { +func (r *SymbolTableReader) NonTerminalTexts() ([]string, error) { + if r.nonTermNum == nonTerminalNumMin || r.nonTermTexts[symbolStart.Num().Int()] == "" { return nil, fmt.Errorf("symbol table has no terminals or no start symbol") } return r.nonTermTexts, nil |