summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-json-lexer.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2021-05-27 15:38:52 -0400
committerGitHub <noreply@github.com>2021-05-27 12:38:52 -0700
commit15f5cffc3026a5faed7046ae7d75ec6b56cf4a4c (patch)
treee6c59288e453ac3eb788068a155e7aa607399009 /source/compiler-core/slang-json-lexer.cpp
parent969943f4b751d3cad8ac548f9cf0f65406935bad (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.cpp64
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