diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-05-27 15:38:52 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-27 12:38:52 -0700 |
| commit | 15f5cffc3026a5faed7046ae7d75ec6b56cf4a4c (patch) | |
| tree | e6c59288e453ac3eb788068a155e7aa607399009 /source/compiler-core/slang-json-lexer.cpp | |
| parent | 969943f4b751d3cad8ac548f9cf0f65406935bad (diff) | |
JSON Parser and Writer (#1859)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP JSONWriter/JSONParser.
* Checking different Layout styles for JSON.
* Add slang-json-parser.h/.cpp
Diffstat (limited to 'source/compiler-core/slang-json-lexer.cpp')
| -rw-r--r-- | source/compiler-core/slang-json-lexer.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/source/compiler-core/slang-json-lexer.cpp b/source/compiler-core/slang-json-lexer.cpp index 19a5b29a7..261d5f413 100644 --- a/source/compiler-core/slang-json-lexer.cpp +++ b/source/compiler-core/slang-json-lexer.cpp @@ -45,6 +45,47 @@ JSONTokenType JSONLexer::_setInvalidToken() return _setToken(JSONTokenType::Invalid, m_lexemeStart); } +SlangResult JSONLexer::expect(JSONTokenType type) +{ + if (type != peekType()) + { + m_sink->diagnose(m_token.loc, JSONDiagnostics::unexpectedTokenExpectedTokenType, getJSONTokenAsText(peekType()), getJSONTokenAsText(type)); + return SLANG_FAIL; + } + + advance(); + return SLANG_OK; +} + +SlangResult JSONLexer::expect(JSONTokenType type, JSONToken& out) +{ + if (type != peekType()) + { + m_sink->diagnose(m_token.loc, JSONDiagnostics::unexpectedTokenExpectedTokenType, getJSONTokenAsText(peekType()), getJSONTokenAsText(type)); + return SLANG_FAIL; + } + + out = m_token; + advance(); + return SLANG_OK; +} + +bool JSONLexer::advanceIf(JSONTokenType type) +{ + if (type == peekType()) + { + advance(); + return true; + } + return false; +} + +UnownedStringSlice JSONLexer::getLexeme(const JSONToken& tok) const +{ + auto offset = m_sourceView->getRange().getOffset(tok.loc); + return UnownedStringSlice(m_sourceView->getContent().begin() + offset, tok.length); +} + JSONTokenType JSONLexer::advance() { const char* cursor = m_cursor; @@ -382,4 +423,27 @@ const char* JSONLexer::_lexWhitespace(const char* cursor) } } +UnownedStringSlice getJSONTokenAsText(JSONTokenType type) +{ + switch (type) + { + case JSONTokenType::Invalid: return UnownedStringSlice::fromLiteral("invalid"); + case JSONTokenType::IntegerLiteral: return UnownedStringSlice::fromLiteral("integer literal"); + case JSONTokenType::FloatLiteral: return UnownedStringSlice::fromLiteral("float literal"); + case JSONTokenType::StringLiteral: return UnownedStringSlice::fromLiteral("string literal"); + case JSONTokenType::LBracket: return UnownedStringSlice::fromLiteral("["); + case JSONTokenType::RBracket: return UnownedStringSlice::fromLiteral("]"); + case JSONTokenType::LBrace: return UnownedStringSlice::fromLiteral("{"); + case JSONTokenType::RBrace: return UnownedStringSlice::fromLiteral("}"); + case JSONTokenType::Comma: return UnownedStringSlice::fromLiteral(","); + case JSONTokenType::Colon: return UnownedStringSlice::fromLiteral(":"); + case JSONTokenType::True: return UnownedStringSlice::fromLiteral("true"); + case JSONTokenType::False: return UnownedStringSlice::fromLiteral("false"); + case JSONTokenType::Null: return UnownedStringSlice::fromLiteral("null"); + case JSONTokenType::EndOfFile: return UnownedStringSlice::fromLiteral("end of file"); + default: break; + } + SLANG_UNEXPECTED("JSONTokenType not known"); +} + } // namespace Slang |
