public override object VisitVariableDeclaration_Array([NotNull] CMinusParser.VariableDeclaration_ArrayContext context) { string variableName = context.ID().GetText(); string variableType = SymbolTable.Symbol.RemoveExtras(context.typeSpecifier().GetText()); if (variableType == "void") { this.EmitSemanticErrorMessage("Variable declared as void type", context); } SymbolTable.Symbol symbol = new SymbolTable.Symbol( id: variableName, type: variableType, construct: SymbolTable.Symbol.Construct.ARRAY, scope: 0, size: uint.Parse(context.NUM().GetText()), pointerCount: SymbolTable.Symbol.CountStringAsterisks(context.typeSpecifier().GetText()) ); bool success = this.symbolTable.AddSymbol(symbol); if (!success) { this.EmitSemanticErrorMessage($"Symbol {variableName} already in symbol table as a {this.symbolTable.GetSymbol(variableName).construct}", context); } return(null); }
public override object VisitVariableDeclaration_Array([NotNull] CMinusParser.VariableDeclaration_ArrayContext context) { string arrayName = context.ID().GetText(); int arraySize = int.Parse(context.NUM().GetText()); this.symbolTable.AddVariable(arrayName, arraySize + 1); int arrayPosition; if (this.inGlobalScope) { arrayPosition = 0; } else { arrayPosition = this.symbolTable.GetVariableIndex(arrayName); } this.writer.WriteVariableAddress($"{arrayName}[0]", arrayPosition + 1); this.writer.WriteContextRegisterRead(); this.writer.WriteBinaryArithmeticExpression("+"); this.writer.WriteVariableAddress(arrayName, arrayPosition); this.writer.WriteContextRegisterRead(); this.writer.WriteBinaryArithmeticExpression("+"); this.writer.WriteMemoryWrite(); if (this.inGlobalScope) { this.writer.WriteContextRegisterRead(); this.writer.WriteImmediate(arraySize + 1); this.writer.WriteBinaryArithmeticExpression("+"); this.writer.WriteContextRegisterWrite(); } return(null); }