lexer.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230
  1. // Package jlexer contains a JSON lexer implementation.
  2. //
  3. // It is expected that it is mostly used with generated parser code, so the interface is tuned
  4. // for a parser that knows what kind of data is expected.
  5. package jlexer
  6. import (
  7. "bytes"
  8. "encoding/base64"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "io"
  13. "strconv"
  14. "unicode"
  15. "unicode/utf16"
  16. "unicode/utf8"
  17. "github.com/josharian/intern"
  18. )
  19. // tokenKind determines type of a token.
  20. type tokenKind byte
  21. const (
  22. tokenUndef tokenKind = iota // No token.
  23. tokenDelim // Delimiter: one of '{', '}', '[' or ']'.
  24. tokenString // A string literal, e.g. "abc\u1234"
  25. tokenNumber // Number literal, e.g. 1.5e5
  26. tokenBool // Boolean literal: true or false.
  27. tokenNull // null keyword.
  28. )
  29. // token describes a single token: type, position in the input and value.
  30. type token struct {
  31. kind tokenKind // Type of a token.
  32. boolValue bool // Value if a boolean literal token.
  33. byteValueCloned bool // true if byteValue was allocated and does not refer to original json body
  34. byteValue []byte // Raw value of a token.
  35. delimValue byte
  36. }
  37. // Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice.
  38. type Lexer struct {
  39. Data []byte // Input data given to the lexer.
  40. start int // Start of the current token.
  41. pos int // Current unscanned position in the input stream.
  42. token token // Last scanned token, if token.kind != tokenUndef.
  43. firstElement bool // Whether current element is the first in array or an object.
  44. wantSep byte // A comma or a colon character, which need to occur before a token.
  45. UseMultipleErrors bool // If we want to use multiple errors.
  46. fatalError error // Fatal error occurred during lexing. It is usually a syntax error.
  47. multipleErrors []*LexerError // Semantic errors occurred during lexing. Marshalling will be continued after finding this errors.
  48. }
  49. // FetchToken scans the input for the next token.
  50. func (r *Lexer) FetchToken() {
  51. r.token.kind = tokenUndef
  52. r.start = r.pos
  53. // Check if r.Data has r.pos element
  54. // If it doesn't, it mean corrupted input data
  55. if len(r.Data) < r.pos {
  56. r.errParse("Unexpected end of data")
  57. return
  58. }
  59. // Determine the type of a token by skipping whitespace and reading the
  60. // first character.
  61. for _, c := range r.Data[r.pos:] {
  62. switch c {
  63. case ':', ',':
  64. if r.wantSep == c {
  65. r.pos++
  66. r.start++
  67. r.wantSep = 0
  68. } else {
  69. r.errSyntax()
  70. }
  71. case ' ', '\t', '\r', '\n':
  72. r.pos++
  73. r.start++
  74. case '"':
  75. if r.wantSep != 0 {
  76. r.errSyntax()
  77. }
  78. r.token.kind = tokenString
  79. r.fetchString()
  80. return
  81. case '{', '[':
  82. if r.wantSep != 0 {
  83. r.errSyntax()
  84. }
  85. r.firstElement = true
  86. r.token.kind = tokenDelim
  87. r.token.delimValue = r.Data[r.pos]
  88. r.pos++
  89. return
  90. case '}', ']':
  91. if !r.firstElement && (r.wantSep != ',') {
  92. r.errSyntax()
  93. }
  94. r.wantSep = 0
  95. r.token.kind = tokenDelim
  96. r.token.delimValue = r.Data[r.pos]
  97. r.pos++
  98. return
  99. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-':
  100. if r.wantSep != 0 {
  101. r.errSyntax()
  102. }
  103. r.token.kind = tokenNumber
  104. r.fetchNumber()
  105. return
  106. case 'n':
  107. if r.wantSep != 0 {
  108. r.errSyntax()
  109. }
  110. r.token.kind = tokenNull
  111. r.fetchNull()
  112. return
  113. case 't':
  114. if r.wantSep != 0 {
  115. r.errSyntax()
  116. }
  117. r.token.kind = tokenBool
  118. r.token.boolValue = true
  119. r.fetchTrue()
  120. return
  121. case 'f':
  122. if r.wantSep != 0 {
  123. r.errSyntax()
  124. }
  125. r.token.kind = tokenBool
  126. r.token.boolValue = false
  127. r.fetchFalse()
  128. return
  129. default:
  130. r.errSyntax()
  131. return
  132. }
  133. }
  134. r.fatalError = io.EOF
  135. return
  136. }
  137. // isTokenEnd returns true if the char can follow a non-delimiter token
  138. func isTokenEnd(c byte) bool {
  139. return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '[' || c == ']' || c == '{' || c == '}' || c == ',' || c == ':'
  140. }
  141. // fetchNull fetches and checks remaining bytes of null keyword.
  142. func (r *Lexer) fetchNull() {
  143. r.pos += 4
  144. if r.pos > len(r.Data) ||
  145. r.Data[r.pos-3] != 'u' ||
  146. r.Data[r.pos-2] != 'l' ||
  147. r.Data[r.pos-1] != 'l' ||
  148. (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) {
  149. r.pos -= 4
  150. r.errSyntax()
  151. }
  152. }
  153. // fetchTrue fetches and checks remaining bytes of true keyword.
  154. func (r *Lexer) fetchTrue() {
  155. r.pos += 4
  156. if r.pos > len(r.Data) ||
  157. r.Data[r.pos-3] != 'r' ||
  158. r.Data[r.pos-2] != 'u' ||
  159. r.Data[r.pos-1] != 'e' ||
  160. (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) {
  161. r.pos -= 4
  162. r.errSyntax()
  163. }
  164. }
  165. // fetchFalse fetches and checks remaining bytes of false keyword.
  166. func (r *Lexer) fetchFalse() {
  167. r.pos += 5
  168. if r.pos > len(r.Data) ||
  169. r.Data[r.pos-4] != 'a' ||
  170. r.Data[r.pos-3] != 'l' ||
  171. r.Data[r.pos-2] != 's' ||
  172. r.Data[r.pos-1] != 'e' ||
  173. (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) {
  174. r.pos -= 5
  175. r.errSyntax()
  176. }
  177. }
  178. // fetchNumber scans a number literal token.
  179. func (r *Lexer) fetchNumber() {
  180. hasE := false
  181. afterE := false
  182. hasDot := false
  183. r.pos++
  184. for i, c := range r.Data[r.pos:] {
  185. switch {
  186. case c >= '0' && c <= '9':
  187. afterE = false
  188. case c == '.' && !hasDot:
  189. hasDot = true
  190. case (c == 'e' || c == 'E') && !hasE:
  191. hasE = true
  192. hasDot = true
  193. afterE = true
  194. case (c == '+' || c == '-') && afterE:
  195. afterE = false
  196. default:
  197. r.pos += i
  198. if !isTokenEnd(c) {
  199. r.errSyntax()
  200. } else {
  201. r.token.byteValue = r.Data[r.start:r.pos]
  202. }
  203. return
  204. }
  205. }
  206. r.pos = len(r.Data)
  207. r.token.byteValue = r.Data[r.start:]
  208. }
  209. // findStringLen tries to scan into the string literal for ending quote char to determine required size.
  210. // The size will be exact if no escapes are present and may be inexact if there are escaped chars.
  211. func findStringLen(data []byte) (isValid bool, length int) {
  212. for {
  213. idx := bytes.IndexByte(data, '"')
  214. if idx == -1 {
  215. return false, len(data)
  216. }
  217. if idx == 0 || (idx > 0 && data[idx-1] != '\\') {
  218. return true, length + idx
  219. }
  220. // count \\\\\\\ sequences. even number of slashes means quote is not really escaped
  221. cnt := 1
  222. for idx-cnt-1 >= 0 && data[idx-cnt-1] == '\\' {
  223. cnt++
  224. }
  225. if cnt%2 == 0 {
  226. return true, length + idx
  227. }
  228. length += idx + 1
  229. data = data[idx+1:]
  230. }
  231. }
  232. // unescapeStringToken performs unescaping of string token.
  233. // if no escaping is needed, original string is returned, otherwise - a new one allocated
  234. func (r *Lexer) unescapeStringToken() (err error) {
  235. data := r.token.byteValue
  236. var unescapedData []byte
  237. for {
  238. i := bytes.IndexByte(data, '\\')
  239. if i == -1 {
  240. break
  241. }
  242. escapedRune, escapedBytes, err := decodeEscape(data[i:])
  243. if err != nil {
  244. r.errParse(err.Error())
  245. return err
  246. }
  247. if unescapedData == nil {
  248. unescapedData = make([]byte, 0, len(r.token.byteValue))
  249. }
  250. var d [4]byte
  251. s := utf8.EncodeRune(d[:], escapedRune)
  252. unescapedData = append(unescapedData, data[:i]...)
  253. unescapedData = append(unescapedData, d[:s]...)
  254. data = data[i+escapedBytes:]
  255. }
  256. if unescapedData != nil {
  257. r.token.byteValue = append(unescapedData, data...)
  258. r.token.byteValueCloned = true
  259. }
  260. return
  261. }
  262. // getu4 decodes \uXXXX from the beginning of s, returning the hex value,
  263. // or it returns -1.
  264. func getu4(s []byte) rune {
  265. if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
  266. return -1
  267. }
  268. var val rune
  269. for i := 2; i < len(s) && i < 6; i++ {
  270. var v byte
  271. c := s[i]
  272. switch c {
  273. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  274. v = c - '0'
  275. case 'a', 'b', 'c', 'd', 'e', 'f':
  276. v = c - 'a' + 10
  277. case 'A', 'B', 'C', 'D', 'E', 'F':
  278. v = c - 'A' + 10
  279. default:
  280. return -1
  281. }
  282. val <<= 4
  283. val |= rune(v)
  284. }
  285. return val
  286. }
  287. // decodeEscape processes a single escape sequence and returns number of bytes processed.
  288. func decodeEscape(data []byte) (decoded rune, bytesProcessed int, err error) {
  289. if len(data) < 2 {
  290. return 0, 0, errors.New("incorrect escape symbol \\ at the end of token")
  291. }
  292. c := data[1]
  293. switch c {
  294. case '"', '/', '\\':
  295. return rune(c), 2, nil
  296. case 'b':
  297. return '\b', 2, nil
  298. case 'f':
  299. return '\f', 2, nil
  300. case 'n':
  301. return '\n', 2, nil
  302. case 'r':
  303. return '\r', 2, nil
  304. case 't':
  305. return '\t', 2, nil
  306. case 'u':
  307. rr := getu4(data)
  308. if rr < 0 {
  309. return 0, 0, errors.New("incorrectly escaped \\uXXXX sequence")
  310. }
  311. read := 6
  312. if utf16.IsSurrogate(rr) {
  313. rr1 := getu4(data[read:])
  314. if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
  315. read += 6
  316. rr = dec
  317. } else {
  318. rr = unicode.ReplacementChar
  319. }
  320. }
  321. return rr, read, nil
  322. }
  323. return 0, 0, errors.New("incorrectly escaped bytes")
  324. }
  325. // fetchString scans a string literal token.
  326. func (r *Lexer) fetchString() {
  327. r.pos++
  328. data := r.Data[r.pos:]
  329. isValid, length := findStringLen(data)
  330. if !isValid {
  331. r.pos += length
  332. r.errParse("unterminated string literal")
  333. return
  334. }
  335. r.token.byteValue = data[:length]
  336. r.pos += length + 1 // skip closing '"' as well
  337. }
  338. // scanToken scans the next token if no token is currently available in the lexer.
  339. func (r *Lexer) scanToken() {
  340. if r.token.kind != tokenUndef || r.fatalError != nil {
  341. return
  342. }
  343. r.FetchToken()
  344. }
  345. // consume resets the current token to allow scanning the next one.
  346. func (r *Lexer) consume() {
  347. r.token.kind = tokenUndef
  348. r.token.delimValue = 0
  349. }
  350. // Ok returns true if no error (including io.EOF) was encountered during scanning.
  351. func (r *Lexer) Ok() bool {
  352. return r.fatalError == nil
  353. }
  354. const maxErrorContextLen = 13
  355. func (r *Lexer) errParse(what string) {
  356. if r.fatalError == nil {
  357. var str string
  358. if len(r.Data)-r.pos <= maxErrorContextLen {
  359. str = string(r.Data)
  360. } else {
  361. str = string(r.Data[r.pos:r.pos+maxErrorContextLen-3]) + "..."
  362. }
  363. r.fatalError = &LexerError{
  364. Reason: what,
  365. Offset: r.pos,
  366. Data: str,
  367. }
  368. }
  369. }
  370. func (r *Lexer) errSyntax() {
  371. r.errParse("syntax error")
  372. }
  373. func (r *Lexer) errInvalidToken(expected string) {
  374. if r.fatalError != nil {
  375. return
  376. }
  377. if r.UseMultipleErrors {
  378. r.pos = r.start
  379. r.consume()
  380. r.SkipRecursive()
  381. switch expected {
  382. case "[":
  383. r.token.delimValue = ']'
  384. r.token.kind = tokenDelim
  385. case "{":
  386. r.token.delimValue = '}'
  387. r.token.kind = tokenDelim
  388. }
  389. r.addNonfatalError(&LexerError{
  390. Reason: fmt.Sprintf("expected %s", expected),
  391. Offset: r.start,
  392. Data: string(r.Data[r.start:r.pos]),
  393. })
  394. return
  395. }
  396. var str string
  397. if len(r.token.byteValue) <= maxErrorContextLen {
  398. str = string(r.token.byteValue)
  399. } else {
  400. str = string(r.token.byteValue[:maxErrorContextLen-3]) + "..."
  401. }
  402. r.fatalError = &LexerError{
  403. Reason: fmt.Sprintf("expected %s", expected),
  404. Offset: r.pos,
  405. Data: str,
  406. }
  407. }
  408. func (r *Lexer) GetPos() int {
  409. return r.pos
  410. }
  411. // Delim consumes a token and verifies that it is the given delimiter.
  412. func (r *Lexer) Delim(c byte) {
  413. if r.token.kind == tokenUndef && r.Ok() {
  414. r.FetchToken()
  415. }
  416. if !r.Ok() || r.token.delimValue != c {
  417. r.consume() // errInvalidToken can change token if UseMultipleErrors is enabled.
  418. r.errInvalidToken(string([]byte{c}))
  419. } else {
  420. r.consume()
  421. }
  422. }
  423. // IsDelim returns true if there was no scanning error and next token is the given delimiter.
  424. func (r *Lexer) IsDelim(c byte) bool {
  425. if r.token.kind == tokenUndef && r.Ok() {
  426. r.FetchToken()
  427. }
  428. return !r.Ok() || r.token.delimValue == c
  429. }
  430. // Null verifies that the next token is null and consumes it.
  431. func (r *Lexer) Null() {
  432. if r.token.kind == tokenUndef && r.Ok() {
  433. r.FetchToken()
  434. }
  435. if !r.Ok() || r.token.kind != tokenNull {
  436. r.errInvalidToken("null")
  437. }
  438. r.consume()
  439. }
  440. // IsNull returns true if the next token is a null keyword.
  441. func (r *Lexer) IsNull() bool {
  442. if r.token.kind == tokenUndef && r.Ok() {
  443. r.FetchToken()
  444. }
  445. return r.Ok() && r.token.kind == tokenNull
  446. }
  447. // Skip skips a single token.
  448. func (r *Lexer) Skip() {
  449. if r.token.kind == tokenUndef && r.Ok() {
  450. r.FetchToken()
  451. }
  452. r.consume()
  453. }
  454. // SkipRecursive skips next array or object completely, or just skips a single token if not
  455. // an array/object.
  456. //
  457. // Note: no syntax validation is performed on the skipped data.
  458. func (r *Lexer) SkipRecursive() {
  459. r.scanToken()
  460. var start, end byte
  461. switch r.token.delimValue {
  462. case '{':
  463. start, end = '{', '}'
  464. case '[':
  465. start, end = '[', ']'
  466. default:
  467. r.consume()
  468. return
  469. }
  470. r.consume()
  471. level := 1
  472. inQuotes := false
  473. wasEscape := false
  474. for i, c := range r.Data[r.pos:] {
  475. switch {
  476. case c == start && !inQuotes:
  477. level++
  478. case c == end && !inQuotes:
  479. level--
  480. if level == 0 {
  481. r.pos += i + 1
  482. return
  483. }
  484. case c == '\\' && inQuotes:
  485. wasEscape = !wasEscape
  486. continue
  487. case c == '"' && inQuotes:
  488. inQuotes = wasEscape
  489. case c == '"':
  490. inQuotes = true
  491. }
  492. wasEscape = false
  493. }
  494. r.pos = len(r.Data)
  495. r.fatalError = &LexerError{
  496. Reason: "EOF reached while skipping array/object or token",
  497. Offset: r.pos,
  498. Data: string(r.Data[r.pos:]),
  499. }
  500. }
  501. // Raw fetches the next item recursively as a data slice
  502. func (r *Lexer) Raw() []byte {
  503. r.SkipRecursive()
  504. if !r.Ok() {
  505. return nil
  506. }
  507. return r.Data[r.start:r.pos]
  508. }
  509. // IsStart returns whether the lexer is positioned at the start
  510. // of an input string.
  511. func (r *Lexer) IsStart() bool {
  512. return r.pos == 0
  513. }
  514. // Consumed reads all remaining bytes from the input, publishing an error if
  515. // there is anything but whitespace remaining.
  516. func (r *Lexer) Consumed() {
  517. if r.pos > len(r.Data) || !r.Ok() {
  518. return
  519. }
  520. for _, c := range r.Data[r.pos:] {
  521. if c != ' ' && c != '\t' && c != '\r' && c != '\n' {
  522. r.AddError(&LexerError{
  523. Reason: "invalid character '" + string(c) + "' after top-level value",
  524. Offset: r.pos,
  525. Data: string(r.Data[r.pos:]),
  526. })
  527. return
  528. }
  529. r.pos++
  530. r.start++
  531. }
  532. }
  533. func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) {
  534. if r.token.kind == tokenUndef && r.Ok() {
  535. r.FetchToken()
  536. }
  537. if !r.Ok() || r.token.kind != tokenString {
  538. r.errInvalidToken("string")
  539. return "", nil
  540. }
  541. if !skipUnescape {
  542. if err := r.unescapeStringToken(); err != nil {
  543. r.errInvalidToken("string")
  544. return "", nil
  545. }
  546. }
  547. bytes := r.token.byteValue
  548. ret := bytesToStr(r.token.byteValue)
  549. r.consume()
  550. return ret, bytes
  551. }
  552. // UnsafeString returns the string value if the token is a string literal.
  553. //
  554. // Warning: returned string may point to the input buffer, so the string should not outlive
  555. // the input buffer. Intended pattern of usage is as an argument to a switch statement.
  556. func (r *Lexer) UnsafeString() string {
  557. ret, _ := r.unsafeString(false)
  558. return ret
  559. }
  560. // UnsafeBytes returns the byte slice if the token is a string literal.
  561. func (r *Lexer) UnsafeBytes() []byte {
  562. _, ret := r.unsafeString(false)
  563. return ret
  564. }
  565. // UnsafeFieldName returns current member name string token
  566. func (r *Lexer) UnsafeFieldName(skipUnescape bool) string {
  567. ret, _ := r.unsafeString(skipUnescape)
  568. return ret
  569. }
  570. // String reads a string literal.
  571. func (r *Lexer) String() string {
  572. if r.token.kind == tokenUndef && r.Ok() {
  573. r.FetchToken()
  574. }
  575. if !r.Ok() || r.token.kind != tokenString {
  576. r.errInvalidToken("string")
  577. return ""
  578. }
  579. if err := r.unescapeStringToken(); err != nil {
  580. r.errInvalidToken("string")
  581. return ""
  582. }
  583. var ret string
  584. if r.token.byteValueCloned {
  585. ret = bytesToStr(r.token.byteValue)
  586. } else {
  587. ret = string(r.token.byteValue)
  588. }
  589. r.consume()
  590. return ret
  591. }
  592. // StringIntern reads a string literal, and performs string interning on it.
  593. func (r *Lexer) StringIntern() string {
  594. if r.token.kind == tokenUndef && r.Ok() {
  595. r.FetchToken()
  596. }
  597. if !r.Ok() || r.token.kind != tokenString {
  598. r.errInvalidToken("string")
  599. return ""
  600. }
  601. if err := r.unescapeStringToken(); err != nil {
  602. r.errInvalidToken("string")
  603. return ""
  604. }
  605. ret := intern.Bytes(r.token.byteValue)
  606. r.consume()
  607. return ret
  608. }
  609. // Bytes reads a string literal and base64 decodes it into a byte slice.
  610. func (r *Lexer) Bytes() []byte {
  611. if r.token.kind == tokenUndef && r.Ok() {
  612. r.FetchToken()
  613. }
  614. if !r.Ok() || r.token.kind != tokenString {
  615. r.errInvalidToken("string")
  616. return nil
  617. }
  618. ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue)))
  619. n, err := base64.StdEncoding.Decode(ret, r.token.byteValue)
  620. if err != nil {
  621. r.fatalError = &LexerError{
  622. Reason: err.Error(),
  623. }
  624. return nil
  625. }
  626. r.consume()
  627. return ret[:n]
  628. }
  629. // Bool reads a true or false boolean keyword.
  630. func (r *Lexer) Bool() bool {
  631. if r.token.kind == tokenUndef && r.Ok() {
  632. r.FetchToken()
  633. }
  634. if !r.Ok() || r.token.kind != tokenBool {
  635. r.errInvalidToken("bool")
  636. return false
  637. }
  638. ret := r.token.boolValue
  639. r.consume()
  640. return ret
  641. }
  642. func (r *Lexer) number() string {
  643. if r.token.kind == tokenUndef && r.Ok() {
  644. r.FetchToken()
  645. }
  646. if !r.Ok() || r.token.kind != tokenNumber {
  647. r.errInvalidToken("number")
  648. return ""
  649. }
  650. ret := bytesToStr(r.token.byteValue)
  651. r.consume()
  652. return ret
  653. }
  654. func (r *Lexer) Uint8() uint8 {
  655. s := r.number()
  656. if !r.Ok() {
  657. return 0
  658. }
  659. n, err := strconv.ParseUint(s, 10, 8)
  660. if err != nil {
  661. r.addNonfatalError(&LexerError{
  662. Offset: r.start,
  663. Reason: err.Error(),
  664. Data: s,
  665. })
  666. }
  667. return uint8(n)
  668. }
  669. func (r *Lexer) Uint16() uint16 {
  670. s := r.number()
  671. if !r.Ok() {
  672. return 0
  673. }
  674. n, err := strconv.ParseUint(s, 10, 16)
  675. if err != nil {
  676. r.addNonfatalError(&LexerError{
  677. Offset: r.start,
  678. Reason: err.Error(),
  679. Data: s,
  680. })
  681. }
  682. return uint16(n)
  683. }
  684. func (r *Lexer) Uint32() uint32 {
  685. s := r.number()
  686. if !r.Ok() {
  687. return 0
  688. }
  689. n, err := strconv.ParseUint(s, 10, 32)
  690. if err != nil {
  691. r.addNonfatalError(&LexerError{
  692. Offset: r.start,
  693. Reason: err.Error(),
  694. Data: s,
  695. })
  696. }
  697. return uint32(n)
  698. }
  699. func (r *Lexer) Uint64() uint64 {
  700. s := r.number()
  701. if !r.Ok() {
  702. return 0
  703. }
  704. n, err := strconv.ParseUint(s, 10, 64)
  705. if err != nil {
  706. r.addNonfatalError(&LexerError{
  707. Offset: r.start,
  708. Reason: err.Error(),
  709. Data: s,
  710. })
  711. }
  712. return n
  713. }
  714. func (r *Lexer) Uint() uint {
  715. return uint(r.Uint64())
  716. }
  717. func (r *Lexer) Int8() int8 {
  718. s := r.number()
  719. if !r.Ok() {
  720. return 0
  721. }
  722. n, err := strconv.ParseInt(s, 10, 8)
  723. if err != nil {
  724. r.addNonfatalError(&LexerError{
  725. Offset: r.start,
  726. Reason: err.Error(),
  727. Data: s,
  728. })
  729. }
  730. return int8(n)
  731. }
  732. func (r *Lexer) Int16() int16 {
  733. s := r.number()
  734. if !r.Ok() {
  735. return 0
  736. }
  737. n, err := strconv.ParseInt(s, 10, 16)
  738. if err != nil {
  739. r.addNonfatalError(&LexerError{
  740. Offset: r.start,
  741. Reason: err.Error(),
  742. Data: s,
  743. })
  744. }
  745. return int16(n)
  746. }
  747. func (r *Lexer) Int32() int32 {
  748. s := r.number()
  749. if !r.Ok() {
  750. return 0
  751. }
  752. n, err := strconv.ParseInt(s, 10, 32)
  753. if err != nil {
  754. r.addNonfatalError(&LexerError{
  755. Offset: r.start,
  756. Reason: err.Error(),
  757. Data: s,
  758. })
  759. }
  760. return int32(n)
  761. }
  762. func (r *Lexer) Int64() int64 {
  763. s := r.number()
  764. if !r.Ok() {
  765. return 0
  766. }
  767. n, err := strconv.ParseInt(s, 10, 64)
  768. if err != nil {
  769. r.addNonfatalError(&LexerError{
  770. Offset: r.start,
  771. Reason: err.Error(),
  772. Data: s,
  773. })
  774. }
  775. return n
  776. }
  777. func (r *Lexer) Int() int {
  778. return int(r.Int64())
  779. }
  780. func (r *Lexer) Uint8Str() uint8 {
  781. s, b := r.unsafeString(false)
  782. if !r.Ok() {
  783. return 0
  784. }
  785. n, err := strconv.ParseUint(s, 10, 8)
  786. if err != nil {
  787. r.addNonfatalError(&LexerError{
  788. Offset: r.start,
  789. Reason: err.Error(),
  790. Data: string(b),
  791. })
  792. }
  793. return uint8(n)
  794. }
  795. func (r *Lexer) Uint16Str() uint16 {
  796. s, b := r.unsafeString(false)
  797. if !r.Ok() {
  798. return 0
  799. }
  800. n, err := strconv.ParseUint(s, 10, 16)
  801. if err != nil {
  802. r.addNonfatalError(&LexerError{
  803. Offset: r.start,
  804. Reason: err.Error(),
  805. Data: string(b),
  806. })
  807. }
  808. return uint16(n)
  809. }
  810. func (r *Lexer) Uint32Str() uint32 {
  811. s, b := r.unsafeString(false)
  812. if !r.Ok() {
  813. return 0
  814. }
  815. n, err := strconv.ParseUint(s, 10, 32)
  816. if err != nil {
  817. r.addNonfatalError(&LexerError{
  818. Offset: r.start,
  819. Reason: err.Error(),
  820. Data: string(b),
  821. })
  822. }
  823. return uint32(n)
  824. }
  825. func (r *Lexer) Uint64Str() uint64 {
  826. s, b := r.unsafeString(false)
  827. if !r.Ok() {
  828. return 0
  829. }
  830. n, err := strconv.ParseUint(s, 10, 64)
  831. if err != nil {
  832. r.addNonfatalError(&LexerError{
  833. Offset: r.start,
  834. Reason: err.Error(),
  835. Data: string(b),
  836. })
  837. }
  838. return n
  839. }
  840. func (r *Lexer) UintStr() uint {
  841. return uint(r.Uint64Str())
  842. }
  843. func (r *Lexer) UintptrStr() uintptr {
  844. return uintptr(r.Uint64Str())
  845. }
  846. func (r *Lexer) Int8Str() int8 {
  847. s, b := r.unsafeString(false)
  848. if !r.Ok() {
  849. return 0
  850. }
  851. n, err := strconv.ParseInt(s, 10, 8)
  852. if err != nil {
  853. r.addNonfatalError(&LexerError{
  854. Offset: r.start,
  855. Reason: err.Error(),
  856. Data: string(b),
  857. })
  858. }
  859. return int8(n)
  860. }
  861. func (r *Lexer) Int16Str() int16 {
  862. s, b := r.unsafeString(false)
  863. if !r.Ok() {
  864. return 0
  865. }
  866. n, err := strconv.ParseInt(s, 10, 16)
  867. if err != nil {
  868. r.addNonfatalError(&LexerError{
  869. Offset: r.start,
  870. Reason: err.Error(),
  871. Data: string(b),
  872. })
  873. }
  874. return int16(n)
  875. }
  876. func (r *Lexer) Int32Str() int32 {
  877. s, b := r.unsafeString(false)
  878. if !r.Ok() {
  879. return 0
  880. }
  881. n, err := strconv.ParseInt(s, 10, 32)
  882. if err != nil {
  883. r.addNonfatalError(&LexerError{
  884. Offset: r.start,
  885. Reason: err.Error(),
  886. Data: string(b),
  887. })
  888. }
  889. return int32(n)
  890. }
  891. func (r *Lexer) Int64Str() int64 {
  892. s, b := r.unsafeString(false)
  893. if !r.Ok() {
  894. return 0
  895. }
  896. n, err := strconv.ParseInt(s, 10, 64)
  897. if err != nil {
  898. r.addNonfatalError(&LexerError{
  899. Offset: r.start,
  900. Reason: err.Error(),
  901. Data: string(b),
  902. })
  903. }
  904. return n
  905. }
  906. func (r *Lexer) IntStr() int {
  907. return int(r.Int64Str())
  908. }
  909. func (r *Lexer) Float32() float32 {
  910. s := r.number()
  911. if !r.Ok() {
  912. return 0
  913. }
  914. n, err := strconv.ParseFloat(s, 32)
  915. if err != nil {
  916. r.addNonfatalError(&LexerError{
  917. Offset: r.start,
  918. Reason: err.Error(),
  919. Data: s,
  920. })
  921. }
  922. return float32(n)
  923. }
  924. func (r *Lexer) Float32Str() float32 {
  925. s, b := r.unsafeString(false)
  926. if !r.Ok() {
  927. return 0
  928. }
  929. n, err := strconv.ParseFloat(s, 32)
  930. if err != nil {
  931. r.addNonfatalError(&LexerError{
  932. Offset: r.start,
  933. Reason: err.Error(),
  934. Data: string(b),
  935. })
  936. }
  937. return float32(n)
  938. }
  939. func (r *Lexer) Float64() float64 {
  940. s := r.number()
  941. if !r.Ok() {
  942. return 0
  943. }
  944. n, err := strconv.ParseFloat(s, 64)
  945. if err != nil {
  946. r.addNonfatalError(&LexerError{
  947. Offset: r.start,
  948. Reason: err.Error(),
  949. Data: s,
  950. })
  951. }
  952. return n
  953. }
  954. func (r *Lexer) Float64Str() float64 {
  955. s, b := r.unsafeString(false)
  956. if !r.Ok() {
  957. return 0
  958. }
  959. n, err := strconv.ParseFloat(s, 64)
  960. if err != nil {
  961. r.addNonfatalError(&LexerError{
  962. Offset: r.start,
  963. Reason: err.Error(),
  964. Data: string(b),
  965. })
  966. }
  967. return n
  968. }
  969. func (r *Lexer) Error() error {
  970. return r.fatalError
  971. }
  972. func (r *Lexer) AddError(e error) {
  973. if r.fatalError == nil {
  974. r.fatalError = e
  975. }
  976. }
  977. func (r *Lexer) AddNonFatalError(e error) {
  978. r.addNonfatalError(&LexerError{
  979. Offset: r.start,
  980. Data: string(r.Data[r.start:r.pos]),
  981. Reason: e.Error(),
  982. })
  983. }
  984. func (r *Lexer) addNonfatalError(err *LexerError) {
  985. if r.UseMultipleErrors {
  986. // We don't want to add errors with the same offset.
  987. if len(r.multipleErrors) != 0 && r.multipleErrors[len(r.multipleErrors)-1].Offset == err.Offset {
  988. return
  989. }
  990. r.multipleErrors = append(r.multipleErrors, err)
  991. return
  992. }
  993. r.fatalError = err
  994. }
  995. func (r *Lexer) GetNonFatalErrors() []*LexerError {
  996. return r.multipleErrors
  997. }
  998. // JsonNumber fetches and json.Number from 'encoding/json' package.
  999. // Both int, float or string, contains them are valid values
  1000. func (r *Lexer) JsonNumber() json.Number {
  1001. if r.token.kind == tokenUndef && r.Ok() {
  1002. r.FetchToken()
  1003. }
  1004. if !r.Ok() {
  1005. r.errInvalidToken("json.Number")
  1006. return json.Number("")
  1007. }
  1008. switch r.token.kind {
  1009. case tokenString:
  1010. return json.Number(r.String())
  1011. case tokenNumber:
  1012. return json.Number(r.Raw())
  1013. case tokenNull:
  1014. r.Null()
  1015. return json.Number("")
  1016. default:
  1017. r.errSyntax()
  1018. return json.Number("")
  1019. }
  1020. }
  1021. // Interface fetches an interface{} analogous to the 'encoding/json' package.
  1022. func (r *Lexer) Interface() interface{} {
  1023. if r.token.kind == tokenUndef && r.Ok() {
  1024. r.FetchToken()
  1025. }
  1026. if !r.Ok() {
  1027. return nil
  1028. }
  1029. switch r.token.kind {
  1030. case tokenString:
  1031. return r.String()
  1032. case tokenNumber:
  1033. return r.Float64()
  1034. case tokenBool:
  1035. return r.Bool()
  1036. case tokenNull:
  1037. r.Null()
  1038. return nil
  1039. }
  1040. if r.token.delimValue == '{' {
  1041. r.consume()
  1042. ret := map[string]interface{}{}
  1043. for !r.IsDelim('}') {
  1044. key := r.String()
  1045. r.WantColon()
  1046. ret[key] = r.Interface()
  1047. r.WantComma()
  1048. }
  1049. r.Delim('}')
  1050. if r.Ok() {
  1051. return ret
  1052. } else {
  1053. return nil
  1054. }
  1055. } else if r.token.delimValue == '[' {
  1056. r.consume()
  1057. ret := []interface{}{}
  1058. for !r.IsDelim(']') {
  1059. ret = append(ret, r.Interface())
  1060. r.WantComma()
  1061. }
  1062. r.Delim(']')
  1063. if r.Ok() {
  1064. return ret
  1065. } else {
  1066. return nil
  1067. }
  1068. }
  1069. r.errSyntax()
  1070. return nil
  1071. }
  1072. // WantComma requires a comma to be present before fetching next token.
  1073. func (r *Lexer) WantComma() {
  1074. r.wantSep = ','
  1075. r.firstElement = false
  1076. }
  1077. // WantColon requires a colon to be present before fetching next token.
  1078. func (r *Lexer) WantColon() {
  1079. r.wantSep = ':'
  1080. r.firstElement = false
  1081. }