mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 08:05:45 +00:00
Add keywords to header lexer of zcg cpp
This commit is contained in:
parent
87b7921c73
commit
fe1f391bcc
@ -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;
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user