JSONScanner.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace JSON
  7. {
  8. class JSONParser;
  9. // Small scanner for exclusive JSON purpose. The general
  10. // JScript scanner is not appropriate here because of the JSON restricted lexical grammar
  11. // token enums and structures are shared although the token semantics is slightly different.
  12. class JSONScanner
  13. {
  14. public:
  15. JSONScanner();
  16. tokens Scan();
  17. void Init(const char16* input, uint len, Token* pOutToken,
  18. ::Js::ScriptContext* sc, const char16* current, ArenaAllocator* allocator);
  19. void Finalizer();
  20. char16* GetCurrentString() { return currentString; }
  21. uint GetCurrentStringLen() { return currentIndex; }
  22. uint GetScanPosition() { return uint(currentChar - inputText); }
  23. void __declspec(noreturn) ThrowSyntaxError(int wErr)
  24. {
  25. char16 scanPos[16];
  26. ::_itow_s(GetScanPosition(), scanPos, _countof(scanPos), 10);
  27. Js::JavascriptError::ThrowSyntaxError(scriptContext, wErr, scanPos);
  28. }
  29. private:
  30. // Data structure for unescaping strings
  31. struct RangeCharacterPair {
  32. public:
  33. uint m_rangeStart;
  34. uint m_rangeLength;
  35. char16 m_char;
  36. RangeCharacterPair() {}
  37. RangeCharacterPair(uint rangeStart, uint rangeLength, char16 ch) : m_rangeStart(rangeStart), m_rangeLength(rangeLength), m_char(ch) {}
  38. };
  39. typedef JsUtil::List<RangeCharacterPair, ArenaAllocator> RangeCharacterPairList;
  40. RangeCharacterPairList* currentRangeCharacterPairList;
  41. Js::TempGuestArenaAllocatorObject* allocatorObject;
  42. ArenaAllocator* allocator;
  43. void BuildUnescapedString(bool shouldSkipLastCharacter);
  44. RangeCharacterPairList* GetCurrentRangeCharacterPairList(void);
  45. inline char16 ReadNextChar(void)
  46. {
  47. return *currentChar++;
  48. }
  49. inline char16 PeekNextChar(void)
  50. {
  51. return *currentChar;
  52. }
  53. tokens ScanString();
  54. bool IsJSONNumber();
  55. const char16* inputText;
  56. uint inputLen;
  57. const char16* currentChar;
  58. const char16* pTokenString;
  59. Token* pToken;
  60. ::Js::ScriptContext* scriptContext;
  61. uint currentIndex;
  62. char16* currentString;
  63. __field_ecount(stringBufferLength) char16* stringBuffer;
  64. int stringBufferLength;
  65. friend class JSONParser;
  66. };
  67. } // namespace JSON