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