xsql_manager.go 1.5 KB

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