Replace object parser with lalr library
This commit is contained in:
parent
8f87c3bc33
commit
1293136343
13 changed files with 499 additions and 995 deletions
|
|
@ -13,7 +13,6 @@ namespace obj {
|
|||
struct ExpressionCall;
|
||||
|
||||
struct Expression {
|
||||
|
||||
enum class Type {
|
||||
NONE,
|
||||
NEW,
|
||||
|
|
@ -76,7 +75,7 @@ namespace obj {
|
|||
Expression* mRight = NULL;
|
||||
|
||||
enum class BoolType : tp::uint1 {
|
||||
AND = 24U,
|
||||
AND = 24U,
|
||||
OR,
|
||||
EQUAL,
|
||||
NOT_EQUAL,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue