Parser done implementing

This commit is contained in:
IlyaShurupov 2024-03-06 10:58:50 +03:00 committed by Ilya Shurupov
parent 87fb15ed13
commit d4c85a3d86
4 changed files with 31 additions and 42 deletions

View file

@ -555,17 +555,13 @@ void obj::BCgen::deinit() {}
bool obj::BCgen::Compile(obj::MethodObject* method) {
Parser sParger;
Parser parser;
auto script = method->mScript->mReadable->val;
auto res = sParger.parse(script);
auto res = parser.parse(script);
if (res.err) {
if (res.isError) {
// TODO : print parse error
auto loc = res.err->getErrorLocation(script.read());
printf("Parser Error (%i,%i): %s\n", loc.head, loc.tail, res.err->mDescription.read());
// tp::gLogeer->write(tp::sfmt("Parser Error (%i,%i): \n", loc.head, loc.tail), true, tp::Logger::LogEntry::ERR);
// tp::GLog->write(res.err->mDescr, true, tp::Logger::LogEntry::ERR);
return false;
}

View file

@ -6,24 +6,37 @@
using namespace obj;
lalr::ErrorPolicy::~ErrorPolicy() = default;
void lalr::ErrorPolicy::lalr_error(int line, int column, int error, const char* format, va_list args) {}
void lalr::ErrorPolicy::lalr_vprintf(const char* format, va_list args){};
class CustomErrorPolicy : public lalr::ErrorPolicy {
public:
virtual ~CustomErrorPolicy() override {}
virtual void lalr_error(int line, int column, int error, const char* format, va_list args) override {
printf("Parser Error: %i %i \n", line, column);
vfprintf(stdout, format, args);
printf("\n");
}
virtual void lalr_vprintf(const char* format, va_list args) override { printf(format, args); }
};
Parser::Result Parser::parse(const tp::String& stream) {
lalr::ErrorPolicy errorPolicy;
CustomErrorPolicy errorPolicy;
LalrParser parser(oscript_parser_state_machine, &errorPolicy);
bind(parser);
std::string streamStd(stream.read());
LALR_ASSERT(parser.valid());
ASSERT(parser.valid());
parser.parse(streamStd.begin(), streamStd.end());
parser.accepted();
parser.full();
auto scope = (BCgen::StatementScope*) parser.user_data();
return { nullptr, scope };
return { scope, parser.accepted() && parser.full() };
}