Replace object parser with lalr library

This commit is contained in:
Ilusha 2024-03-07 12:33:46 +03:00 committed by Ilya Shurupov
parent 8f87c3bc33
commit 1293136343
13 changed files with 499 additions and 995 deletions

View file

@ -3,193 +3,43 @@
#include "compiler/statement.h"
#include "compiler/expression.h"
#include "Tokenizer.hpp"
namespace obj {
class Parser {
struct Token {
tp::String token;
tp::alni integer;
tp::alnf floating;
bool boolean;
tp::String str;
enum TokType : tp::alni {
__START__ = 0,
ID,
CONST_INT,
CONST_FLOAT,
CONST_STRING,
SCOPE_IN,
SCOPE_OUT,
ASSIGN,
DEF_FUNC,
PRINT,
IF,
ELSE,
WHILE,
BRACKET_IN,
BRACKET_OUT,
COMMA,
NEW,
CHILD,
RETURN,
EQUAL,
NOT_EQUAL,
MORE,
LESS,
QE_OR_MORE,
QE_OR_LESS,
BOOL_NOT,
BOOL_AND,
BOOL_OR,
ADD,
MUL,
SUB,
DIV,
QUOTES,
CONST_TRUE,
CONST_FALSE,
STM_END,
SPACE,
VAR,
CLASS_DEF,
SELF,
COMMENT_BLOCK,
__END__,
NO_TOKEN,
FAILED,
SOURCE_END_TOKEN,
} type;
operator TokType() {
return type;
}
bool isAriphm();
bool isBoolean();
};
typedef tp::SimpleTokenizer<char, Token::TokType, Token::NO_TOKEN, Token::FAILED, Token::SOURCE_END_TOKEN> Tokenizer;
Tokenizer mTok;
enum class ExprType {
BOOLEAN_NOT = 0,
BOOLEAN,
Ariphm,
NEW,
LOCAL,
CONST,
Compound
};
enum class StmType {
DefFunc = 0,
DefLocal,
Return,
Print,
If,
While,
Copy,
Call,
CLASS_DEF
};
public:
Parser();
Parser() = default;
struct Error {
tp::String mDescr = "No Description";
tp::alni mAdvanecedIdx = 0;
tp::String mDescription = "No Description";
tp::alni mAdvancedIdx = 0;
Error() {}
Error(tp::String descr, tp::alni idx) {
mDescr = descr;
mAdvanecedIdx = idx;
Error() = default;
Error(const tp::String& description, tp::alni idx) {
mDescription = description;
mAdvancedIdx = idx;
}
tp::Pair<tp::alni, tp::alni> get_err_location(const char* stream) {
tp::Pair<tp::alni, tp::alni> getErrorLocation(const char* stream) const {
tp::alni line = 1;
tp::alni colomn = 1;
tp::alni column = 1;
//assert(mAdvanecedIdx);
for (auto i : tp::Range(mAdvanecedIdx)) {
for (auto i : tp::Range(mAdvancedIdx)) {
if (stream[i] == '\n') {
colomn = 0;
column = 0;
line++;
}
colomn++;
column++;
}
return { line, colomn };
return { line, column };
}
};
struct Resault {
Error* err = NULL;
obj::BCgen::StatementScope* scope = NULL;
} mRes;
struct Result {
Error* err = nullptr;
obj::BCgen::StatementScope* scope = nullptr;
};
Resault parse(const tp::String& stream);
private:
Token tokRead();
Token tokLookup();
void tokSkip();
bool tokInputLeft();
Tokenizer::Cursor tokGetCursor();
void tokSetCursor(Tokenizer::Cursor);
BCgen::Expression* parseExprCompound();
BCgen::Expression* parseExprNEW();
BCgen::Expression* parseExprLOCAL();
BCgen::Expression* parseExprCONST();
BCgen::Expression* parseExprCHILD(BCgen::Expression* prnt);
BCgen::Expression* parseExprCALL(BCgen::Expression* prnt);
BCgen::Expression* parseExprAriphm();
BCgen::Expression* parseExprBOOLEAN();
BCgen::Expression* parseExprBOOLEAN_NOT();
BCgen::Expression* parseExprFUNC();
BCgen::Expression* parseExprChain(BCgen::Expression* prnt);
BCgen::Expression* parseExpr(tp::InitialierList<ExprType> expressions = {
ExprType::BOOLEAN_NOT,
ExprType::BOOLEAN,
ExprType::Ariphm,
ExprType::NEW,
ExprType::LOCAL,
ExprType::CONST,
});
BCgen::Statement* parseStmCall();
BCgen::Statement* parseStmDefFunc();
BCgen::Statement* parseStmDefLocal();
BCgen::Statement* parseStmReturn();
BCgen::Statement* parseStmPrint();
BCgen::Statement* parseStmIf();
BCgen::Statement* parseStmWhile();
BCgen::Statement* parseStmCopy();
BCgen::Statement* parseStmClassDef();
BCgen::Statement* parseStm(tp::InitialierList<StmType> stm_types = {
StmType::DefFunc,
StmType::DefLocal,
StmType::Return,
StmType::Print,
StmType::If,
StmType::While,
StmType::Copy,
StmType::Call,
StmType::CLASS_DEF
});
BCgen::StatementScope* parseScope(bool aPushToScopeStack);
Result parse(const tp::String& stream);
};
};