unary + and - in compiler
This commit is contained in:
parent
fbabd9f801
commit
78835a06e4
4 changed files with 43 additions and 7 deletions
|
@ -73,6 +73,17 @@ namespace lib94 {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct negative_number_expr : public number_expr {
|
||||||
|
std::unique_ptr<number_expr> inner;
|
||||||
|
|
||||||
|
virtual std::optional<number_t> to_number(const std::map<std::string, number_t> &label_offsets, const std::map<std::string, number_t> ¯o_values, number_t this_offset) {
|
||||||
|
std::optional<number_t> inner_result = inner->to_number(label_offsets, macro_values, this_offset);
|
||||||
|
if (inner_result.has_value())
|
||||||
|
return LIB94_CORE_SIZE - inner_result.value();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
bool valid_label(std::string candidate) {
|
bool valid_label(std::string candidate) {
|
||||||
if (candidate == "")
|
if (candidate == "")
|
||||||
return false;
|
return false;
|
||||||
|
@ -91,8 +102,21 @@ namespace lib94 {
|
||||||
size_t layers = 0;
|
size_t layers = 0;
|
||||||
|
|
||||||
for (int i = part.size() - 1; i >= 0; --i)
|
for (int i = part.size() - 1; i >= 0; --i)
|
||||||
if (layers == 0 && candidates.find(part[i]) != std::string::npos)
|
if (layers == 0 && candidates.find(part[i]) != std::string::npos) {
|
||||||
|
|
||||||
|
if (part[i] == '-' || part[i] == '+') {
|
||||||
|
for (int j = i - 1; j >= 0; --j) {
|
||||||
|
if (isalnum(part[j]) || part[j] == '_' || part[j] == ')')
|
||||||
return i;
|
return i;
|
||||||
|
if (part[j] != ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
else if (part[i] == ')')
|
else if (part[i] == ')')
|
||||||
++layers;
|
++layers;
|
||||||
else if (part[i] == '(')
|
else if (part[i] == '(')
|
||||||
|
@ -157,6 +181,18 @@ namespace lib94 {
|
||||||
if (part[0] == '(' && part[part.size() - 1] == ')')
|
if (part[0] == '(' && part[part.size() - 1] == ')')
|
||||||
return to_number_expr(part.substr(1, part.size() - 2));
|
return to_number_expr(part.substr(1, part.size() - 2));
|
||||||
|
|
||||||
|
if (part[0] == '+')
|
||||||
|
return to_number_expr(part.substr(1));
|
||||||
|
|
||||||
|
if (part[0] == '-') {
|
||||||
|
std::optional<std::unique_ptr<number_expr>> inner = to_number_expr(part.substr(1));
|
||||||
|
if (!inner.has_value())
|
||||||
|
return {};
|
||||||
|
std::unique_ptr<negative_number_expr> expr = std::make_unique<negative_number_expr>();
|
||||||
|
expr->inner = std::move(inner.value());
|
||||||
|
return expr;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
size_t count;
|
size_t count;
|
||||||
number_t number = std::stoul(part, &count);
|
number_t number = std::stoul(part, &count);
|
||||||
|
|
|
@ -37,7 +37,7 @@ dwarf:
|
||||||
|
|
||||||
core_clear:
|
core_clear:
|
||||||
mov end, end + 1
|
mov end, end + 1
|
||||||
add.ab #1, 0-1
|
add.ab #1, -1
|
||||||
jmp 2
|
jmp 2
|
||||||
|
|
||||||
dat
|
dat
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
;name Dwarf
|
;name Dwarf
|
||||||
|
|
||||||
mov 3, 7
|
mov 3, 7
|
||||||
add.ab #4, 0-1
|
add.ab #4, -1
|
||||||
jmp 0-2
|
jmp -2
|
||||||
|
|
|
@ -6,7 +6,7 @@ period equ 10
|
||||||
scan_init equ end - (end - scan) % period + period
|
scan_init equ end - (end - scan) % period + period
|
||||||
|
|
||||||
scan:
|
scan:
|
||||||
seq.i 0 - period, scan_init
|
seq.i -period, scan_init
|
||||||
jmp found
|
jmp found
|
||||||
|
|
||||||
found_ret:
|
found_ret:
|
||||||
|
@ -18,13 +18,13 @@ found_ret:
|
||||||
jmn.a scan, scan
|
jmn.a scan, scan
|
||||||
|
|
||||||
clear:
|
clear:
|
||||||
mov end, 0 - 1
|
mov end, - 1
|
||||||
sub.ab #2, clear
|
sub.ab #2, clear
|
||||||
|
|
||||||
seq.ab #end - clear - (end - clear) % 2 + 3, clear
|
seq.ab #end - clear - (end - clear) % 2 + 3, clear
|
||||||
jmp clear
|
jmp clear
|
||||||
|
|
||||||
mov.ab #0 - 1, clear
|
mov.ab #-1, clear
|
||||||
jmp clear
|
jmp clear
|
||||||
|
|
||||||
scan_add:
|
scan_add:
|
||||||
|
|
Loading…
Add table
Reference in a new issue