add addr of feature

This commit is contained in:
Qrakhen 2025-12-10 16:03:21 +01:00
parent c42a9a42e6
commit d79cdf9c92
5 changed files with 18 additions and 5 deletions

View File

@ -299,6 +299,9 @@ public static class ExpressionParser
case TokenType.BitwiseNot:
digester.Emit(OpCode.BitwiseNot);
break;
case TokenType.AddressOf:
digester.Emit(OpCode.Addr);
break;
}
}
@ -357,6 +360,7 @@ public static class ExpressionParser
_rules[TokenType.Or] = new Rule(null, Or, Weight.Or);
_rules[TokenType.Print] = new Rule(null, null, Weight.None);
_rules[TokenType.TypeOf] = new Rule(TypeOf, null, Weight.None);
_rules[TokenType.AddressOf] = new Rule(Modifier, null, Weight.Term);
_rules[TokenType.Export] = new Rule(null, null, Weight.None);
_rules[TokenType.Import] = new Rule(null, null, Weight.None);
_rules[TokenType.Return] = new Rule(null, null, Weight.None);

View File

@ -15,6 +15,7 @@ public enum OpCode
Val = 0x10,
Ref = 0x11,
Addr = 0x12,
SetGlobal = 0x20,
GetGlobal = 0x21,

View File

@ -118,6 +118,14 @@ public class Runner : IDisposable
Push(Value.False);
break;
case Op.Addr: {
Value value = Pop();
if (!value.IsObj)
return Error($"can not get address of a value on stack");
Push(new Value(value.Ptr.Address));
break;
}
case Op.GetGlobal: {
string? name = call.Instruction.GetStringConstant(call.Instruction.NextDynamic())?.Value;
if (string.IsNullOrEmpty(name))

View File

@ -285,7 +285,7 @@ public class Reader : IReader<Token>, IDisposable
'&' => Check('&') ?
MakeToken(And, buffer + Next()) :
Check(':') ?
MakeToken(Address, buffer + Next()) :
MakeToken(AddressOf, buffer + Next()) :
MakeToken(BitwiseAnd, buffer),
'^' => Check('~') ?
MakeToken(Base, buffer + Next()) :
@ -320,7 +320,7 @@ public class Reader : IReader<Token>, IDisposable
'=' => Check('=') ?
MakeToken(EqualEqual, buffer + Next()) :
MakeToken(Equal, buffer),
'<' => Peek(1) switch {
'<' => Peek(0) switch {
'~' => MakeToken(Equal, buffer + Next()),
':' => MakeToken(Return, buffer + Next()),
'+' => MakeToken(PlusEqual, buffer + Next()),

View File

@ -47,7 +47,7 @@ public enum TokenType
BitwiseNot = Operator | 9,
BitwiseLeft = Operator | 10,
BitwiseRight = Operator | 11,
Address = Operator | 12, // returns the address of a ptr/object as a value
AddressOf = Operator | 12, // returns the address of a ptr/object as a value
Assignment = 1 << 9,
Equal = Assignment | 1,