diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/FormulaParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/FormulaParser.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,150 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "FormulaParser.h" + + +ParseResult ParseFormula(const string& aFormula) + { + Parser cell_nameParser = Parser("B") | Parser("H") | Parser("L") | Parser("R") | Parser("T") | Parser("W") | Parser("b") | Parser("h") | Parser("l") | Parser("r") | Parser("t") | Parser("w"); + cell_nameParser.SetId(cell_name_ParserId); + Parser parentParser = Parser("P"); + parentParser.SetId(parent_ParserId); + Parser parent_cellParser = parentParser >> Parser("_") >> cell_nameParser; + parent_cellParser.SetId(parent_cell_ParserId); + Parser table_cellParser = Parser::Real(); + table_cellParser.SetId(table_cell_ParserId); + Parser comp_cellParser = Parser::Real() >> Parser("_") >> cell_nameParser; + comp_cellParser.SetId(comp_cell_ParserId); + Parser abs_cellParser = + Parser("$") >> + Parser::Real() >> + Parser("!") >> + Parser::Real() >> + Parser("!") >> + cell_nameParser >> + Parser("!$"); + abs_cellParser.SetId(abs_cell_ParserId); + + // types of value + Parser cellParser = + cell_nameParser | + parent_cellParser | + parentParser | + comp_cellParser | + abs_cellParser | + table_cellParser; + + Parser unitsParser = + Parser::Real() >> + (Parser("u") | Parser("U")); + unitsParser.SetId(units_ParserId); + + Parser constantParser = + Parser::Real() >> + Parser("p"); + constantParser.SetId(constant_ParserId); + + Parser attributeParser = + Parser("pr") >> + Parser::Int(); + attributeParser.SetId(attribute_ParserId); + + Parser mysteryParser = + Parser::Int() >> + Parser("pr") >> + Parser::Int(); + mysteryParser.SetId(mystery_ParserId); + + // functions + Parser expressionParser; + Parser func_nameParser = Parser("CEIL") | Parser("FLOOR") | Parser("ROUND"); + Parser funcParser = func_nameParser >> Parser("(") >> expressionParser >> Parser(")"); + funcParser.SetId(func_ParserId); + + Parser valueParser = + unitsParser | + mysteryParser | + attributeParser | + constantParser | + funcParser | + cellParser ; + + // arithmetic expressions from boost spirit library example + Parser groupParser = Parser("(") >> expressionParser >> Parser(")"); + groupParser.SetId(group_ParserId); + Parser factorParser = valueParser | groupParser; + + Parser termExtStarParser; + Parser termExtParser = + ((Parser("*") >> factorParser) | + (Parser("/") >> factorParser)) >> + termExtStarParser; + termExtStarParser = termExtParser | Parser::Nul(); + + Parser termParser = + factorParser >> + termExtStarParser; + termParser.SetId(term_ParserId); + + Parser expressionExtStarParser; + Parser expressionExtParser = + ((Parser("+") >> termParser) | + (Parser("-") >> termParser)) >> + expressionExtStarParser; + expressionExtStarParser = expressionExtParser | Parser::Nul(); + + expressionParser = + termParser >> + expressionExtStarParser; + expressionParser.SetId(expression_ParserId); + + // comparisons + Parser comp_opParser = Parser(">=") | Parser("<=") | Parser("=") | Parser(">") | Parser("<"); + + Parser whitespaceParser; + Parser compParser = + expressionParser >> + whitespaceParser >> + comp_opParser >> + whitespaceParser >> + expressionParser; + compParser.SetId(comp_ParserId); + + Parser comp_groupParser = Parser("(") >> compParser >> Parser(")"); + comp_groupParser.SetId(comp_group_ParserId); + Parser compOptParser = compParser | comp_groupParser; + + // conditionals + Parser conditionalParser = + Parser("IF ") >> + compOptParser >> + Parser(" THEN ") >> + expressionParser >> + Parser(" ELSE ") >> + expressionParser; + conditionalParser.SetId(conditional_ParserId); + + + Parser whitespaceExtParser = Parser(" ") >> whitespaceParser; + whitespaceParser = whitespaceExtParser | Parser::Nul(); + + // formula + Parser formulaParser = conditionalParser | expressionParser; + + + return formulaParser.Parse(aFormula); + } \ No newline at end of file