Add keywords to header lexer of zcg cpp

This commit is contained in:
Jan 2021-02-12 00:38:38 +01:00
parent 87b7921c73
commit fe1f391bcc
5 changed files with 90 additions and 1 deletions

View File

@ -91,6 +91,50 @@ bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository)
std::cout << "Token STRING \"" << token.StringValue() << "\"\n"; std::cout << "Token STRING \"" << token.StringValue() << "\"\n";
break; 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: default:
std::cout << "Token UNKNOWN\n"; std::cout << "Token UNKNOWN\n";
break; break;

View File

@ -3,6 +3,20 @@
HeaderLexer::HeaderLexer(IParserLineStream* stream) HeaderLexer::HeaderLexer(IParserLineStream* stream)
: AbstractLexer(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() HeaderParserValue HeaderLexer::GetNextToken()
@ -131,7 +145,15 @@ HeaderParserValue HeaderLexer::GetNextToken()
} }
if (isalpha(c) || c == '_') 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<char>(c)); return HeaderParserValue::Character(GetPreviousCharacterPos(), static_cast<char>(c));
} }

View File

@ -1,10 +1,16 @@
#pragma once #pragma once
#include <unordered_map>
#include "HeaderParserValue.h" #include "HeaderParserValue.h"
#include "Parsing/AbstractLexer.h" #include "Parsing/AbstractLexer.h"
class HeaderLexer final : public AbstractLexer<HeaderParserValue> class HeaderLexer final : public AbstractLexer<HeaderParserValue>
{ {
std::unordered_map<std::string, HeaderParserValueType> m_keywords;
void PrepareKeywords();
protected: protected:
HeaderParserValue GetNextToken() override; HeaderParserValue GetNextToken() override;

View File

@ -97,6 +97,11 @@ HeaderParserValue HeaderParserValue::Identifier(const TokenPos pos, std::string*
return pv; 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 HeaderParserValue::TypeName(const TokenPos pos, std::string* typeName)
{ {
HeaderParserValue pv(pos, HeaderParserValueType::TYPE_NAME); HeaderParserValue pv(pos, HeaderParserValueType::TYPE_NAME);

View File

@ -30,6 +30,17 @@ enum class HeaderParserValueType
STRING, STRING,
IDENTIFIER, IDENTIFIER,
// Keywords
DECLSPEC,
ALIGN,
ALIGNAS,
CONST,
ENUM,
NAMESPACE,
STRUCT,
TYPEDEF,
UNION,
// Parser created // Parser created
TYPE_NAME, TYPE_NAME,
@ -65,6 +76,7 @@ public:
static HeaderParserValue FloatingPoint(TokenPos pos, double value); static HeaderParserValue FloatingPoint(TokenPos pos, double value);
static HeaderParserValue String(TokenPos pos, std::string* stringValue); static HeaderParserValue String(TokenPos pos, std::string* stringValue);
static HeaderParserValue Identifier(TokenPos pos, std::string* identifier); static HeaderParserValue Identifier(TokenPos pos, std::string* identifier);
static HeaderParserValue Keyword(TokenPos pos, HeaderParserValueType type);
static HeaderParserValue TypeName(TokenPos pos, std::string* typeName); static HeaderParserValue TypeName(TokenPos pos, std::string* typeName);
private: private: