private void InsertMethod(TokenType returnType, Token identifier) { // Get type var _returnType = GetDataType(returnType); CurrentMethod = new MethodEntry { NumberOfParameters = 0, Parameters = null, ReturnType = _returnType, SizeOfLocal = 0 }; // Insert formal parameter SymbolTable.Insert(identifier, Depth); var entry = SymbolTable.Lookup(identifier.Lexeme); entry.Type = EntryType.Function; entry.Content = CurrentMethod; // Add method name to class var methodName = new Models.Table.LinkedListNode<string> { Value = identifier.Lexeme }; methodName.Next = CurrentClass.MethodNames; CurrentClass.MethodNames = methodName; }
private void InsertVariable(TokenType dataType, Token identifier, bool isConstant = false, string value = "") { // Get type var _dataType = GetDataType(dataType); var _size = GetDataTypeSize(_dataType); var _offset = 0; var _scope = CurrentVariableScope; if (_scope == VariableScope.MethodParameter) { var paramType = new Models.Table.LinkedListNode<KeyValuePair<string, VariableType>> { Value = new KeyValuePair<string, VariableType>(identifier.Lexeme, _dataType) }; paramType.Next = CurrentMethod.Parameters; CurrentMethod.Parameters = paramType; CurrentMethod.NumberOfParameters++; CurrentMethod.ParameterSize += _size; } else if (_scope == VariableScope.ClassBody) { var field = new Models.Table.LinkedListNode<string> { Value = identifier.Lexeme }; field.Next = CurrentClass.Fields; CurrentClass.Fields = field; CurrentClass.SizeOfLocal += _size; _offset = Offset; Offset += _size; } else if (_scope == VariableScope.MethodBody) { CurrentMethod.SizeOfLocal += _size; _offset = Offset; Offset += _size; } // Insert formal parameter SymbolTable.Insert(identifier, Depth); var entry = SymbolTable.Lookup(identifier.Lexeme); if (isConstant) { entry.Type = EntryType.Constant; entry.Content = new ConstantEntry { DataType = _dataType, Offset = _offset, Value = value }; } else { entry.Type = EntryType.Variable; entry.Content = new VariableEntry { DataType = _dataType, Offset = _offset, Size = _size }; } }