gtf.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package sample
  2. var DefaultGrammar = map[string]string{
  3. "unicode": `\x{hex}{2} | \u{hex}{4} | \U{hex}{8}`,
  4. "null": `"null"`,
  5. "object": `"{" (kv ("," kv)*)? "}"`,
  6. "array": `"[" (value ("," value)*)? "]"`,
  7. "kv": `string ":" value`,
  8. "integer": `"0" | [1-9] [0-9]*`,
  9. "number": `"-"? integer frac? exp?`,
  10. "frac": `"." [0-9]+`,
  11. "exp": `("e" | "E") ("+" | "-") [0-9]+`,
  12. "string": `"\"" char* "\""`,
  13. "escape": `["/" | "b" | "f" | "n" | "r" | "t" | unicode]`,
  14. "char": `[^"\\] | escape`,
  15. "space": `(" " | "\t" | "\n" | "\r")*`,
  16. "hex": `[0-9] | [a-f] | [A-F]`,
  17. "boolean": `"true" | "false"`,
  18. "value": `object | array | string | number | boolean | "null"`,
  19. }
  20. const jsonString = `object | array`
  21. type StateMachine struct {
  22. states map[rune]State
  23. }
  24. type State struct {
  25. NextStates []string
  26. // bitmask?
  27. Mask []bool
  28. IsTerminal bool
  29. }
  30. func NewStateMachine(grammar map[string]string, startRule string) *StateMachine {
  31. states := make(map[rune]State)
  32. var cumu string
  33. flag := false
  34. for _, r := range startRule {
  35. if r == '"' {
  36. flag = !flag
  37. }
  38. if flag {
  39. cumu += string(r)
  40. }
  41. }
  42. sm := &StateMachine{
  43. states: states,
  44. }
  45. return sm
  46. }