aboutsummaryrefslogtreecommitdiff
path: root/grammar/symbol/symbol.go
diff options
context:
space:
mode:
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