Apply formating to all files. CLeanup

This commit is contained in:
IlyaShurupov 2023-10-22 17:07:28 +03:00
parent 43e374f269
commit 744c01c5d0
928 changed files with 14515 additions and 21480 deletions

View file

@ -1,14 +1,10 @@
#include "Tokenizer.hpp"
using namespace tp;
static ModuleManifest* sModuleDependencies[] = {
&tp::gModuleStrings,
nullptr
};
void deinit(const ModuleManifest*) {}
ModuleManifest tp::gModuleTokenizer = ModuleManifest("Tokenizer", nullptr, deinit, sModuleDependencies);
#include "Tokenizer.hpp"
using namespace tp;
static ModuleManifest* sModuleDependencies[] = { &tp::gModuleStrings, nullptr };
void deinit(const ModuleManifest*) {}
ModuleManifest tp::gModuleTokenizer = ModuleManifest("Tokenizer", nullptr, deinit, sModuleDependencies);

View file

@ -1,211 +1,184 @@
#pragma once
#include "RegularExpression.h"
#include "Strings.hpp"
namespace tp {
extern ModuleManifest gModuleTokenizer;
template <typename tAlphabetType, typename tTokType, tTokType tNoTokVal, tTokType tFailedTokVal>
class Tokenizer {
TransitionMatrix<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> mTransitionMatrix;
RegEx::CompileError<tTokType> mError;
bool scanFailed() {
return mTransitionMatrix.isTrapped();
}
public:
// Some useful RE to be reused
static constexpr const tAlphabetType* etherRE = "\n|\t| |\r";
static constexpr const tAlphabetType* intRE = "((\\-)|(\\+))?[0-9]+i?";
static constexpr const tAlphabetType* floatRE = R"(((\-)|(\+))?([0-9]+)(\.)([0-9]*)?f?)";
static constexpr const tAlphabetType* commentBlockRE = R"((/\*){\*-\*}*(\*/))";
static constexpr const tAlphabetType* stringRE = R"("{"-"}*")";
static constexpr const tAlphabetType* idRE = "([a-z]|[A-Z]|_)+([a-z]|[A-Z]|[0-9]|_)*";
public:
Tokenizer() {
MODULE_SANITY_CHECK(gModuleTokenizer)
}
void build(const InitialierList<Pair<const tAlphabetType*, tTokType>>& rules) {
NFA<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> nfa;
mError = RegEx::compile(nfa, rules);
if (mError.isError()) {
return;
}
DFA<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> dfa(nfa);
mTransitionMatrix.construct(dfa);
}
[[nodiscard]] bool isBuild() const {
return !mError.isError();
}
auto getMatrix() const { return &mTransitionMatrix; }
const RegEx::CompileError<tTokType>& getBuildError() {
return mError;
}
void resetMatrix() {
mTransitionMatrix.reset();
}
tTokType advanceSymbol(tAlphabetType symbol) {
return mTransitionMatrix.move(symbol);
}
tTokType advanceToken(const tAlphabetType* source, ualni source_len, ualni* token_len) {
tTokType out = tNoTokVal;
*token_len = 0;
for (ualni idx = 0; idx < source_len; idx++) {
out = advanceSymbol(source[idx]);
if (out != tNoTokVal) {
*token_len = idx;
break;
}
}
return out;
}
~Tokenizer() = default;
};
template <typename tAlphabetType, typename tTokType, tTokType tNoTokVal, tTokType tFailedTokVal, tTokType tSourceEndTokVal>
class SimpleTokenizer {
public:
typedef Tokenizer<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> tTokenizer;
private:
tTokenizer mTokenizer;
const tAlphabetType* mSource = nullptr;
ualni mLastTokLen = 0;
ualni mSourceLen = 0;
ualni mAdvancedOffset = 0;
public:
struct Cursor {
const tAlphabetType* mSource = nullptr;
ualni mAdvancedOffset = 0;
const tAlphabetType* str() { return mSource + mAdvancedOffset; }
struct Location2D {
ualni line = 0;
ualni character = 0;
};
Location2D get2DLocation() {
Location2D out;
typedef typename StringLogic<tAlphabetType>::Index Idx;
Buffer<Idx> offsets;
StringLogic<tAlphabetType>::calcLineOffsets(mSource, StringLogic<tAlphabetType>::calcLength(mSource), offsets);
for (ualni idx = 1; idx < offsets.size(); idx++) {
if (offsets[idx] > mAdvancedOffset) {
out.line = idx - 1;
break;
}
}
out.character = mAdvancedOffset - offsets[out.line];
return out;
}
};
SimpleTokenizer() = default;
auto getTokenizer() const { return &mTokenizer; }
void build(const InitialierList<Pair<const tAlphabetType*, tTokType>>& rules) {
mTokenizer.build(rules);
}
[[nodiscard]] bool isBuild() const {
return mTokenizer.isBuild();
}
const RegEx::CompileError<tTokType>& getBuildError() {
return mTokenizer.getBuildError();
}
void bindSource(const tAlphabetType* source) {
mSource = source;
while (mSource[mSourceLen]) mSourceLen++;
mSourceLen++;
}
[[nodiscard]] bool isInputLeft() const {
if (!mSource) {
return false;
}
if (mSource[mAdvancedOffset] == 0) {
return false;
}
return true;
}
Cursor getCursor() const {
return { mSource, mAdvancedOffset };
}
Cursor getCursorPrev() const {
return { mSource, mAdvancedOffset - mLastTokLen };
}
void setCursor(const Cursor& crs) {
mAdvancedOffset = crs.mAdvancedOffset;
mLastTokLen = 0;
}
tTokType readTok() {
if (mSourceLen == mAdvancedOffset + 1) {
return tSourceEndTokVal;
}
tTokType out = mTokenizer.advanceToken(mSource + mAdvancedOffset, mSourceLen - mAdvancedOffset, &mLastTokLen);
mAdvancedOffset += mLastTokLen;
return out;
}
tTokType lookupTok() {
auto out = readTok();
discardTok();
return out;
}
void discardTok() {
mTokenizer.resetMatrix();
mAdvancedOffset -= mLastTokLen;
mLastTokLen = 0;
}
void skipTok() {
readTok();
}
void reset() {
mAdvancedOffset = mLastTokLen = 0;
mTokenizer.resetMatrix();
}
[[nodiscard]] ualni lastTokLEn() const {
return mLastTokLen;
}
String extractVal() {
auto crs = getCursorPrev();
String out;
out.resize(mLastTokLen);
memCopy(out.write(), crs.str(), mLastTokLen);
return out;
}
};
#pragma once
#include "RegularExpression.h"
#include "Strings.hpp"
namespace tp {
extern ModuleManifest gModuleTokenizer;
template <typename tAlphabetType, typename tTokType, tTokType tNoTokVal, tTokType tFailedTokVal>
class Tokenizer {
TransitionMatrix<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> mTransitionMatrix;
RegEx::CompileError<tTokType> mError;
bool scanFailed() { return mTransitionMatrix.isTrapped(); }
public:
// Some useful RE to be reused
static constexpr const tAlphabetType* etherRE = "\n|\t| |\r";
static constexpr const tAlphabetType* intRE = "((\\-)|(\\+))?[0-9]+i?";
static constexpr const tAlphabetType* floatRE = R"(((\-)|(\+))?([0-9]+)(\.)([0-9]*)?f?)";
static constexpr const tAlphabetType* commentBlockRE = R"((/\*){\*-\*}*(\*/))";
static constexpr const tAlphabetType* stringRE = R"("{"-"}*")";
static constexpr const tAlphabetType* idRE = "([a-z]|[A-Z]|_)+([a-z]|[A-Z]|[0-9]|_)*";
public:
Tokenizer() { MODULE_SANITY_CHECK(gModuleTokenizer) }
void build(const InitialierList<Pair<const tAlphabetType*, tTokType>>& rules) {
NFA<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> nfa;
mError = RegEx::compile(nfa, rules);
if (mError.isError()) {
return;
}
DFA<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> dfa(nfa);
mTransitionMatrix.construct(dfa);
}
[[nodiscard]] bool isBuild() const { return !mError.isError(); }
auto getMatrix() const { return &mTransitionMatrix; }
const RegEx::CompileError<tTokType>& getBuildError() { return mError; }
void resetMatrix() { mTransitionMatrix.reset(); }
tTokType advanceSymbol(tAlphabetType symbol) { return mTransitionMatrix.move(symbol); }
tTokType advanceToken(const tAlphabetType* source, ualni source_len, ualni* token_len) {
tTokType out = tNoTokVal;
*token_len = 0;
for (ualni idx = 0; idx < source_len; idx++) {
out = advanceSymbol(source[idx]);
if (out != tNoTokVal) {
*token_len = idx;
break;
}
}
return out;
}
~Tokenizer() = default;
};
template <typename tAlphabetType, typename tTokType, tTokType tNoTokVal, tTokType tFailedTokVal, tTokType tSourceEndTokVal>
class SimpleTokenizer {
public:
typedef Tokenizer<tAlphabetType, tTokType, tNoTokVal, tFailedTokVal> tTokenizer;
private:
tTokenizer mTokenizer;
const tAlphabetType* mSource = nullptr;
ualni mLastTokLen = 0;
ualni mSourceLen = 0;
ualni mAdvancedOffset = 0;
public:
struct Cursor {
const tAlphabetType* mSource = nullptr;
ualni mAdvancedOffset = 0;
const tAlphabetType* str() { return mSource + mAdvancedOffset; }
struct Location2D {
ualni line = 0;
ualni character = 0;
};
Location2D get2DLocation() {
Location2D out;
typedef typename StringLogic<tAlphabetType>::Index Idx;
Buffer<Idx> offsets;
StringLogic<tAlphabetType>::calcLineOffsets(mSource, StringLogic<tAlphabetType>::calcLength(mSource), offsets);
for (ualni idx = 1; idx < offsets.size(); idx++) {
if (offsets[idx] > mAdvancedOffset) {
out.line = idx - 1;
break;
}
}
out.character = mAdvancedOffset - offsets[out.line];
return out;
}
};
SimpleTokenizer() = default;
auto getTokenizer() const { return &mTokenizer; }
void build(const InitialierList<Pair<const tAlphabetType*, tTokType>>& rules) { mTokenizer.build(rules); }
[[nodiscard]] bool isBuild() const { return mTokenizer.isBuild(); }
const RegEx::CompileError<tTokType>& getBuildError() { return mTokenizer.getBuildError(); }
void bindSource(const tAlphabetType* source) {
mSource = source;
while (mSource[mSourceLen])
mSourceLen++;
mSourceLen++;
}
[[nodiscard]] bool isInputLeft() const {
if (!mSource) {
return false;
}
if (mSource[mAdvancedOffset] == 0) {
return false;
}
return true;
}
Cursor getCursor() const { return { mSource, mAdvancedOffset }; }
Cursor getCursorPrev() const { return { mSource, mAdvancedOffset - mLastTokLen }; }
void setCursor(const Cursor& crs) {
mAdvancedOffset = crs.mAdvancedOffset;
mLastTokLen = 0;
}
tTokType readTok() {
if (mSourceLen == mAdvancedOffset + 1) {
return tSourceEndTokVal;
}
tTokType out = mTokenizer.advanceToken(mSource + mAdvancedOffset, mSourceLen - mAdvancedOffset, &mLastTokLen);
mAdvancedOffset += mLastTokLen;
return out;
}
tTokType lookupTok() {
auto out = readTok();
discardTok();
return out;
}
void discardTok() {
mTokenizer.resetMatrix();
mAdvancedOffset -= mLastTokLen;
mLastTokLen = 0;
}
void skipTok() { readTok(); }
void reset() {
mAdvancedOffset = mLastTokLen = 0;
mTokenizer.resetMatrix();
}
[[nodiscard]] ualni lastTokLEn() const { return mLastTokLen; }
String extractVal() {
auto crs = getCursorPrev();
String out;
out.resize(mLastTokLen);
memCopy(out.write(), crs.str(), mLastTokLen);
return out;
}
};
}

View file

@ -11,7 +11,7 @@ using namespace tp;
ualni outputHashPassed = 1156;
const char* script =
R"(
R"(
/* yea
comment "and string inside" with int 123 and float 0.123f */
@ -76,7 +76,7 @@ TEST_DEF_STATIC(General) {
CONST_STRING,
ID,
//COMMENT_LINE,
// COMMENT_LINE,
COMMENT_BLOCK,
};
@ -84,45 +84,45 @@ TEST_DEF_STATIC(General) {
SimpleTokenizer<char, TokType, TokType::NONE, TokType::FAILED, TokType::TOK_SOURCE_END> lexer;
lexer.build({
{ "\n|\t| |\r", TokType::SPACE },
{ "var", TokType::VAR },
{ "class", TokType::CLASS_DEF },
{ "self", TokType::SELF },
{ "\\{", TokType::SCOPE_IN },
{ "\\}", TokType::SCOPE_OUT },
{ "=", TokType::ASSIGN },
{ "def", TokType::DEF_FUNC },
{ "<<", TokType::PRINT },
{ "if", TokType::IF },
{ "else", TokType::ELSE },
{ "while", TokType::WHILE },
{ "\\(", TokType::BRACKET_IN },
{ "\\)", TokType::BRACKET_OUT },
{ ",", TokType::COMMA },
{ "new", TokType::NEW },
{ "\\.", TokType::CHILD },
{ "return", TokType::RETURN },
{ "==", TokType::EQUAL },
{ "!=", TokType::NOT_EQUAL },
{ ">", TokType::MORE },
{ "<", TokType::LESS },
{ ">=", TokType::QE_OR_MORE },
{ "<=", TokType::QE_OR_LESS },
{ "!", TokType::BOOL_NOT },
{ "&&", TokType::BOOL_AND },
{ "\\|\\|", TokType::BOOL_OR },
{ "\\+", TokType::ADD },
{ "\\*", TokType::MUL },
{ "\\-", TokType::SUB },
{ "/", TokType::DIV },
{ ";", TokType::STM_END },
{ "true", TokType::CONST_TRUE },
{ "false", TokType::CONST_FALSE },
{ "((\\-)|(\\+))?[0-9]+i?", TokType::CONST_INT },
{ R"(((\-)|(\+))?([0-9]+)(\.)([0-9]*)?f?)", TokType::CONST_FLOAT },
{ R"((/\*){\*-\*}*(\*/))", TokType::COMMENT_BLOCK },
{ R"("{"-"}*")", TokType::CONST_STRING },
{ "([a-z]|[A-Z]|_)+([a-z]|[A-Z]|[0-9]|_)*", TokType::ID },
{ "\n|\t| |\r", TokType::SPACE },
{ "var", TokType::VAR },
{ "class", TokType::CLASS_DEF },
{ "self", TokType::SELF },
{ "\\{", TokType::SCOPE_IN },
{ "\\}", TokType::SCOPE_OUT },
{ "=", TokType::ASSIGN },
{ "def", TokType::DEF_FUNC },
{ "<<", TokType::PRINT },
{ "if", TokType::IF },
{ "else", TokType::ELSE },
{ "while", TokType::WHILE },
{ "\\(", TokType::BRACKET_IN },
{ "\\)", TokType::BRACKET_OUT },
{ ",", TokType::COMMA },
{ "new", TokType::NEW },
{ "\\.", TokType::CHILD },
{ "return", TokType::RETURN },
{ "==", TokType::EQUAL },
{ "!=", TokType::NOT_EQUAL },
{ ">", TokType::MORE },
{ "<", TokType::LESS },
{ ">=", TokType::QE_OR_MORE },
{ "<=", TokType::QE_OR_LESS },
{ "!", TokType::BOOL_NOT },
{ "&&", TokType::BOOL_AND },
{ "\\|\\|", TokType::BOOL_OR },
{ "\\+", TokType::ADD },
{ "\\*", TokType::MUL },
{ "\\-", TokType::SUB },
{ "/", TokType::DIV },
{ ";", TokType::STM_END },
{ "true", TokType::CONST_TRUE },
{ "false", TokType::CONST_FALSE },
{ "((\\-)|(\\+))?[0-9]+i?", TokType::CONST_INT },
{ R"(((\-)|(\+))?([0-9]+)(\.)([0-9]*)?f?)", TokType::CONST_FLOAT },
{ R"((/\*){\*-\*}*(\*/))", TokType::COMMENT_BLOCK },
{ R"("{"-"}*")", TokType::CONST_STRING },
{ "([a-z]|[A-Z]|_)+([a-z]|[A-Z]|[0-9]|_)*", TokType::ID },
});
if (!lexer.isBuild()) {
@ -141,47 +141,207 @@ TEST_DEF_STATIC(General) {
outputHash += ualni(tok);
switch (tok) {
case TokType::SPACE: { printf(" "); } break;
case TokType::VAR: { LOG(VAR); } break;
case TokType::CLASS_DEF: { LOG(CLASS_DEF); } break;
case TokType::SELF: { LOG(SELF); } break;
case TokType::SCOPE_IN: { LOG(SCOPE_IN); } break;
case TokType::SCOPE_OUT: { LOG(SCOPE_OUT); } break;
case TokType::ASSIGN: { LOG(ASSIGN); } break;
case TokType::DEF_FUNC: { LOG(DEF_FUNC); } break;
case TokType::PRINT: { LOG(PRINT); } break;
case TokType::IF: { LOG(IF); } break;
case TokType::ELSE: { LOG(ELSE); } break;
case TokType::WHILE: { LOG(WHILE); } break;
case TokType::BRACKET_IN: { LOG(BRACKET_IN); } break;
case TokType::BRACKET_OUT: { LOG(BRACKET_OUT); } break;
case TokType::COMMA: { LOG(COMMA); } break;
case TokType::NEW: { LOG(NEW); } break;
case TokType::CHILD: { LOG(CHILD); } break;
case TokType::RETURN: { LOG(RETURN); } break;
case TokType::EQUAL: { LOG(EQUAL); } break;
case TokType::NOT_EQUAL: { LOG(NOT_EQUAL); } break;
case TokType::MORE: { LOG(MORE); } break;
case TokType::LESS: { LOG(LESS); } break;
case TokType::QE_OR_MORE: { LOG(QE_OR_MORE); } break;
case TokType::QE_OR_LESS: { LOG(QE_OR_LESS); } break;
case TokType::BOOL_NOT: { LOG(BOOL_NOT); } break;
case TokType::BOOL_AND: { LOG(BOOL_AND); } break;
case TokType::BOOL_OR: { LOG(BOOL_OR); } break;
case TokType::ADD: { LOG(ADD); } break;
case TokType::MUL: { LOG(MUL); } break;
case TokType::SUB: { LOG(SUB); } break;
case TokType::DIV: { LOG(DIV); } break;
case TokType::STM_END: { LOG(STM_END); } break;
case TokType::CONST_TRUE: { LOG(TRUE); } break;
case TokType::CONST_FALSE: { LOG(FALSE); } break;
case TokType::CONST_INT: { LOG(INT); } break;
case TokType::CONST_FLOAT: { LOG(FLOAT); } break;
case TokType::CONST_STRING: { LOG(STRING); } break;
case TokType::ID: { LOG(ID); } break;
//case TokType::COMMENT_LINE: { LOG(COMMENT_LINE) } break;
case TokType::COMMENT_BLOCK: { LOG(COMMENT_BLOCK); } break;
case TokType::FAILED: { LOG(FAILED); } break;
case TokType::SPACE:
{
printf(" ");
}
break;
case TokType::VAR:
{
LOG(VAR);
}
break;
case TokType::CLASS_DEF:
{
LOG(CLASS_DEF);
}
break;
case TokType::SELF:
{
LOG(SELF);
}
break;
case TokType::SCOPE_IN:
{
LOG(SCOPE_IN);
}
break;
case TokType::SCOPE_OUT:
{
LOG(SCOPE_OUT);
}
break;
case TokType::ASSIGN:
{
LOG(ASSIGN);
}
break;
case TokType::DEF_FUNC:
{
LOG(DEF_FUNC);
}
break;
case TokType::PRINT:
{
LOG(PRINT);
}
break;
case TokType::IF:
{
LOG(IF);
}
break;
case TokType::ELSE:
{
LOG(ELSE);
}
break;
case TokType::WHILE:
{
LOG(WHILE);
}
break;
case TokType::BRACKET_IN:
{
LOG(BRACKET_IN);
}
break;
case TokType::BRACKET_OUT:
{
LOG(BRACKET_OUT);
}
break;
case TokType::COMMA:
{
LOG(COMMA);
}
break;
case TokType::NEW:
{
LOG(NEW);
}
break;
case TokType::CHILD:
{
LOG(CHILD);
}
break;
case TokType::RETURN:
{
LOG(RETURN);
}
break;
case TokType::EQUAL:
{
LOG(EQUAL);
}
break;
case TokType::NOT_EQUAL:
{
LOG(NOT_EQUAL);
}
break;
case TokType::MORE:
{
LOG(MORE);
}
break;
case TokType::LESS:
{
LOG(LESS);
}
break;
case TokType::QE_OR_MORE:
{
LOG(QE_OR_MORE);
}
break;
case TokType::QE_OR_LESS:
{
LOG(QE_OR_LESS);
}
break;
case TokType::BOOL_NOT:
{
LOG(BOOL_NOT);
}
break;
case TokType::BOOL_AND:
{
LOG(BOOL_AND);
}
break;
case TokType::BOOL_OR:
{
LOG(BOOL_OR);
}
break;
case TokType::ADD:
{
LOG(ADD);
}
break;
case TokType::MUL:
{
LOG(MUL);
}
break;
case TokType::SUB:
{
LOG(SUB);
}
break;
case TokType::DIV:
{
LOG(DIV);
}
break;
case TokType::STM_END:
{
LOG(STM_END);
}
break;
case TokType::CONST_TRUE:
{
LOG(TRUE);
}
break;
case TokType::CONST_FALSE:
{
LOG(FALSE);
}
break;
case TokType::CONST_INT:
{
LOG(INT);
}
break;
case TokType::CONST_FLOAT:
{
LOG(FLOAT);
}
break;
case TokType::CONST_STRING:
{
LOG(STRING);
}
break;
case TokType::ID:
{
LOG(ID);
}
break;
// case TokType::COMMENT_LINE: { LOG(COMMENT_LINE) } break;
case TokType::COMMENT_BLOCK:
{
LOG(COMMENT_BLOCK);
}
break;
case TokType::FAILED:
{
LOG(FAILED);
}
break;
case TokType::NONE:
case TokType::TOK_SOURCE_END: break;
}
@ -207,9 +367,9 @@ TEST_DEF(Simple) {
SimpleTokenizer<char, TokType, TokType::NONE, TokType::FAILED, TokType::TOK_SOURCE_END> lexer;
lexer.build({
{ " ", TokType::SPACE },
{ "([a-c]|A)+", TokType::ID },
{ "A", TokType::START },
{ " ", TokType::SPACE },
{ "([a-c]|A)+", TokType::ID },
{ "A", TokType::START },
});
if (!lexer.isBuild()) {

View file

@ -1,18 +1,18 @@
#include "Tokenizer.hpp"
#include "Testing.hpp"
void testTokenizer();
int main(int argc, char* argv[]) {
tp::ModuleManifest* ModuleDependencies[] = { &tp::gModuleTokenizer, nullptr };
tp::ModuleManifest TestModule("TokenizerTest", nullptr, nullptr, ModuleDependencies);
if (!TestModule.initialize()) {
return 1;
}
testTokenizer();
TestModule.deinitialize();
#include "Testing.hpp"
#include "Tokenizer.hpp"
void testTokenizer();
int main(int argc, char* argv[]) {
tp::ModuleManifest* ModuleDependencies[] = { &tp::gModuleTokenizer, nullptr };
tp::ModuleManifest TestModule("TokenizerTest", nullptr, nullptr, ModuleDependencies);
if (!TestModule.initialize()) {
return 1;
}
testTokenizer();
TestModule.deinitialize();
}