Major updates/cleanup.

This commit is contained in:
2026-09-08 07:00:13 +01:00
parent 0df03f418a
commit 0760209417
23 changed files with 668 additions and 441 deletions
+53 -138
View File
@@ -6,74 +6,49 @@ void Parser::locator(AddressPromise &addr) {
addr.base = AddressPromise::None{};
switch (peek()) {
case '.':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Current{};
break;
case '$':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Last{};
break;
case '%':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::LastRange{};
break;
case '[':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Block{Direction::Backward};
break;
case ']':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Block{Direction::Forward};
break;
case '^':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Diagnostic{Direction::Backward};
break;
case '~':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Diagnostic{Direction::Forward};
break;
case '\'':
tokens->push_back(
{.start = i,
.end = i + (uint64_t)2,
.type = io::Token::Mark}
);
token(io::Token::Mark);
advance();
if (('a' <= peek() && peek() <= 'z')
|| ('A' <= peek() && peek() <= 'Z'))
@@ -81,17 +56,16 @@ void Parser::locator(AddressPromise &addr) {
else
throw ed_error("Valid mark needed after \'");
advance();
end_token();
break;
case '{': {
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
uint16_t j = 0;
std::string func;
std::string arg;
token(io::Token::RubyFunction);
while (peek(j) != '}') {
if (peek(j) == '\0')
throw ed_error("Scripted address not terminated");
@@ -100,6 +74,8 @@ void Parser::locator(AddressPromise &addr) {
if (peek(j) == ':') {
func = peek_str(j);
advance(j + 1);
end_token();
token(io::Token::RubyArg);
j = 0;
continue;
}
@@ -109,26 +85,15 @@ void Parser::locator(AddressPromise &addr) {
arg = peek_str(j);
else
func = peek_str(j);
tokens->push_back(
{.start = i,
.end = i + (uint64_t)func.size(),
.type = io::Token::RubyFunction}
);
if (arg.size())
tokens->push_back(
{.start = i + (uint64_t)func.size() + 1,
.end = i + (uint64_t)func.size() + 1 + (uint64_t)arg.size(),
.type = io::Token::RubyFunction}
);
addr.base = AddressPromise::Scripted{std::move(func), std::move(arg)};
advance(j + 1);
tokens->push_back(
{.start = i,
.end = i - (uint64_t)1,
.type = io::Token::AddressSymbol}
);
advance(j);
end_token();
token(io::Token::AddressSymbol);
advance();
end_token();
} break;
case '/': {
token(io::Token::Regexp);
advance();
uint64_t j = 0;
while (true) {
@@ -148,19 +113,11 @@ void Parser::locator(AddressPromise &addr) {
Direction::Forward,
std::string(peek_str(j))
);
tokens->push_back(
{.start = (uint64_t)i - 1,
.end = (uint64_t)i + j + 1,
.type = io::Token::Regexp}
);
advance(j + 1);
end_token();
} break;
case '?': {
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::Regexp);
advance();
uint16_t j = 0;
while (true) {
@@ -180,14 +137,11 @@ void Parser::locator(AddressPromise &addr) {
Direction::Backward,
std::string(peek_str(j))
);
tokens->push_back(
{.start = (uint64_t)i - 1,
.end = (uint64_t)i + j + 1,
.type = io::Token::Regexp}
);
advance(j + 1);
end_token();
} break;
case '<': {
token(io::Token::Label);
advance();
uint16_t j = 0;
while (peek(j) != '>'
@@ -208,14 +162,11 @@ void Parser::locator(AddressPromise &addr) {
};
break;
}
tokens->push_back(
{.start = (uint64_t)i - 1,
.end = (uint64_t)i + j + 1,
.type = io::Token::AddressSymbol}
);
advance(j + 1);
end_token();
} break;
case '>': {
token(io::Token::Label);
advance();
uint16_t j = 0;
while (peek(j) != '>' && peek(j) != '\0')
@@ -230,20 +181,13 @@ void Parser::locator(AddressPromise &addr) {
};
break;
}
tokens->push_back(
{.start = (uint64_t)i - 1,
.end = (uint64_t)i + j + 1,
.type = io::Token::AddressSymbol}
);
advance(j + 1);
end_token();
} break;
case '+': {
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
addr.base = AddressPromise::Current{};
uint16_t j = 0;
uint64_t num = 0;
@@ -253,21 +197,15 @@ void Parser::locator(AddressPromise &addr) {
}
if (j == 0)
num = 1;
tokens->push_back(
{.start = (uint64_t)i,
.end = (uint64_t)i + j,
.type = io::Token::Number}
);
advance(j);
addr.offset += num;
advance(j);
end_token();
} break;
case '-': {
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
advance();
end_token();
token(io::Token::Number);
addr.base = AddressPromise::Current{};
uint16_t j = 0;
uint64_t num = 0;
@@ -277,28 +215,20 @@ void Parser::locator(AddressPromise &addr) {
}
if (j == 0)
num = 1;
tokens->push_back(
{.start = (uint64_t)i,
.end = (uint64_t)i + j,
.type = io::Token::Number}
);
advance(j);
addr.offset -= num;
advance(j);
end_token();
} break;
default:
if ('0' <= peek() && peek() <= '9') {
uint16_t start = i;
token(io::Token::Number);
uint64_t num = 0;
while ('0' <= peek() && peek() <= '9') {
num = num * 10 + (peek() - '0');
advance();
}
addr.base = AddressPromise::Number{num};
tokens->push_back(
{.start = (uint64_t)start,
.end = (uint64_t)i,
.type = io::Token::Number}
);
end_token();
}
}
}
@@ -308,26 +238,19 @@ int64_t Parser::offset() {
while (peek() == '+' || peek() == '-'
|| ('0' <= peek() && peek() <= '9')) {
bool positive = peek() != '-';
if (peek() == '+' || peek() == '-') {
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSymbol}
);
token(io::Token::AddressSymbol);
if (peek() == '+' || peek() == '-')
advance();
}
end_token();
token(io::Token::Number);
uint16_t j = 0;
int64_t num = 0;
while ('0' <= peek(j) && peek(j) <= '9')
num = num * 10 + (peek(j++) - '0');
if (j == 0)
num = 1;
tokens->push_back(
{.start = (uint64_t)i,
.end = (uint64_t)i + j,
.type = io::Token::Number}
);
advance(j);
end_token();
offset += positive ? num : -num;
skip_ws();
}
@@ -337,7 +260,7 @@ int64_t Parser::offset() {
void Parser::address(AddressPromise &addr) {
if (peek() == ':') {
uint16_t start = i;
token(io::Token::BufferName);
advance();
uint16_t j = 0;
while (peek(j) != ':' && peek(j) != '\0')
@@ -346,11 +269,7 @@ void Parser::address(AddressPromise &addr) {
advance(j);
if (peek() == ':')
advance();
tokens->push_back(
{.start = start,
.end = i,
.type = io::Token::BufferName}
);
end_token();
}
skip_ws();
if (peek() == '\0')
@@ -367,11 +286,7 @@ void Parser::addresses(std::vector<AddressPromise> &addresses) {
address(*addr);
while (peek() == ',' || peek() == ';') {
addr->jumping = peek() == ';';
tokens->push_back(
{.start = i,
.end = i + (uint64_t)1,
.type = io::Token::AddressSeperator}
);
token(io::Token::AddressSeperator);
advance();
skip_ws();
addresses.push_back({});