예제 #1
0
        public override object VisitVariable_ArrayAccess([NotNull] CMinusParser.Variable_ArrayAccessContext context)
        {
            this.Visit(context.variable());
            this.writer.WriteMemoryAccess();
            this.Visit(context.logicalOrExpression());
            this.writer.WriteBinaryArithmeticExpression("+");

            return(null);
        }
        public override object VisitVariable_ArrayAccess([NotNull] CMinusParser.Variable_ArrayAccessContext context)
        {
            string arrayType = (string)this.Visit(context.variable());

            string arrayName = SymbolTable.Symbol.RemoveExtras(context.variable().GetText());

            if (!this.symbolTable.HasSymbol(arrayName))
            {
                this.EmitSemanticErrorMessage($"Variable {arrayName} called but not declared", context);
                return(SymbolTable.Symbol.Construct.ERROR);
            }

            SymbolTable.Symbol foundSymbol = this.symbolTable.GetSymbol(arrayName);

            if (foundSymbol.construct != SymbolTable.Symbol.Construct.ARRAY)
            {
                this.EmitSemanticErrorMessage($"{arrayName} used as an array but declared as a {foundSymbol.construct}", context);
                return(SymbolTable.Symbol.Construct.ERROR);
            }

            return(foundSymbol.type);
        }