From fe1f391bcca152a7aa9601c577ceb87395fc4bfa Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 12 Feb 2021 00:38:38 +0100 Subject: [PATCH] Add keywords to header lexer of zcg cpp --- .../Parsing/Header/HeaderFileReader.cpp | 44 +++++++++++++++++++ .../Parsing/Header/Impl/HeaderLexer.cpp | 24 +++++++++- .../Parsing/Header/Impl/HeaderLexer.h | 6 +++ .../Parsing/Header/Impl/HeaderParserValue.cpp | 5 +++ .../Parsing/Header/Impl/HeaderParserValue.h | 12 +++++ 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index a0d05732..7a15a98b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp @@ -91,6 +91,50 @@ bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) std::cout << "Token STRING \"" << token.StringValue() << "\"\n"; break; + case HeaderParserValueType::INTEGER: + std::cout << "Token INTEGER " << token.IntegerValue() << "\n"; + break; + + case HeaderParserValueType::FLOATING_POINT: + std::cout << "Token FLOATINGPOINT " << token.FloatingPointValue() << "\n"; + break; + + case HeaderParserValueType::DECLSPEC: + std::cout << "Token DECLSPEC\n"; + break; + + case HeaderParserValueType::ALIGN: + std::cout << "Token ALIGN\n"; + break; + + case HeaderParserValueType::ALIGNAS: + std::cout << "Token ALIGNAS\n"; + break; + + case HeaderParserValueType::CONST: + std::cout << "Token CONST\n"; + break; + + case HeaderParserValueType::ENUM: + std::cout << "Token ENUM\n"; + break; + + case HeaderParserValueType::NAMESPACE: + std::cout << "Token NAMESPACE\n"; + break; + + case HeaderParserValueType::STRUCT: + std::cout << "Token STRUCT\n"; + break; + + case HeaderParserValueType::TYPEDEF: + std::cout << "Token TYPEDEF\n"; + break; + + case HeaderParserValueType::UNION: + std::cout << "Token UNION\n"; + break; + default: std::cout << "Token UNKNOWN\n"; break; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.cpp index a5697294..36aac358 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.cpp @@ -3,6 +3,20 @@ HeaderLexer::HeaderLexer(IParserLineStream* stream) : AbstractLexer(stream) { + PrepareKeywords(); +} + +void HeaderLexer::PrepareKeywords() +{ + m_keywords["__declspec"] = HeaderParserValueType::DECLSPEC; + m_keywords["align"] = HeaderParserValueType::ALIGN; + m_keywords["alignas"] = HeaderParserValueType::ALIGNAS; + m_keywords["const"] = HeaderParserValueType::CONST; + m_keywords["enum"] = HeaderParserValueType::ENUM; + m_keywords["namespace"] = HeaderParserValueType::NAMESPACE; + m_keywords["struct"] = HeaderParserValueType::STRUCT; + m_keywords["typedef"] = HeaderParserValueType::TYPEDEF; + m_keywords["union"] = HeaderParserValueType::UNION; } HeaderParserValue HeaderLexer::GetNextToken() @@ -131,7 +145,15 @@ HeaderParserValue HeaderLexer::GetNextToken() } if (isalpha(c) || c == '_') - return HeaderParserValue::Identifier(GetPreviousCharacterPos(), new std::string(ReadIdentifier())); + { + auto identifier = ReadIdentifier(); + + const auto foundKeyword = m_keywords.find(identifier); + if (foundKeyword != m_keywords.end()) + return HeaderParserValue::Keyword(GetPreviousCharacterPos(), foundKeyword->second); + + return HeaderParserValue::Identifier(GetPreviousCharacterPos(), new std::string(std::move(identifier))); + } return HeaderParserValue::Character(GetPreviousCharacterPos(), static_cast(c)); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h index 54d6f3aa..7b4633b1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h @@ -1,10 +1,16 @@ #pragma once +#include + #include "HeaderParserValue.h" #include "Parsing/AbstractLexer.h" class HeaderLexer final : public AbstractLexer { + std::unordered_map m_keywords; + + void PrepareKeywords(); + protected: HeaderParserValue GetNextToken() override; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.cpp index 8d1b23bd..740f6a1e 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.cpp @@ -97,6 +97,11 @@ HeaderParserValue HeaderParserValue::Identifier(const TokenPos pos, std::string* return pv; } +HeaderParserValue HeaderParserValue::Keyword(const TokenPos pos, const HeaderParserValueType type) +{ + return HeaderParserValue(pos, type); +} + HeaderParserValue HeaderParserValue::TypeName(const TokenPos pos, std::string* typeName) { HeaderParserValue pv(pos, HeaderParserValueType::TYPE_NAME); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h index dcef1f24..d51588d1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h @@ -30,6 +30,17 @@ enum class HeaderParserValueType STRING, IDENTIFIER, + // Keywords + DECLSPEC, + ALIGN, + ALIGNAS, + CONST, + ENUM, + NAMESPACE, + STRUCT, + TYPEDEF, + UNION, + // Parser created TYPE_NAME, @@ -65,6 +76,7 @@ public: static HeaderParserValue FloatingPoint(TokenPos pos, double value); static HeaderParserValue String(TokenPos pos, std::string* stringValue); static HeaderParserValue Identifier(TokenPos pos, std::string* identifier); + static HeaderParserValue Keyword(TokenPos pos, HeaderParserValueType type); static HeaderParserValue TypeName(TokenPos pos, std::string* typeName); private: