demo.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "fmt"
  6. "github.com/kpmy/tier"
  7. "io"
  8. "log"
  9. )
  10. const (
  11. Dash tier.SymCode = iota + tier.UserIota
  12. Z
  13. Colon
  14. Plus
  15. Minus = Dash
  16. )
  17. type Parser struct {
  18. tier.Marker
  19. r tier.Runner
  20. }
  21. func (p *Parser) FutureMark() tier.Marker { panic(126) }
  22. func (p *Parser) Mark(msg ...interface{}) {
  23. panic(fmt.Sprint(msg...))
  24. }
  25. func (p *Parser) Log(msg ...interface{}) {
  26. log.Println(msg...)
  27. }
  28. func (p *Parser) ConnectTo(rd io.Reader) {
  29. sc := tier.NewScanner(bufio.NewReader(rd), opts)
  30. p.r = tier.NewRunner(sc, p)
  31. //tier.Debug(p.r)
  32. }
  33. var opts tier.Opts
  34. func parse(ts string) {
  35. p := &Parser{}
  36. p.ConnectTo(bytes.NewBufferString(ts))
  37. log.Println(p.r.Assert(tier.Number, "number expected").Value)
  38. p.r.Assert(Dash, "dash expected")
  39. log.Println(p.r.Assert(tier.Number, "number expected").Value)
  40. p.r.Assert(Dash, "dash expected")
  41. log.Println(p.r.Assert(tier.Number, "number expected").Value)
  42. offset := ""
  43. getOffset := func() (offset string) {
  44. offset = p.r.Assert(tier.Number, "number expected").Value
  45. p.r.Assert(Colon, "colon expected")
  46. offset = offset + ":" + p.r.Assert(tier.Number, "number expected").Value
  47. return
  48. }
  49. if p.r.Await(Minus) {
  50. p.r.Next()
  51. offset = "-" + getOffset()
  52. } else if p.r.Is(Plus) {
  53. p.r.Next()
  54. offset = "+" + getOffset()
  55. } else if p.r.Is(Z) {
  56. offset = "Z"
  57. }
  58. if offset != "" {
  59. log.Println(offset)
  60. }
  61. log.Println()
  62. }
  63. func init() {
  64. log.SetFlags(0)
  65. opts = tier.DefaultOpts
  66. opts.CombinedMap["-"] = Dash
  67. opts.CombinedMap["+"] = Plus
  68. opts.CombinedMap[":"] = Colon
  69. opts.IdentMap["Z"] = Z
  70. }
  71. //xml datetime format
  72. func main() {
  73. parse("2015-11-05")
  74. parse("2015-11-05Z")
  75. parse("2015-11-05+04:00")
  76. parse("2015-11-05-01:00")
  77. }