parser.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. /*
  2. * Copyright 2021 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package ast
  17. import (
  18. "fmt"
  19. "sync"
  20. "sync/atomic"
  21. "github.com/bytedance/sonic/internal/native/types"
  22. "github.com/bytedance/sonic/internal/rt"
  23. )
  24. const (
  25. _DEFAULT_NODE_CAP int = 16
  26. _APPEND_GROW_SHIFT = 1
  27. )
  28. const (
  29. _ERR_NOT_FOUND types.ParsingError = 33
  30. _ERR_UNSUPPORT_TYPE types.ParsingError = 34
  31. )
  32. var (
  33. // ErrNotExist means both key and value doesn't exist
  34. ErrNotExist error = newError(_ERR_NOT_FOUND, "value not exists")
  35. // ErrUnsupportType means API on the node is unsupported
  36. ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type")
  37. )
  38. type Parser struct {
  39. p int
  40. s string
  41. noLazy bool
  42. loadOnce bool
  43. skipValue bool
  44. dbuf *byte
  45. }
  46. /** Parser Private Methods **/
  47. func (self *Parser) delim() types.ParsingError {
  48. n := len(self.s)
  49. p := self.lspace(self.p)
  50. /* check for EOF */
  51. if p >= n {
  52. return types.ERR_EOF
  53. }
  54. /* check for the delimtier */
  55. if self.s[p] != ':' {
  56. return types.ERR_INVALID_CHAR
  57. }
  58. /* update the read pointer */
  59. self.p = p + 1
  60. return 0
  61. }
  62. func (self *Parser) object() types.ParsingError {
  63. n := len(self.s)
  64. p := self.lspace(self.p)
  65. /* check for EOF */
  66. if p >= n {
  67. return types.ERR_EOF
  68. }
  69. /* check for the delimtier */
  70. if self.s[p] != '{' {
  71. return types.ERR_INVALID_CHAR
  72. }
  73. /* update the read pointer */
  74. self.p = p + 1
  75. return 0
  76. }
  77. func (self *Parser) array() types.ParsingError {
  78. n := len(self.s)
  79. p := self.lspace(self.p)
  80. /* check for EOF */
  81. if p >= n {
  82. return types.ERR_EOF
  83. }
  84. /* check for the delimtier */
  85. if self.s[p] != '[' {
  86. return types.ERR_INVALID_CHAR
  87. }
  88. /* update the read pointer */
  89. self.p = p + 1
  90. return 0
  91. }
  92. func (self *Parser) lspace(sp int) int {
  93. ns := len(self.s)
  94. for ; sp<ns && isSpace(self.s[sp]); sp+=1 {}
  95. return sp
  96. }
  97. func (self *Parser) backward() {
  98. for ; self.p >= 0 && isSpace(self.s[self.p]); self.p-=1 {}
  99. }
  100. func (self *Parser) decodeArray(ret *linkedNodes) (Node, types.ParsingError) {
  101. sp := self.p
  102. ns := len(self.s)
  103. /* check for EOF */
  104. if self.p = self.lspace(sp); self.p >= ns {
  105. return Node{}, types.ERR_EOF
  106. }
  107. /* check for empty array */
  108. if self.s[self.p] == ']' {
  109. self.p++
  110. return Node{t: types.V_ARRAY}, 0
  111. }
  112. /* allocate array space and parse every element */
  113. for {
  114. var val Node
  115. var err types.ParsingError
  116. if self.skipValue {
  117. /* skip the value */
  118. var start int
  119. if start, err = self.skipFast(); err != 0 {
  120. return Node{}, err
  121. }
  122. if self.p > ns {
  123. return Node{}, types.ERR_EOF
  124. }
  125. t := switchRawType(self.s[start])
  126. if t == _V_NONE {
  127. return Node{}, types.ERR_INVALID_CHAR
  128. }
  129. val = newRawNode(self.s[start:self.p], t, false)
  130. }else{
  131. /* decode the value */
  132. if val, err = self.Parse(); err != 0 {
  133. return Node{}, err
  134. }
  135. }
  136. /* add the value to result */
  137. ret.Push(val)
  138. self.p = self.lspace(self.p)
  139. /* check for EOF */
  140. if self.p >= ns {
  141. return Node{}, types.ERR_EOF
  142. }
  143. /* check for the next character */
  144. switch self.s[self.p] {
  145. case ',' : self.p++
  146. case ']' : self.p++; return newArray(ret), 0
  147. default:
  148. // if val.isLazy() {
  149. // return newLazyArray(self, ret), 0
  150. // }
  151. return Node{}, types.ERR_INVALID_CHAR
  152. }
  153. }
  154. }
  155. func (self *Parser) decodeObject(ret *linkedPairs) (Node, types.ParsingError) {
  156. sp := self.p
  157. ns := len(self.s)
  158. /* check for EOF */
  159. if self.p = self.lspace(sp); self.p >= ns {
  160. return Node{}, types.ERR_EOF
  161. }
  162. /* check for empty object */
  163. if self.s[self.p] == '}' {
  164. self.p++
  165. return Node{t: types.V_OBJECT}, 0
  166. }
  167. /* decode each pair */
  168. for {
  169. var val Node
  170. var njs types.JsonState
  171. var err types.ParsingError
  172. /* decode the key */
  173. if njs = self.decodeValue(); njs.Vt != types.V_STRING {
  174. return Node{}, types.ERR_INVALID_CHAR
  175. }
  176. /* extract the key */
  177. idx := self.p - 1
  178. key := self.s[njs.Iv:idx]
  179. /* check for escape sequence */
  180. if njs.Ep != -1 {
  181. if key, err = unquote(key); err != 0 {
  182. return Node{}, err
  183. }
  184. }
  185. /* expect a ':' delimiter */
  186. if err = self.delim(); err != 0 {
  187. return Node{}, err
  188. }
  189. if self.skipValue {
  190. /* skip the value */
  191. var start int
  192. if start, err = self.skipFast(); err != 0 {
  193. return Node{}, err
  194. }
  195. if self.p > ns {
  196. return Node{}, types.ERR_EOF
  197. }
  198. t := switchRawType(self.s[start])
  199. if t == _V_NONE {
  200. return Node{}, types.ERR_INVALID_CHAR
  201. }
  202. val = newRawNode(self.s[start:self.p], t, false)
  203. } else {
  204. /* decode the value */
  205. if val, err = self.Parse(); err != 0 {
  206. return Node{}, err
  207. }
  208. }
  209. /* add the value to result */
  210. // FIXME: ret's address may change here, thus previous referred node in ret may be invalid !!
  211. ret.Push(NewPair(key, val))
  212. self.p = self.lspace(self.p)
  213. /* check for EOF */
  214. if self.p >= ns {
  215. return Node{}, types.ERR_EOF
  216. }
  217. /* check for the next character */
  218. switch self.s[self.p] {
  219. case ',' : self.p++
  220. case '}' : self.p++; return newObject(ret), 0
  221. default:
  222. // if val.isLazy() {
  223. // return newLazyObject(self, ret), 0
  224. // }
  225. return Node{}, types.ERR_INVALID_CHAR
  226. }
  227. }
  228. }
  229. func (self *Parser) decodeString(iv int64, ep int) (Node, types.ParsingError) {
  230. p := self.p - 1
  231. s := self.s[iv:p]
  232. /* fast path: no escape sequence */
  233. if ep == -1 {
  234. return NewString(s), 0
  235. }
  236. /* unquote the string */
  237. out, err := unquote(s)
  238. /* check for errors */
  239. if err != 0 {
  240. return Node{}, err
  241. } else {
  242. return newBytes(rt.Str2Mem(out)), 0
  243. }
  244. }
  245. /** Parser Interface **/
  246. func (self *Parser) Pos() int {
  247. return self.p
  248. }
  249. // Parse returns a ast.Node representing the parser's JSON.
  250. // NOTICE: the specific parsing lazy dependens parser's option
  251. // It only parse first layer and first child for Object or Array be default
  252. func (self *Parser) Parse() (Node, types.ParsingError) {
  253. switch val := self.decodeValue(); val.Vt {
  254. case types.V_EOF : return Node{}, types.ERR_EOF
  255. case types.V_NULL : return nullNode, 0
  256. case types.V_TRUE : return trueNode, 0
  257. case types.V_FALSE : return falseNode, 0
  258. case types.V_STRING : return self.decodeString(val.Iv, val.Ep)
  259. case types.V_ARRAY:
  260. s := self.p - 1;
  261. if p := skipBlank(self.s, self.p); p >= self.p && self.s[p] == ']' {
  262. self.p = p + 1
  263. return Node{t: types.V_ARRAY}, 0
  264. }
  265. if self.noLazy {
  266. if self.loadOnce {
  267. self.noLazy = false
  268. }
  269. return self.decodeArray(new(linkedNodes))
  270. }
  271. // NOTICE: loadOnce always keep raw json for object or array
  272. if self.loadOnce {
  273. self.p = s
  274. s, e := self.skipFast()
  275. if e != 0 {
  276. return Node{}, e
  277. }
  278. return newRawNode(self.s[s:self.p], types.V_ARRAY, true), 0
  279. }
  280. return newLazyArray(self), 0
  281. case types.V_OBJECT:
  282. s := self.p - 1;
  283. if p := skipBlank(self.s, self.p); p >= self.p && self.s[p] == '}' {
  284. self.p = p + 1
  285. return Node{t: types.V_OBJECT}, 0
  286. }
  287. // NOTICE: loadOnce always keep raw json for object or array
  288. if self.noLazy {
  289. if self.loadOnce {
  290. self.noLazy = false
  291. }
  292. return self.decodeObject(new(linkedPairs))
  293. }
  294. if self.loadOnce {
  295. self.p = s
  296. s, e := self.skipFast()
  297. if e != 0 {
  298. return Node{}, e
  299. }
  300. return newRawNode(self.s[s:self.p], types.V_OBJECT, true), 0
  301. }
  302. return newLazyObject(self), 0
  303. case types.V_DOUBLE : return NewNumber(self.s[val.Ep:self.p]), 0
  304. case types.V_INTEGER : return NewNumber(self.s[val.Ep:self.p]), 0
  305. default : return Node{}, types.ParsingError(-val.Vt)
  306. }
  307. }
  308. func (self *Parser) searchKey(match string) types.ParsingError {
  309. ns := len(self.s)
  310. if err := self.object(); err != 0 {
  311. return err
  312. }
  313. /* check for EOF */
  314. if self.p = self.lspace(self.p); self.p >= ns {
  315. return types.ERR_EOF
  316. }
  317. /* check for empty object */
  318. if self.s[self.p] == '}' {
  319. self.p++
  320. return _ERR_NOT_FOUND
  321. }
  322. var njs types.JsonState
  323. var err types.ParsingError
  324. /* decode each pair */
  325. for {
  326. /* decode the key */
  327. if njs = self.decodeValue(); njs.Vt != types.V_STRING {
  328. return types.ERR_INVALID_CHAR
  329. }
  330. /* extract the key */
  331. idx := self.p - 1
  332. key := self.s[njs.Iv:idx]
  333. /* check for escape sequence */
  334. if njs.Ep != -1 {
  335. if key, err = unquote(key); err != 0 {
  336. return err
  337. }
  338. }
  339. /* expect a ':' delimiter */
  340. if err = self.delim(); err != 0 {
  341. return err
  342. }
  343. /* skip value */
  344. if key != match {
  345. if _, err = self.skipFast(); err != 0 {
  346. return err
  347. }
  348. } else {
  349. return 0
  350. }
  351. /* check for EOF */
  352. self.p = self.lspace(self.p)
  353. if self.p >= ns {
  354. return types.ERR_EOF
  355. }
  356. /* check for the next character */
  357. switch self.s[self.p] {
  358. case ',':
  359. self.p++
  360. case '}':
  361. self.p++
  362. return _ERR_NOT_FOUND
  363. default:
  364. return types.ERR_INVALID_CHAR
  365. }
  366. }
  367. }
  368. func (self *Parser) searchIndex(idx int) types.ParsingError {
  369. ns := len(self.s)
  370. if err := self.array(); err != 0 {
  371. return err
  372. }
  373. /* check for EOF */
  374. if self.p = self.lspace(self.p); self.p >= ns {
  375. return types.ERR_EOF
  376. }
  377. /* check for empty array */
  378. if self.s[self.p] == ']' {
  379. self.p++
  380. return _ERR_NOT_FOUND
  381. }
  382. var err types.ParsingError
  383. /* allocate array space and parse every element */
  384. for i := 0; i < idx; i++ {
  385. /* decode the value */
  386. if _, err = self.skipFast(); err != 0 {
  387. return err
  388. }
  389. /* check for EOF */
  390. self.p = self.lspace(self.p)
  391. if self.p >= ns {
  392. return types.ERR_EOF
  393. }
  394. /* check for the next character */
  395. switch self.s[self.p] {
  396. case ',':
  397. self.p++
  398. case ']':
  399. self.p++
  400. return _ERR_NOT_FOUND
  401. default:
  402. return types.ERR_INVALID_CHAR
  403. }
  404. }
  405. return 0
  406. }
  407. func (self *Node) skipNextNode() *Node {
  408. if !self.isLazy() {
  409. return nil
  410. }
  411. parser, stack := self.getParserAndArrayStack()
  412. ret := &stack.v
  413. sp := parser.p
  414. ns := len(parser.s)
  415. /* check for EOF */
  416. if parser.p = parser.lspace(sp); parser.p >= ns {
  417. return newSyntaxError(parser.syntaxError(types.ERR_EOF))
  418. }
  419. /* check for empty array */
  420. if parser.s[parser.p] == ']' {
  421. parser.p++
  422. self.setArray(ret)
  423. return nil
  424. }
  425. var val Node
  426. /* skip the value */
  427. if start, err := parser.skipFast(); err != 0 {
  428. return newSyntaxError(parser.syntaxError(err))
  429. } else {
  430. t := switchRawType(parser.s[start])
  431. if t == _V_NONE {
  432. return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))
  433. }
  434. val = newRawNode(parser.s[start:parser.p], t, false)
  435. }
  436. /* add the value to result */
  437. ret.Push(val)
  438. self.l++
  439. parser.p = parser.lspace(parser.p)
  440. /* check for EOF */
  441. if parser.p >= ns {
  442. return newSyntaxError(parser.syntaxError(types.ERR_EOF))
  443. }
  444. /* check for the next character */
  445. switch parser.s[parser.p] {
  446. case ',':
  447. parser.p++
  448. return ret.At(ret.Len()-1)
  449. case ']':
  450. parser.p++
  451. self.setArray(ret)
  452. return ret.At(ret.Len()-1)
  453. default:
  454. return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))
  455. }
  456. }
  457. func (self *Node) skipNextPair() (*Pair) {
  458. if !self.isLazy() {
  459. return nil
  460. }
  461. parser, stack := self.getParserAndObjectStack()
  462. ret := &stack.v
  463. sp := parser.p
  464. ns := len(parser.s)
  465. /* check for EOF */
  466. if parser.p = parser.lspace(sp); parser.p >= ns {
  467. return newErrorPair(parser.syntaxError(types.ERR_EOF))
  468. }
  469. /* check for empty object */
  470. if parser.s[parser.p] == '}' {
  471. parser.p++
  472. self.setObject(ret)
  473. return nil
  474. }
  475. /* decode one pair */
  476. var val Node
  477. var njs types.JsonState
  478. var err types.ParsingError
  479. /* decode the key */
  480. if njs = parser.decodeValue(); njs.Vt != types.V_STRING {
  481. return newErrorPair(parser.syntaxError(types.ERR_INVALID_CHAR))
  482. }
  483. /* extract the key */
  484. idx := parser.p - 1
  485. key := parser.s[njs.Iv:idx]
  486. /* check for escape sequence */
  487. if njs.Ep != -1 {
  488. if key, err = unquote(key); err != 0 {
  489. return newErrorPair(parser.syntaxError(err))
  490. }
  491. }
  492. /* expect a ':' delimiter */
  493. if err = parser.delim(); err != 0 {
  494. return newErrorPair(parser.syntaxError(err))
  495. }
  496. /* skip the value */
  497. if start, err := parser.skipFast(); err != 0 {
  498. return newErrorPair(parser.syntaxError(err))
  499. } else {
  500. t := switchRawType(parser.s[start])
  501. if t == _V_NONE {
  502. return newErrorPair(parser.syntaxError(types.ERR_INVALID_CHAR))
  503. }
  504. val = newRawNode(parser.s[start:parser.p], t, false)
  505. }
  506. /* add the value to result */
  507. ret.Push(NewPair(key, val))
  508. self.l++
  509. parser.p = parser.lspace(parser.p)
  510. /* check for EOF */
  511. if parser.p >= ns {
  512. return newErrorPair(parser.syntaxError(types.ERR_EOF))
  513. }
  514. /* check for the next character */
  515. switch parser.s[parser.p] {
  516. case ',':
  517. parser.p++
  518. return ret.At(ret.Len()-1)
  519. case '}':
  520. parser.p++
  521. self.setObject(ret)
  522. return ret.At(ret.Len()-1)
  523. default:
  524. return newErrorPair(parser.syntaxError(types.ERR_INVALID_CHAR))
  525. }
  526. }
  527. /** Parser Factory **/
  528. // Loads parse all json into interface{}
  529. func Loads(src string) (int, interface{}, error) {
  530. ps := &Parser{s: src}
  531. np, err := ps.Parse()
  532. /* check for errors */
  533. if err != 0 {
  534. return 0, nil, ps.ExportError(err)
  535. } else {
  536. x, err := np.Interface()
  537. if err != nil {
  538. return 0, nil, err
  539. }
  540. return ps.Pos(), x, nil
  541. }
  542. }
  543. // LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number
  544. func LoadsUseNumber(src string) (int, interface{}, error) {
  545. ps := &Parser{s: src}
  546. np, err := ps.Parse()
  547. /* check for errors */
  548. if err != 0 {
  549. return 0, nil, err
  550. } else {
  551. x, err := np.InterfaceUseNumber()
  552. if err != nil {
  553. return 0, nil, err
  554. }
  555. return ps.Pos(), x, nil
  556. }
  557. }
  558. // NewParser returns pointer of new allocated parser
  559. func NewParser(src string) *Parser {
  560. return &Parser{s: src}
  561. }
  562. // NewParser returns new allocated parser
  563. func NewParserObj(src string) Parser {
  564. return Parser{s: src}
  565. }
  566. // decodeNumber controls if parser decodes the number values instead of skip them
  567. // WARN: once you set decodeNumber(true), please set decodeNumber(false) before you drop the parser
  568. // otherwise the memory CANNOT be reused
  569. func (self *Parser) decodeNumber(decode bool) {
  570. if !decode && self.dbuf != nil {
  571. types.FreeDbuf(self.dbuf)
  572. self.dbuf = nil
  573. return
  574. }
  575. if decode && self.dbuf == nil {
  576. self.dbuf = types.NewDbuf()
  577. }
  578. }
  579. // ExportError converts types.ParsingError to std Error
  580. func (self *Parser) ExportError(err types.ParsingError) error {
  581. if err == _ERR_NOT_FOUND {
  582. return ErrNotExist
  583. }
  584. return fmt.Errorf("%q", SyntaxError{
  585. Pos : self.p,
  586. Src : self.s,
  587. Code: err,
  588. }.Description())
  589. }
  590. func backward(src string, i int) int {
  591. for ; i>=0 && isSpace(src[i]); i-- {}
  592. return i
  593. }
  594. func newRawNode(str string, typ types.ValueType, lock bool) Node {
  595. ret := Node{
  596. t: typ | _V_RAW,
  597. p: rt.StrPtr(str),
  598. l: uint(len(str)),
  599. }
  600. if lock {
  601. ret.m = new(sync.RWMutex)
  602. }
  603. return ret
  604. }
  605. var typeJumpTable = [256]types.ValueType{
  606. '"' : types.V_STRING,
  607. '-' : _V_NUMBER,
  608. '0' : _V_NUMBER,
  609. '1' : _V_NUMBER,
  610. '2' : _V_NUMBER,
  611. '3' : _V_NUMBER,
  612. '4' : _V_NUMBER,
  613. '5' : _V_NUMBER,
  614. '6' : _V_NUMBER,
  615. '7' : _V_NUMBER,
  616. '8' : _V_NUMBER,
  617. '9' : _V_NUMBER,
  618. '[' : types.V_ARRAY,
  619. 'f' : types.V_FALSE,
  620. 'n' : types.V_NULL,
  621. 't' : types.V_TRUE,
  622. '{' : types.V_OBJECT,
  623. }
  624. func switchRawType(c byte) types.ValueType {
  625. return typeJumpTable[c]
  626. }
  627. func (self *Node) loadt() types.ValueType {
  628. return (types.ValueType)(atomic.LoadInt64(&self.t))
  629. }
  630. func (self *Node) lock() bool {
  631. if m := self.m; m != nil {
  632. m.Lock()
  633. return true
  634. }
  635. return false
  636. }
  637. func (self *Node) unlock() {
  638. if m := self.m; m != nil {
  639. m.Unlock()
  640. }
  641. }
  642. func (self *Node) rlock() bool {
  643. if m := self.m; m != nil {
  644. m.RLock()
  645. return true
  646. }
  647. return false
  648. }
  649. func (self *Node) runlock() {
  650. if m := self.m; m != nil {
  651. m.RUnlock()
  652. }
  653. }