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: case TokenType.BitwiseNot:
digester.Emit(OpCode.BitwiseNot); digester.Emit(OpCode.BitwiseNot);
break; 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.Or] = new Rule(null, Or, Weight.Or);
_rules[TokenType.Print] = new Rule(null, null, Weight.None); _rules[TokenType.Print] = new Rule(null, null, Weight.None);
_rules[TokenType.TypeOf] = new Rule(TypeOf, 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.Export] = new Rule(null, null, Weight.None);
_rules[TokenType.Import] = new Rule(null, null, Weight.None); _rules[TokenType.Import] = new Rule(null, null, Weight.None);
_rules[TokenType.Return] = 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, Val = 0x10,
Ref = 0x11, Ref = 0x11,
Addr = 0x12,
SetGlobal = 0x20, SetGlobal = 0x20,
GetGlobal = 0x21, GetGlobal = 0x21,

View File

@ -118,6 +118,14 @@ public class Runner : IDisposable
Push(Value.False); Push(Value.False);
break; 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: { case Op.GetGlobal: {
string? name = call.Instruction.GetStringConstant(call.Instruction.NextDynamic())?.Value; string? name = call.Instruction.GetStringConstant(call.Instruction.NextDynamic())?.Value;
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))

View File

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

View File

@ -47,7 +47,7 @@ public enum TokenType
BitwiseNot = Operator | 9, BitwiseNot = Operator | 9,
BitwiseLeft = Operator | 10, BitwiseLeft = Operator | 10,
BitwiseRight = Operator | 11, 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, Assignment = 1 << 9,
Equal = Assignment | 1, Equal = Assignment | 1,