lexer.go 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
  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.byteValueCloned = false
  349. r.token.delimValue = 0
  350. }
  351. // Ok returns true if no error (including io.EOF) was encountered during scanning.
  352. func (r *Lexer) Ok() bool {
  353. return r.fatalError == nil
  354. }
  355. const maxErrorContextLen = 13
  356. func (r *Lexer) errParse(what string) {
  357. if r.fatalError == nil {
  358. var str string
  359. if len(r.Data)-r.pos <= maxErrorContextLen {
  360. str = string(r.Data)
  361. } else {
  362. str = string(r.Data[r.pos:r.pos+maxErrorContextLen-3]) + "..."
  363. }
  364. r.fatalError = &LexerError{
  365. Reason: what,
  366. Offset: r.pos,
  367. Data: str,
  368. }
  369. }
  370. }
  371. func (r *Lexer) errSyntax() {
  372. r.errParse("syntax error")
  373. }
  374. func (r *Lexer) errInvalidToken(expected string) {
  375. if r.fatalError != nil {
  376. return
  377. }
  378. if r.UseMultipleErrors {
  379. r.pos = r.start
  380. r.consume()
  381. r.SkipRecursive()
  382. switch expected {
  383. case "[":
  384. r.token.delimValue = ']'
  385. r.token.kind = tokenDelim
  386. case "{":
  387. r.token.delimValue = '}'
  388. r.token.kind = tokenDelim
  389. }
  390. r.addNonfatalError(&LexerError{
  391. Reason: fmt.Sprintf("expected %s", expected),
  392. Offset: r.start,
  393. Data: string(r.Data[r.start:r.pos]),
  394. })
  395. return
  396. }
  397. var str string
  398. if len(r.token.byteValue) <= maxErrorContextLen {
  399. str = string(r.token.byteValue)
  400. } else {
  401. str = string(r.token.byteValue[:maxErrorContextLen-3]) + "..."
  402. }
  403. r.fatalError = &LexerError{
  404. Reason: fmt.Sprintf("expected %s", expected),
  405. Offset: r.pos,
  406. Data: str,
  407. }
  408. }
  409. func (r *Lexer) GetPos() int {
  410. return r.pos
  411. }
  412. // Delim consumes a token and verifies that it is the given delimiter.
  413. func (r *Lexer) Delim(c byte) {
  414. if r.token.kind == tokenUndef && r.Ok() {
  415. r.FetchToken()
  416. }
  417. if !r.Ok() || r.token.delimValue != c {
  418. r.consume() // errInvalidToken can change token if UseMultipleErrors is enabled.
  419. r.errInvalidToken(string([]byte{c}))
  420. } else {
  421. r.consume()
  422. }
  423. }
  424. // IsDelim returns true if there was no scanning error and next token is the given delimiter.
  425. func (r *Lexer) IsDelim(c byte) bool {
  426. if r.token.kind == tokenUndef && r.Ok() {
  427. r.FetchToken()
  428. }
  429. return !r.Ok() || r.token.delimValue == c
  430. }
  431. // Null verifies that the next token is null and consumes it.
  432. func (r *Lexer) Null() {
  433. if r.token.kind == tokenUndef && r.Ok() {
  434. r.FetchToken()
  435. }
  436. if !r.Ok() || r.token.kind != tokenNull {
  437. r.errInvalidToken("null")
  438. }
  439. r.consume()
  440. }
  441. // IsNull returns true if the next token is a null keyword.
  442. func (r *Lexer) IsNull() bool {
  443. if r.token.kind == tokenUndef && r.Ok() {
  444. r.FetchToken()
  445. }
  446. return r.Ok() && r.token.kind == tokenNull
  447. }
  448. // Skip skips a single token.
  449. func (r *Lexer) Skip() {
  450. if r.token.kind == tokenUndef && r.Ok() {
  451. r.FetchToken()
  452. }
  453. r.consume()
  454. }
  455. // SkipRecursive skips next array or object completely, or just skips a single token if not
  456. // an array/object.
  457. //
  458. // Note: no syntax validation is performed on the skipped data.
  459. func (r *Lexer) SkipRecursive() {
  460. r.scanToken()
  461. var start, end byte
  462. startPos := r.start
  463. switch r.token.delimValue {
  464. case '{':
  465. start, end = '{', '}'
  466. case '[':
  467. start, end = '[', ']'
  468. default:
  469. r.consume()
  470. return
  471. }
  472. r.consume()
  473. level := 1
  474. inQuotes := false
  475. wasEscape := false
  476. for i, c := range r.Data[r.pos:] {
  477. switch {
  478. case c == start && !inQuotes:
  479. level++
  480. case c == end && !inQuotes:
  481. level--
  482. if level == 0 {
  483. r.pos += i + 1
  484. if !json.Valid(r.Data[startPos:r.pos]) {
  485. r.pos = len(r.Data)
  486. r.fatalError = &LexerError{
  487. Reason: "skipped array/object json value is invalid",
  488. Offset: r.pos,
  489. Data: string(r.Data[r.pos:]),
  490. }
  491. }
  492. return
  493. }
  494. case c == '\\' && inQuotes:
  495. wasEscape = !wasEscape
  496. continue
  497. case c == '"' && inQuotes:
  498. inQuotes = wasEscape
  499. case c == '"':
  500. inQuotes = true
  501. }
  502. wasEscape = false
  503. }
  504. r.pos = len(r.Data)
  505. r.fatalError = &LexerError{
  506. Reason: "EOF reached while skipping array/object or token",
  507. Offset: r.pos,
  508. Data: string(r.Data[r.pos:]),
  509. }
  510. }
  511. // Raw fetches the next item recursively as a data slice
  512. func (r *Lexer) Raw() []byte {
  513. r.SkipRecursive()
  514. if !r.Ok() {
  515. return nil
  516. }
  517. return r.Data[r.start:r.pos]
  518. }
  519. // IsStart returns whether the lexer is positioned at the start
  520. // of an input string.
  521. func (r *Lexer) IsStart() bool {
  522. return r.pos == 0
  523. }
  524. // Consumed reads all remaining bytes from the input, publishing an error if
  525. // there is anything but whitespace remaining.
  526. func (r *Lexer) Consumed() {
  527. if r.pos > len(r.Data) || !r.Ok() {
  528. return
  529. }
  530. for _, c := range r.Data[r.pos:] {
  531. if c != ' ' && c != '\t' && c != '\r' && c != '\n' {
  532. r.AddError(&LexerError{
  533. Reason: "invalid character '" + string(c) + "' after top-level value",
  534. Offset: r.pos,
  535. Data: string(r.Data[r.pos:]),
  536. })
  537. return
  538. }
  539. r.pos++
  540. r.start++
  541. }
  542. }
  543. func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) {
  544. if r.token.kind == tokenUndef && r.Ok() {
  545. r.FetchToken()
  546. }
  547. if !r.Ok() || r.token.kind != tokenString {
  548. r.errInvalidToken("string")
  549. return "", nil
  550. }
  551. if !skipUnescape {
  552. if err := r.unescapeStringToken(); err != nil {
  553. r.errInvalidToken("string")
  554. return "", nil
  555. }
  556. }
  557. bytes := r.token.byteValue
  558. ret := bytesToStr(r.token.byteValue)
  559. r.consume()
  560. return ret, bytes
  561. }
  562. // UnsafeString returns the string value if the token is a string literal.
  563. //
  564. // Warning: returned string may point to the input buffer, so the string should not outlive
  565. // the input buffer. Intended pattern of usage is as an argument to a switch statement.
  566. func (r *Lexer) UnsafeString() string {
  567. ret, _ := r.unsafeString(false)
  568. return ret
  569. }
  570. // UnsafeBytes returns the byte slice if the token is a string literal.
  571. func (r *Lexer) UnsafeBytes() []byte {
  572. _, ret := r.unsafeString(false)
  573. return ret
  574. }
  575. // UnsafeFieldName returns current member name string token
  576. func (r *Lexer) UnsafeFieldName(skipUnescape bool) string {
  577. ret, _ := r.unsafeString(skipUnescape)
  578. return ret
  579. }
  580. // String reads a string literal.
  581. func (r *Lexer) String() string {
  582. if r.token.kind == tokenUndef && r.Ok() {
  583. r.FetchToken()
  584. }
  585. if !r.Ok() || r.token.kind != tokenString {
  586. r.errInvalidToken("string")
  587. return ""
  588. }
  589. if err := r.unescapeStringToken(); err != nil {
  590. r.errInvalidToken("string")
  591. return ""
  592. }
  593. var ret string
  594. if r.token.byteValueCloned {
  595. ret = bytesToStr(r.token.byteValue)
  596. } else {
  597. ret = string(r.token.byteValue)
  598. }
  599. r.consume()
  600. return ret
  601. }
  602. // StringIntern reads a string literal, and performs string interning on it.
  603. func (r *Lexer) StringIntern() string {
  604. if r.token.kind == tokenUndef && r.Ok() {
  605. r.FetchToken()
  606. }
  607. if !r.Ok() || r.token.kind != tokenString {
  608. r.errInvalidToken("string")
  609. return ""
  610. }
  611. if err := r.unescapeStringToken(); err != nil {
  612. r.errInvalidToken("string")
  613. return ""
  614. }
  615. ret := intern.Bytes(r.token.byteValue)
  616. r.consume()
  617. return ret
  618. }
  619. // Bytes reads a string literal and base64 decodes it into a byte slice.
  620. func (r *Lexer) Bytes() []byte {
  621. if r.token.kind == tokenUndef && r.Ok() {
  622. r.FetchToken()
  623. }
  624. if !r.Ok() || r.token.kind != tokenString {
  625. r.errInvalidToken("string")
  626. return nil
  627. }
  628. if err := r.unescapeStringToken(); err != nil {
  629. r.errInvalidToken("string")
  630. return nil
  631. }
  632. ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue)))
  633. n, err := base64.StdEncoding.Decode(ret, r.token.byteValue)
  634. if err != nil {
  635. r.fatalError = &LexerError{
  636. Reason: err.Error(),
  637. }
  638. return nil
  639. }
  640. r.consume()
  641. return ret[:n]
  642. }
  643. // Bool reads a true or false boolean keyword.
  644. func (r *Lexer) Bool() bool {
  645. if r.token.kind == tokenUndef && r.Ok() {
  646. r.FetchToken()
  647. }
  648. if !r.Ok() || r.token.kind != tokenBool {
  649. r.errInvalidToken("bool")
  650. return false
  651. }
  652. ret := r.token.boolValue
  653. r.consume()
  654. return ret
  655. }
  656. func (r *Lexer) number() string {
  657. if r.token.kind == tokenUndef && r.Ok() {
  658. r.FetchToken()
  659. }
  660. if !r.Ok() || r.token.kind != tokenNumber {
  661. r.errInvalidToken("number")
  662. return ""
  663. }
  664. ret := bytesToStr(r.token.byteValue)
  665. r.consume()
  666. return ret
  667. }
  668. func (r *Lexer) Uint8() uint8 {
  669. s := r.number()
  670. if !r.Ok() {
  671. return 0
  672. }
  673. n, err := strconv.ParseUint(s, 10, 8)
  674. if err != nil {
  675. r.addNonfatalError(&LexerError{
  676. Offset: r.start,
  677. Reason: err.Error(),
  678. Data: s,
  679. })
  680. }
  681. return uint8(n)
  682. }
  683. func (r *Lexer) Uint16() uint16 {
  684. s := r.number()
  685. if !r.Ok() {
  686. return 0
  687. }
  688. n, err := strconv.ParseUint(s, 10, 16)
  689. if err != nil {
  690. r.addNonfatalError(&LexerError{
  691. Offset: r.start,
  692. Reason: err.Error(),
  693. Data: s,
  694. })
  695. }
  696. return uint16(n)
  697. }
  698. func (r *Lexer) Uint32() uint32 {
  699. s := r.number()
  700. if !r.Ok() {
  701. return 0
  702. }
  703. n, err := strconv.ParseUint(s, 10, 32)
  704. if err != nil {
  705. r.addNonfatalError(&LexerError{
  706. Offset: r.start,
  707. Reason: err.Error(),
  708. Data: s,
  709. })
  710. }
  711. return uint32(n)
  712. }
  713. func (r *Lexer) Uint64() uint64 {
  714. s := r.number()
  715. if !r.Ok() {
  716. return 0
  717. }
  718. n, err := strconv.ParseUint(s, 10, 64)
  719. if err != nil {
  720. r.addNonfatalError(&LexerError{
  721. Offset: r.start,
  722. Reason: err.Error(),
  723. Data: s,
  724. })
  725. }
  726. return n
  727. }
  728. func (r *Lexer) Uint() uint {
  729. return uint(r.Uint64())
  730. }
  731. func (r *Lexer) Int8() int8 {
  732. s := r.number()
  733. if !r.Ok() {
  734. return 0
  735. }
  736. n, err := strconv.ParseInt(s, 10, 8)
  737. if err != nil {
  738. r.addNonfatalError(&LexerError{
  739. Offset: r.start,
  740. Reason: err.Error(),
  741. Data: s,
  742. })
  743. }
  744. return int8(n)
  745. }
  746. func (r *Lexer) Int16() int16 {
  747. s := r.number()
  748. if !r.Ok() {
  749. return 0
  750. }
  751. n, err := strconv.ParseInt(s, 10, 16)
  752. if err != nil {
  753. r.addNonfatalError(&LexerError{
  754. Offset: r.start,
  755. Reason: err.Error(),
  756. Data: s,
  757. })
  758. }
  759. return int16(n)
  760. }
  761. func (r *Lexer) Int32() int32 {
  762. s := r.number()
  763. if !r.Ok() {
  764. return 0
  765. }
  766. n, err := strconv.ParseInt(s, 10, 32)
  767. if err != nil {
  768. r.addNonfatalError(&LexerError{
  769. Offset: r.start,
  770. Reason: err.Error(),
  771. Data: s,
  772. })
  773. }
  774. return int32(n)
  775. }
  776. func (r *Lexer) Int64() int64 {
  777. s := r.number()
  778. if !r.Ok() {
  779. return 0
  780. }
  781. n, err := strconv.ParseInt(s, 10, 64)
  782. if err != nil {
  783. r.addNonfatalError(&LexerError{
  784. Offset: r.start,
  785. Reason: err.Error(),
  786. Data: s,
  787. })
  788. }
  789. return n
  790. }
  791. func (r *Lexer) Int() int {
  792. return int(r.Int64())
  793. }
  794. func (r *Lexer) Uint8Str() uint8 {
  795. s, b := r.unsafeString(false)
  796. if !r.Ok() {
  797. return 0
  798. }
  799. n, err := strconv.ParseUint(s, 10, 8)
  800. if err != nil {
  801. r.addNonfatalError(&LexerError{
  802. Offset: r.start,
  803. Reason: err.Error(),
  804. Data: string(b),
  805. })
  806. }
  807. return uint8(n)
  808. }
  809. func (r *Lexer) Uint16Str() uint16 {
  810. s, b := r.unsafeString(false)
  811. if !r.Ok() {
  812. return 0
  813. }
  814. n, err := strconv.ParseUint(s, 10, 16)
  815. if err != nil {
  816. r.addNonfatalError(&LexerError{
  817. Offset: r.start,
  818. Reason: err.Error(),
  819. Data: string(b),
  820. })
  821. }
  822. return uint16(n)
  823. }
  824. func (r *Lexer) Uint32Str() uint32 {
  825. s, b := r.unsafeString(false)
  826. if !r.Ok() {
  827. return 0
  828. }
  829. n, err := strconv.ParseUint(s, 10, 32)
  830. if err != nil {
  831. r.addNonfatalError(&LexerError{
  832. Offset: r.start,
  833. Reason: err.Error(),
  834. Data: string(b),
  835. })
  836. }
  837. return uint32(n)
  838. }
  839. func (r *Lexer) Uint64Str() uint64 {
  840. s, b := r.unsafeString(false)
  841. if !r.Ok() {
  842. return 0
  843. }
  844. n, err := strconv.ParseUint(s, 10, 64)
  845. if err != nil {
  846. r.addNonfatalError(&LexerError{
  847. Offset: r.start,
  848. Reason: err.Error(),
  849. Data: string(b),
  850. })
  851. }
  852. return n
  853. }
  854. func (r *Lexer) UintStr() uint {
  855. return uint(r.Uint64Str())
  856. }
  857. func (r *Lexer) UintptrStr() uintptr {
  858. return uintptr(r.Uint64Str())
  859. }
  860. func (r *Lexer) Int8Str() int8 {
  861. s, b := r.unsafeString(false)
  862. if !r.Ok() {
  863. return 0
  864. }
  865. n, err := strconv.ParseInt(s, 10, 8)
  866. if err != nil {
  867. r.addNonfatalError(&LexerError{
  868. Offset: r.start,
  869. Reason: err.Error(),
  870. Data: string(b),
  871. })
  872. }
  873. return int8(n)
  874. }
  875. func (r *Lexer) Int16Str() int16 {
  876. s, b := r.unsafeString(false)
  877. if !r.Ok() {
  878. return 0
  879. }
  880. n, err := strconv.ParseInt(s, 10, 16)
  881. if err != nil {
  882. r.addNonfatalError(&LexerError{
  883. Offset: r.start,
  884. Reason: err.Error(),
  885. Data: string(b),
  886. })
  887. }
  888. return int16(n)
  889. }
  890. func (r *Lexer) Int32Str() int32 {
  891. s, b := r.unsafeString(false)
  892. if !r.Ok() {
  893. return 0
  894. }
  895. n, err := strconv.ParseInt(s, 10, 32)
  896. if err != nil {
  897. r.addNonfatalError(&LexerError{
  898. Offset: r.start,
  899. Reason: err.Error(),
  900. Data: string(b),
  901. })
  902. }
  903. return int32(n)
  904. }
  905. func (r *Lexer) Int64Str() int64 {
  906. s, b := r.unsafeString(false)
  907. if !r.Ok() {
  908. return 0
  909. }
  910. n, err := strconv.ParseInt(s, 10, 64)
  911. if err != nil {
  912. r.addNonfatalError(&LexerError{
  913. Offset: r.start,
  914. Reason: err.Error(),
  915. Data: string(b),
  916. })
  917. }
  918. return n
  919. }
  920. func (r *Lexer) IntStr() int {
  921. return int(r.Int64Str())
  922. }
  923. func (r *Lexer) Float32() float32 {
  924. s := r.number()
  925. if !r.Ok() {
  926. return 0
  927. }
  928. n, err := strconv.ParseFloat(s, 32)
  929. if err != nil {
  930. r.addNonfatalError(&LexerError{
  931. Offset: r.start,
  932. Reason: err.Error(),
  933. Data: s,
  934. })
  935. }
  936. return float32(n)
  937. }
  938. func (r *Lexer) Float32Str() float32 {
  939. s, b := r.unsafeString(false)
  940. if !r.Ok() {
  941. return 0
  942. }
  943. n, err := strconv.ParseFloat(s, 32)
  944. if err != nil {
  945. r.addNonfatalError(&LexerError{
  946. Offset: r.start,
  947. Reason: err.Error(),
  948. Data: string(b),
  949. })
  950. }
  951. return float32(n)
  952. }
  953. func (r *Lexer) Float64() float64 {
  954. s := r.number()
  955. if !r.Ok() {
  956. return 0
  957. }
  958. n, err := strconv.ParseFloat(s, 64)
  959. if err != nil {
  960. r.addNonfatalError(&LexerError{
  961. Offset: r.start,
  962. Reason: err.Error(),
  963. Data: s,
  964. })
  965. }
  966. return n
  967. }
  968. func (r *Lexer) Float64Str() float64 {
  969. s, b := r.unsafeString(false)
  970. if !r.Ok() {
  971. return 0
  972. }
  973. n, err := strconv.ParseFloat(s, 64)
  974. if err != nil {
  975. r.addNonfatalError(&LexerError{
  976. Offset: r.start,
  977. Reason: err.Error(),
  978. Data: string(b),
  979. })
  980. }
  981. return n
  982. }
  983. func (r *Lexer) Error() error {
  984. return r.fatalError
  985. }
  986. func (r *Lexer) AddError(e error) {
  987. if r.fatalError == nil {
  988. r.fatalError = e
  989. }
  990. }
  991. func (r *Lexer) AddNonFatalError(e error) {
  992. r.addNonfatalError(&LexerError{
  993. Offset: r.start,
  994. Data: string(r.Data[r.start:r.pos]),
  995. Reason: e.Error(),
  996. })
  997. }
  998. func (r *Lexer) addNonfatalError(err *LexerError) {
  999. if r.UseMultipleErrors {
  1000. // We don't want to add errors with the same offset.
  1001. if len(r.multipleErrors) != 0 && r.multipleErrors[len(r.multipleErrors)-1].Offset == err.Offset {
  1002. return
  1003. }
  1004. r.multipleErrors = append(r.multipleErrors, err)
  1005. return
  1006. }
  1007. r.fatalError = err
  1008. }
  1009. func (r *Lexer) GetNonFatalErrors() []*LexerError {
  1010. return r.multipleErrors
  1011. }
  1012. // JsonNumber fetches and json.Number from 'encoding/json' package.
  1013. // Both int, float or string, contains them are valid values
  1014. func (r *Lexer) JsonNumber() json.Number {
  1015. if r.token.kind == tokenUndef && r.Ok() {
  1016. r.FetchToken()
  1017. }
  1018. if !r.Ok() {
  1019. r.errInvalidToken("json.Number")
  1020. return json.Number("")
  1021. }
  1022. switch r.token.kind {
  1023. case tokenString:
  1024. return json.Number(r.String())
  1025. case tokenNumber:
  1026. return json.Number(r.Raw())
  1027. case tokenNull:
  1028. r.Null()
  1029. return json.Number("")
  1030. default:
  1031. r.errSyntax()
  1032. return json.Number("")
  1033. }
  1034. }
  1035. // Interface fetches an interface{} analogous to the 'encoding/json' package.
  1036. func (r *Lexer) Interface() interface{} {
  1037. if r.token.kind == tokenUndef && r.Ok() {
  1038. r.FetchToken()
  1039. }
  1040. if !r.Ok() {
  1041. return nil
  1042. }
  1043. switch r.token.kind {
  1044. case tokenString:
  1045. return r.String()
  1046. case tokenNumber:
  1047. return r.Float64()
  1048. case tokenBool:
  1049. return r.Bool()
  1050. case tokenNull:
  1051. r.Null()
  1052. return nil
  1053. }
  1054. if r.token.delimValue == '{' {
  1055. r.consume()
  1056. ret := map[string]interface{}{}
  1057. for !r.IsDelim('}') {
  1058. key := r.String()
  1059. r.WantColon()
  1060. ret[key] = r.Interface()
  1061. r.WantComma()
  1062. }
  1063. r.Delim('}')
  1064. if r.Ok() {
  1065. return ret
  1066. } else {
  1067. return nil
  1068. }
  1069. } else if r.token.delimValue == '[' {
  1070. r.consume()
  1071. ret := []interface{}{}
  1072. for !r.IsDelim(']') {
  1073. ret = append(ret, r.Interface())
  1074. r.WantComma()
  1075. }
  1076. r.Delim(']')
  1077. if r.Ok() {
  1078. return ret
  1079. } else {
  1080. return nil
  1081. }
  1082. }
  1083. r.errSyntax()
  1084. return nil
  1085. }
  1086. // WantComma requires a comma to be present before fetching next token.
  1087. func (r *Lexer) WantComma() {
  1088. r.wantSep = ','
  1089. r.firstElement = false
  1090. }
  1091. // WantColon requires a colon to be present before fetching next token.
  1092. func (r *Lexer) WantColon() {
  1093. r.wantSep = ':'
  1094. r.firstElement = false
  1095. }