public override object VisitArrayAccessOnExpression([NotNull] ClepsParser.ArrayAccessOnExpressionContext context) { IValue expressionValue = Visit(context.ArrayExpression) as IValue; if (!expressionValue.ExpressionType.IsArrayType) { string errorMessage = String.Format("Expression {0} is not an array and so array access is not possible.", context.ArrayExpression.GetText()); Status.AddError(new CompilerError(FileName, context.ArrayExpression.Start.Line, context.ArrayExpression.Start.Column, errorMessage)); //return something to avoid stopping the compilation return(expressionValue); } ArrayClepsType expressionType = (expressionValue.ExpressionType as ArrayClepsType); List <IValue> indexValues = ArrayIndexAccess(expressionType, context._ArrayIndexExpression); IValueRegister register = CodeGenerator.GetArrayElementRegister(expressionValue, indexValues); IValue retValue = CodeGenerator.GetRegisterValue(register); return(retValue); }
/// <summary> /// Exit a parse tree produced by <see cref="ClepsParser.ArrayAccessOnExpression"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitArrayAccessOnExpression([NotNull] ClepsParser.ArrayAccessOnExpressionContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="ClepsParser.ArrayAccessOnExpression"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitArrayAccessOnExpression([NotNull] ClepsParser.ArrayAccessOnExpressionContext context) { return(VisitChildren(context)); }