195 lines
No EOL
3.7 KiB
C++
195 lines
No EOL
3.7 KiB
C++
#pragma once
|
|
#include "NewPlacement.hpp"
|
|
#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();
|
|
|
|
struct Error {
|
|
tp::String mDescr = "No Description";
|
|
tp::alni mAdvanecedIdx = NULL;
|
|
|
|
Error() {}
|
|
Error(tp::String descr, tp::alni idx) {
|
|
mDescr = descr;
|
|
mAdvanecedIdx = idx;
|
|
}
|
|
|
|
tp::Pair<tp::alni, tp::alni> get_err_location(const char* stream) {
|
|
tp::alni line = 1;
|
|
tp::alni colomn = 1;
|
|
|
|
//assert(mAdvanecedIdx);
|
|
|
|
for (auto i : tp::Range(mAdvanecedIdx)) {
|
|
if (stream[i] == '\n') {
|
|
colomn = 0;
|
|
line++;
|
|
}
|
|
colomn++;
|
|
}
|
|
|
|
return { line, colomn };
|
|
}
|
|
};
|
|
|
|
struct Resault {
|
|
Error* err = NULL;
|
|
obj::BCgen::StatementScope* scope = NULL;
|
|
} mRes;
|
|
|
|
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::init_list<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::init_list<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);
|
|
};
|
|
}; |