1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package sample
- var DefaultGrammar = map[string]string{
- "unicode": `\x{hex}{2} | \u{hex}{4} | \U{hex}{8}`,
- "null": `"null"`,
- "object": `"{" (kv ("," kv)*)? "}"`,
- "array": `"[" (value ("," value)*)? "]"`,
- "kv": `string ":" value`,
- "integer": `"0" | [1-9] [0-9]*`,
- "number": `"-"? integer frac? exp?`,
- "frac": `"." [0-9]+`,
- "exp": `("e" | "E") ("+" | "-") [0-9]+`,
- "string": `"\"" char* "\""`,
- "escape": `["/" | "b" | "f" | "n" | "r" | "t" | unicode]`,
- "char": `[^"\\] | escape`,
- "space": `(" " | "\t" | "\n" | "\r")*`,
- "hex": `[0-9] | [a-f] | [A-F]`,
- "boolean": `"true" | "false"`,
- "value": `object | array | string | number | boolean | "null"`,
- }
- const jsonString = `object | array`
- type StateMachine struct {
- states map[rune]State
- }
- type State struct {
- NextStates []string
- // bitmask?
- Mask []bool
- IsTerminal bool
- }
- func NewStateMachine(grammar map[string]string, startRule string) *StateMachine {
- states := make(map[rune]State)
- var cumu string
- flag := false
- for _, r := range startRule {
- if r == '"' {
- flag = !flag
- }
- if flag {
- cumu += string(r)
- }
- }
- sm := &StateMachine{
- states: states,
- }
- return sm
- }
|