--- /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