add addr of feature
This commit is contained in:
parent
c42a9a42e6
commit
d79cdf9c92
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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()),
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue