public override Value VisitUnaryOpExpression([NotNull] UnaryOpExpressionContext context) { var opKind = context.GetOperatorInfo(ParserStack.Parser); if (opKind == OperatorKind.None) { throw new ArgumentException($"invalid unary operator {context.Op}", nameof(context)); } string calleeName = $"$unary{context.Op}"; var function = GetFunction(calleeName); if (function == null) { throw new ArgumentException($"Unknown function reference {calleeName}", nameof(context)); } var arg = context.Rhs.Accept(this); return(InstructionBuilder.Call(function, arg).RegisterName("calltmp")); }
public override IAstNode VisitUnaryOpExpression([NotNull] UnaryOpExpressionContext context) { // verify the operator was previously defined var opKind = RuntimeState.GetUnaryOperatorInfo(context.Op).Kind; if (opKind == OperatorKind.None) { throw new CodeGeneratorException($"invalid unary operator {context.Op}"); } string calleeName = CreateUnaryFunctionName(context.OpToken); var function = FindCallTarget(calleeName); if (function == null) { throw new CodeGeneratorException($"Unknown function reference {calleeName}"); } var arg = ( IExpression )context.Rhs.Accept(this); return(new FunctionCallExpression(context.GetSourceSpan( ), function, arg)); }
public override void EnterUnaryOpExpression(UnaryOpExpressionContext context) { ActiveNode.Properties.Add("Op", context.Op); }