xsql_manager.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package xsql
  2. import (
  3. "fmt"
  4. )
  5. var (
  6. Language = &ParseTree{}
  7. FuncRegisters []FunctionRegister
  8. parserFuncRuntime *funcRuntime
  9. )
  10. type ParseTree struct {
  11. Handlers map[Token]func(*Parser) (Statement, error)
  12. Tokens map[Token]*ParseTree
  13. Keys []string
  14. }
  15. func (t *ParseTree) Handle(tok Token, fn func(*Parser) (Statement, error)) {
  16. // Verify that there is no conflict for this token in this parse tree.
  17. if _, conflict := t.Tokens[tok]; conflict {
  18. panic(fmt.Sprintf("conflict for token %s", tok))
  19. }
  20. if _, conflict := t.Handlers[tok]; conflict {
  21. panic(fmt.Sprintf("conflict for token %s", tok))
  22. }
  23. if t.Handlers == nil {
  24. t.Handlers = make(map[Token]func(*Parser) (Statement, error))
  25. }
  26. t.Handlers[tok] = fn
  27. t.Keys = append(t.Keys, tok.String())
  28. }
  29. func (pt *ParseTree) Parse(p *Parser) (Statement, error) {
  30. tok, _ := p.scanIgnoreWhitespace()
  31. p.unscan()
  32. if f, ok := pt.Handlers[tok]; ok {
  33. return f(p)
  34. }
  35. return nil, nil
  36. }
  37. func init() {
  38. Language.Handle(SELECT, func(p *Parser) (Statement, error) {
  39. return p.Parse()
  40. })
  41. Language.Handle(CREATE, func(p *Parser) (statement Statement, e error) {
  42. return p.ParseCreateStmt()
  43. })
  44. Language.Handle(SHOW, func(p *Parser) (statement Statement, e error) {
  45. return p.parseShowStmt()
  46. })
  47. Language.Handle(EXPLAIN, func(p *Parser) (statement Statement, e error) {
  48. return p.parseExplainStmt()
  49. })
  50. Language.Handle(DESCRIBE, func(p *Parser) (statement Statement, e error) {
  51. return p.parseDescribeStmt()
  52. })
  53. Language.Handle(DROP, func(p *Parser) (statement Statement, e error) {
  54. return p.parseDropStmt()
  55. })
  56. InitFuncRegisters()
  57. }
  58. func InitFuncRegisters(registers ...FunctionRegister) {
  59. FuncRegisters = registers
  60. parserFuncRuntime = NewFuncRuntime(nil, registers)
  61. }