add increment/decrement operators
This commit is contained in:
parent
80643b910c
commit
1c4022cebc
|
@ -190,6 +190,20 @@ std::any EmitVisitor::visitVariable(xlangParser::VariableContext *ctx) {
|
||||||
last = "%_" + name;
|
last = "%_" + name;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
if (ctx->Increment()) {
|
||||||
|
visitExpr(ctx->expr());
|
||||||
|
output << " %_" << name << " = w add %_" << name << ", " << last
|
||||||
|
<< std::endl;
|
||||||
|
last = "%_" + name;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (ctx->Decrement()) {
|
||||||
|
visitExpr(ctx->expr());
|
||||||
|
output << " %_" << name << " = w sub %_" << name << ", " << last
|
||||||
|
<< std::endl;
|
||||||
|
last = "%_" + name;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
if (ctx->LeftParen()) {
|
if (ctx->LeftParen()) {
|
||||||
std::vector<std::string> args;
|
std::vector<std::string> args;
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,21 @@ std::any TypeCheckVisitor::visitVariable(xlangParser::VariableContext *ctx) {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (auto expr = ctx->expr()) {
|
||||||
|
auto righttype = std::any_cast<Type>(visitExpr(expr));
|
||||||
|
|
||||||
|
if (auto lefttype = scope.get(name)) {
|
||||||
|
if (*lefttype != Type::Integer) {
|
||||||
|
errorlistener.typeMismatch(token, Type::Integer, *lefttype);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errorlistener.unknownVariable(token, name);
|
||||||
|
}
|
||||||
|
if (righttype != Type::Integer) {
|
||||||
|
errorlistener.typeMismatch(token, Type::Integer, righttype);
|
||||||
|
}
|
||||||
|
return Type::Integer;
|
||||||
|
}
|
||||||
if (ctx->LeftParen()) {
|
if (ctx->LeftParen()) {
|
||||||
auto it = signatures.find(name);
|
auto it = signatures.find(name);
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ factor : Minus factor
|
||||||
variable : Identifier
|
variable : Identifier
|
||||||
| Identifier Define value
|
| Identifier Define value
|
||||||
| Identifier Assign value
|
| Identifier Assign value
|
||||||
|
| Identifier Increment expr
|
||||||
|
| Identifier Decrement expr
|
||||||
| Identifier LeftParen argumentList? RightParen
|
| Identifier LeftParen argumentList? RightParen
|
||||||
;
|
;
|
||||||
argumentList : value (Comma value)*;
|
argumentList : value (Comma value)*;
|
||||||
|
@ -87,6 +89,8 @@ BitNot : '~';
|
||||||
Mul : '*';
|
Mul : '*';
|
||||||
Div : '/';
|
Div : '/';
|
||||||
Rem : '%';
|
Rem : '%';
|
||||||
|
Increment : '=+';
|
||||||
|
Decrement : '=-';
|
||||||
Comma : ',';
|
Comma : ',';
|
||||||
Semicolon : ';';
|
Semicolon : ';';
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ main() : int {
|
||||||
while i < 10 {
|
while i < 10 {
|
||||||
print fib_rec(i);
|
print fib_rec(i);
|
||||||
print fib_iter(i);
|
print fib_iter(i);
|
||||||
i = i + 1;
|
i =+ 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ fib_iter(n : int) : int {
|
||||||
t := x0 + x1;
|
t := x0 + x1;
|
||||||
x0 = x1;
|
x0 = x1;
|
||||||
x1 = t;
|
x1 = t;
|
||||||
i = i + 1;
|
i =+ 1;
|
||||||
}
|
}
|
||||||
return x0;
|
return x0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,11 @@ main() : int {
|
||||||
composite = true;
|
composite = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
j = j + 2;
|
j =+ 2;
|
||||||
}
|
}
|
||||||
if not composite {
|
if not composite {
|
||||||
print i;
|
print i;
|
||||||
}
|
}
|
||||||
i = i + 2;
|
i =+ 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue