github.com/jmigpin/editor@v1.6.0/util/parseutil/sampleparsers/jsonparser2.go (about) 1 package sampleparsers 2 3 import ( 4 "github.com/jmigpin/editor/util/parseutil" 5 ) 6 7 func ParseJson2(src []byte) (interface{}, error) { 8 p := NewJsonParser2() 9 return p.parseJson(src) 10 } 11 12 //---------- 13 14 type JsonParser2 struct { 15 sc *parseutil.Scanner 16 fn struct { 17 object parseutil.ScFn 18 array parseutil.ScFn 19 value parseutil.ScFn 20 number parseutil.ScFn 21 string parseutil.ScFn 22 element parseutil.ScFn 23 elements parseutil.ScFn 24 member parseutil.ScFn 25 members parseutil.ScFn 26 } 27 } 28 29 func NewJsonParser2() *JsonParser2 { 30 p := &JsonParser2{} 31 p.sc = parseutil.NewScanner() 32 //p.sc.Debug = true 33 34 // only defined later 35 members := func() error { 36 return p.fn.members() 37 } 38 elements := func() error { 39 return p.fn.elements() 40 } 41 42 p.fn.object = p.sc.P.And( 43 p.sc.P.Rune('{'), 44 p.sc.P.OptionalSpaces(), 45 p.sc.P.Optional(members), 46 p.sc.P.FatalOnErr("expecting '}'", 47 p.sc.P.Rune('}'), 48 ), 49 ) 50 p.fn.array = p.sc.P.And( 51 p.sc.P.Rune('['), 52 p.sc.P.OptionalSpaces(), 53 p.sc.P.Optional(elements), 54 p.sc.P.FatalOnErr("expecting ']'", 55 p.sc.P.Rune(']'), 56 ), 57 ) 58 p.fn.number = p.sc.P.Or( 59 p.sc.P.Float(), 60 p.sc.P.Integer(), 61 ) 62 p.fn.string = p.sc.P.DoubleQuotedString(3000) 63 p.fn.value = p.sc.P.Or( 64 p.fn.object, 65 p.fn.array, 66 p.fn.number, 67 p.fn.string, 68 p.sc.P.Sequence("true"), 69 p.sc.P.Sequence("false"), 70 p.sc.P.Sequence("null"), 71 ) 72 p.fn.element = p.sc.P.And( 73 p.sc.P.OptionalSpaces(), 74 p.fn.value, 75 p.sc.P.OptionalSpaces(), 76 ) 77 p.fn.member = p.sc.P.And( 78 p.sc.P.OptionalSpaces(), 79 p.fn.string, 80 p.sc.P.OptionalSpaces(), 81 p.sc.P.Rune(':'), 82 p.sc.P.FatalOnErr("member element", 83 p.fn.element, 84 ), 85 ) 86 p.fn.members = p.sc.P.Loop( 87 p.sc.P.FatalOnErr("member", 88 p.fn.member, 89 ), 90 p.sc.P.Rune(','), true, 91 ) 92 p.fn.elements = p.sc.P.Loop( 93 p.sc.P.FatalOnErr("element", 94 p.fn.element, 95 ), 96 p.sc.P.Rune(','), true, 97 ) 98 return p 99 } 100 101 func (p *JsonParser2) parseJson(src []byte) (any, error) { 102 p.sc.SetSrc(src) 103 if err := p.fn.element(); err != nil { 104 return nil, p.sc.SrcError2(err, 50) 105 } 106 return nil, nil 107 } 108 109 //---------- 110 //---------- 111 //---------- 112 113 type SParserFunc = parseutil.ScFn