import FrontCalculatorParserToken from "./front.calculator.parser.token"; import FrontCalculatorSymbolNumber from "../symbol/front.calculator.symbol.number"; import FrontCalculatorSymbolOpeningBracket from "../symbol/brackets/front.calculator.symbol.opening.bracket"; import FrontCalculatorSymbolClosingBracket from "../symbol/brackets/front.calculator.symbol.closing.bracket"; import FrontCalculatorSymbolFunctionAbstract from "../symbol/abstract/front.calculator.symbol.function.abstract"; import FrontCalculatorSymbolOperatorAbstract from "../symbol/abstract/front.calculator.symbol.operator.abstract"; import FrontCalculatorSymbolSeparator from "../symbol/front.calculator.symbol.separator"; import FrontCalculatorParserNodeSymbol from "./node/front.calculator.parser.node.symbol"; import FrontCalculatorParserNodeContainer from "./node/front.calculator.parser.node.container"; import FrontCalculatorParserNodeFunction from "./node/front.calculator.parser.node.function"; /** * The parsers has one important method: parse() * It takes an array of tokens as input and * returns an array of nodes as output. * These nodes are the syntax tree of the term. * */ export default class FrontCalculatorParser { /** * * @param {FrontCalculatorSymbolLoader} symbolLoader */ constructor(symbolLoader) { /** * * @type {FrontCalculatorSymbolLoader} */ this.symbolLoader = symbolLoader; } /** * Parses an array with tokens. Returns an array of nodes. * These nodes define a syntax tree. * * @param {FrontCalculatorParserToken[]} tokens * * @returns FrontCalculatorParserNodeContainer */ parse(tokens) { var symbolNodes = this.detectSymbols(tokens); var nodes = this.createTreeByBrackets(symbolNodes); nodes = this.transformTreeByFunctions(nodes); this.checkGrammar(nodes); // Wrap the nodes in an array node. return new FrontCalculatorParserNodeContainer(nodes); } /** * Creates a flat array of symbol nodes from tokens. * * @param {FrontCalculatorParserToken[]} tokens * @returns {FrontCalculatorParserNodeSymbol[]} */ detectSymbols(tokens) { var symbolNodes = []; var symbol = null; var identifier = null; var expectingOpeningBracket = false; // True if we expect an opening bracket (after a function name) var openBracketCounter = 0; for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var type = token.type; if (FrontCalculatorParserToken.TYPE_WORD === type) { identifier = token.value; symbol = this.symbolLoader.find(identifier); if (null === symbol) { throw ('Error: Detected unknown or invalid string identifier: ' + identifier + '.'); } } else if (type === FrontCalculatorParserToken.TYPE_NUMBER) { // Notice: Numbers do not have an identifier var symbolNumbers = this.symbolLoader.findSubTypes(FrontCalculatorSymbolNumber); if (symbolNumbers.length < 1 || !(symbolNumbers instanceof Array)) { throw ('Error: Unavailable number symbol processor.'); } symbol = symbolNumbers[0]; } else {// Type Token::TYPE_CHARACTER: identifier = token.value; symbol = this.symbolLoader.find(identifier); if (null === symbol) { throw ('Error: Detected unknown or invalid string identifier: ' + identifier + '.'); } if (symbol instanceof FrontCalculatorSymbolOpeningBracket) { openBracketCounter++; } if (symbol instanceof FrontCalculatorSymbolClosingBracket) { openBracketCounter--; // Make sure there are not too many closing brackets if (openBracketCounter < 0) { throw ('Error: Found closing bracket that does not have an opening bracket.'); } } } if (expectingOpeningBracket) { if (!(symbol instanceof FrontCalculatorSymbolOpeningBracket)) { throw ('Error: Expected opening bracket (after a function) but got something else.'); } expectingOpeningBracket = false; } else { if (symbol instanceof FrontCalculatorSymbolFunctionAbstract) { expectingOpeningBracket = true; } } var symbolNode = new FrontCalculatorParserNodeSymbol(token, symbol); symbolNodes.push(symbolNode); } // Make sure the term does not end with the name of a function but without an opening bracket if (expectingOpeningBracket) { throw ('Error: Expected opening bracket (after a function) but reached the end of the term'); } // Make sure there are not too many opening brackets if (openBracketCounter > 0) { throw ('Error: There is at least one opening bracket that does not have a closing bracket'); } return symbolNodes; } /** * Expects a flat array of symbol nodes and (if possible) transforms * it to a tree of nodes. Cares for brackets. * Attention: Expects valid brackets! * Check the brackets before you call this method. * * @param {FrontCalculatorParserNodeSymbol[]} symbolNodes * @returns {FrontCalculatorParserNodeAbstract[]} */ createTreeByBrackets(symbolNodes) { var tree = []; var nodesInBracket = []; // AbstractSymbol nodes inside level-0-brackets var openBracketCounter = 0; for (var i = 0; i < symbolNodes.length; i++) { var symbolNode = symbolNodes[i]; if (!(symbolNode instanceof FrontCalculatorParserNodeSymbol)) { throw ('Error: Expected symbol node, but got "' + symbolNode.constructor.name + '"'); } if (symbolNode.symbol instanceof FrontCalculatorSymbolOpeningBracket) { openBracketCounter++; if (openBracketCounter > 1) { nodesInBracket.push(symbolNode); } } else if (symbolNode.symbol instanceof FrontCalculatorSymbolClosingBracket) { openBracketCounter--; // Found a closing bracket on level 0 if (0 === openBracketCounter) { var subTree = this.createTreeByBrackets(nodesInBracket); // Subtree can be empty for example if the term looks like this: "()" or "functioname()" // But this is okay, we need to allow this so we can call functions without a parameter tree.push(new FrontCalculatorParserNodeContainer(subTree)); nodesInBracket = []; } else { nodesInBracket.push(symbolNode); } } else { if (0 === openBracketCounter) { tree.push(symbolNode); } else { nodesInBracket.push(symbolNode); } } } return tree; } /** * Replaces [a SymbolNode that has a symbol of type AbstractFunction, * followed by a node of type ContainerNode] by a FunctionNode. * Expects the $nodes not including any function nodes (yet). * * @param {FrontCalculatorParserNodeAbstract[]} nodes * * @returns {FrontCalculatorParserNodeAbstract[]} */ transformTreeByFunctions(nodes) { var transformedNodes = []; var functionSymbolNode = null; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (node instanceof FrontCalculatorParserNodeContainer) { var transformedChildNodes = this.transformTreeByFunctions(node.childNodes); if (null !== functionSymbolNode) { var functionNode = new FrontCalculatorParserNodeFunction(transformedChildNodes, functionSymbolNode); transformedNodes.push(functionNode); functionSymbolNode = null; } else { // not a function node.childNodes = transformedChildNodes; transformedNodes.push(node); } } else if (node instanceof FrontCalculatorParserNodeSymbol) { var symbol = node.symbol; if (symbol instanceof FrontCalculatorSymbolFunctionAbstract) { functionSymbolNode = node; } else { transformedNodes.push(node); } } else { throw ('Error: Expected array node or symbol node, got "' + node.constructor.name + '"'); } } return transformedNodes; } /** * Ensures the tree follows the grammar rules for terms * * @param {FrontCalculatorParserNodeAbstract[]} nodes */ checkGrammar(nodes) { // TODO Make sure that separators are only in the child nodes of the array node of a function node // (If this happens the calculator will throw an exception) for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (node instanceof FrontCalculatorParserNodeSymbol) { var symbol = node.symbol; if (symbol instanceof FrontCalculatorSymbolOperatorAbstract) { var posOfRightOperand = i + 1; // Make sure the operator is positioned left of a (potential) operand (=prefix notation). // Example term: "-1" if (posOfRightOperand >= nodes.length) { throw ('Error: Found operator that does not stand before an operand.'); } var posOfLeftOperand = i - 1; var leftOperand = null; // Operator is unary if positioned at the beginning of a term if (posOfLeftOperand >= 0) { leftOperand = nodes[posOfLeftOperand]; if (leftOperand instanceof FrontCalculatorParserNodeSymbol) { if (leftOperand.symbol instanceof FrontCalculatorSymbolOperatorAbstract // example 1`+-`5 : + = operator, - = unary || leftOperand.symbol instanceof FrontCalculatorSymbolSeparator // example func(1`,-`5) ,= separator, - = unary ) { // Operator is unary if positioned right to another operator leftOperand = null; } } } // If null, the operator is unary if (null === leftOperand) { if (!symbol.operatesUnary) { throw ('Error: Found operator in unary notation that is not unary.'); } // Remember that this node represents a unary operator node.setIsUnaryOperator(true); } else { if (!symbol.operatesBinary) { console.log(symbol); throw ('Error: Found operator in binary notation that is not binary.'); } } } } else { this.checkGrammar(node.childNodes); } } } }.tx-content-switcher-toggle-switch-label{position:relative;display:inline-block;width:60px;height:34px}.tx-content-switcher-toggle-switch-label input{opacity:0;width:0;height:0}.tx-content-switcher-toggle-switch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s;display:block;border-style:solid}.tx-content-switcher-toggle-switch-slider:before{position:absolute;content:"";height:26px;width:26px;left:0;top:50%;transform:translateY(-50%);background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.tx-content-switcher-toggle-switch-slider{background-color:#2196f3}input:focus+.tx-content-switcher-toggle-switch-slider{box-shadow:0 0 1px #2196f3}input:checked+.tx-content-switcher-toggle-switch-slider:before{-webkit-transform:translate(34px,-50%);-ms-transform:translate(34px,-50%);transform:translate(34px,-50%)}.tx-content-switcher-toggle-inner{display:flex;align-items:center;flex-direction:row;padding:30px 0}.tx-content-switcher-toggle.tx_switecher_left{justify-content:flex-start;display:flex}.tx-content-switcher-toggle.tx_switecher_center{justify-content:center;display:flex}.tx-content-switcher-toggle.tx_switecher_right{justify-content:flex-end;display:flex}.tx-content-switcher-toggle.tx_switecher_justify{display:block}.tx-content-switcher-toggle.tx_switecher_justify .tx-content-switcher-toggle-inner{justify-content:center}.tx-content-switcher-toggle-label-1,.tx-content-switcher-toggle-label-2{cursor:pointer} Make My Asset - Make My Asset: Premier Gurgaon Real Estate Consultants - Luxury Apartments, Commercial Properties, And Exclusive Listings In Prime Locations

Unlock Your Dream Home

Trusted Real Estate Broker Connecting You to Exceptional Properties!

MAKE MY ASSET

Best Real Estate Firm in Gurgaon

Who We Are?

Welcome to Make My Asset, the leading firm in Gurgaon real estate, dedicated to providing exceptional services for all your property needs. As the No. 1 real estate consultants and brokers in the region, we specialize in a wide array of properties, including luxury apartments, prime commercial properties, and residential property listings in Gurgaon’s most coveted locations. Whether you are looking for affordable housing or exclusive properties, our expert agents are here to guide you through every step of your property journey.

Gurgaon Real Estate Make My Asset
Gurgaon Real Estate Make My Asset

Gurgaon, often referred to as the Millennium City, boasts a dynamic and rapidly growing property market. Our extensive knowledge of the Gurgaon property market allows us to offer the best real estate investment opportunities tailored to your preferences. With new projects constantly emerging from top developers, the city provides an array of options for both residential and commercial real estate investors. We understand the importance of finding the right investment, which is why our services are designed to cater to both seasoned investors and first-time buyers.

Our luxury apartments in Gurgaon are situated in prime locations, offering unparalleled amenities and a lifestyle of comfort and convenience. These properties are perfect for those seeking a blend of modern living and elegance. For businesses, our prime commercial properties in Gurgaon provide strategic locations that ensure visibility and accessibility, ideal for offices, retail stores, and more. Our listings include some of the best commercial spaces available, guaranteeing a solid foundation for your business ventures.

At Make My Asset, we believe that everyone deserves a place they can call home. Our affordable housing options in Gurgaon are designed to cater to various budgets without compromising on quality. These properties provide excellent value and are located in well-connected areas, making them a great choice for families and individuals alike. Our exclusive properties in Gurgaon are handpicked to offer unique features and premium living experiences, ensuring that our clients have access to the very best the city has to offer.

Navigating the Gurgaon property market can be complex, but with our professional property management services, you can rest assured that your investments are in safe hands. We handle everything from tenant management to property maintenance, ensuring that your real estate assets are well-managed and yield the best returns. Our team of dedicated real estate agents is always ready to assist you with personalized services, ensuring that your property transactions are smooth and hassle-free.

As your trusted real estate brokers in Gurgaon, we pride ourselves on our transparent and client-centric approach. We are committed to providing you with detailed market insights and the latest property trends, helping you make informed decisions. Our collaboration with top developers ensures that you have access to the latest projects and exclusive deals in Gurgaon.

Whether you are looking for a property for sale or rent, Make My Asset is your go-to real estate firm in Gurgaon. Our extensive listings feature a diverse range of options to suit every need. From luxurious apartments to commercial spaces and affordable homes, we have something for everyone. Explore the thriving Gurgaon property market with us and discover your dream property today.

Experience the finest real estate services in Gurgaon with Make My Asset. Contact us now to schedule a consultation and take the first step towards finding your perfect property in the heart of Gurgaon. Your dream home or business location is just a call away.

Real Estate Consultant in Gurugram

Are you looking for noteworthy locations in Gurugram for investors in the residential real estate sector? We consult any query about the potential of homes near Dwarka Expressway promising excellent types of investments and Premium Gurugram. Gurugram is a fast-rising real estate destination and an ideal investment also. MakeMyAsset’s thriving real estate market is grabbing the attention of both end-users and investors. Make My Asset is the best spot for real estate investment in Gurugram, and Here the prices are also commensurate with the quality.
Make My Asset | Gurugram Real Estate | Top Services for Luxury Homes & Investments

Find It

Make My Asset | Gurugram Real Estate | Top Services for Luxury Homes & Investments

Tour It

Make My Asset | Gurugram Real Estate | Top Services for Luxury Homes & Investments

Secure It

Explore Properties in Gurugram

Gurugram is a residential hub that houses numerous localities offering an assortment of inventory choices across budgets. Some of the popular localities in Gurugram with Dwarka Expressway. We are prominent & renowned as a property dealer, builder, & real estate investment agent in Gurugram, Haryana.

View Our Services

We consistently provide comprehensive & 100% genuine real estate investment services with all modern amenities. Our primary focus is on developing commercial and residential properties. Here all facilities & localities are in comfortable mode and Luxurious environment in Gurugram, Haryana.

Real Estate Investment

Property Selling

Property Consultant

Project Underwriting

What Our Client Says

icons8 user 100
Vimal Saini Delhi

Make My Asset turned my real estate dreams into reality! Their expertise, dedication, and personalized approach made the entire buying process smooth and stress-free. Highly recommended!

icons8 user 100
Sunny Singh Haryana

Working with Make My Asset was a game-changer! Their deep knowledge of the market and strategic advice helped me sell my property quickly and at the best price. Exceptional service!

icons8 user 100
Shivam Tyagi Uttar Pradesh

MMA exceeded my expectations! Their keen eye for detail and thorough understanding of my requirements helped me find the perfect property. Trustworthy and reliable.

icons8 user 100
Rohit Saxena Faridabad

MMA is the go-to real estate consultant! Their professionalism, promptness, and exceptional negotiation skills ensured I got the best deal. I couldn't be happier with their service.

Make My Asset expands its gaming investment portfolio through collaboration with 1win India to enhance digital entertainment offerings

Make My Asset strengthens its market presence through strategic partnership with 1win Aviator to diversify investment opportunities in India

Reset password

Enter your email address and we will send you a link to change your password.

Get started with your account

to save your favourite homes and more

Sign up with email

Get started with your account

to save your favourite homes and more

By clicking the «SIGN UP» button you agree to the Terms of Use and Privacy Policy
Powered by Estatik
Scroll to Top