aknlayoutcompiler/src/FormulaParser.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /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