aknlayoutcompiler/src/FormulaParser.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
equal deleted inserted replaced
-1:000000000000 0:f58d6ec98e88
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 #include "FormulaParser.h"
       
    18 
       
    19 
       
    20 ParseResult ParseFormula(const string& aFormula)
       
    21 	{
       
    22 	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");
       
    23 	cell_nameParser.SetId(cell_name_ParserId);
       
    24 	Parser parentParser = Parser("P");
       
    25 	parentParser.SetId(parent_ParserId);
       
    26 	Parser parent_cellParser = parentParser >> Parser("_") >> cell_nameParser;
       
    27 	parent_cellParser.SetId(parent_cell_ParserId);
       
    28 	Parser table_cellParser = Parser::Real();
       
    29 	table_cellParser.SetId(table_cell_ParserId);
       
    30 	Parser comp_cellParser = Parser::Real() >> Parser("_") >> cell_nameParser;
       
    31 	comp_cellParser.SetId(comp_cell_ParserId);
       
    32 	Parser abs_cellParser = 
       
    33 		Parser("$") >> 
       
    34 		Parser::Real() >> 
       
    35 		Parser("!") >> 
       
    36 		Parser::Real() >> 
       
    37 		Parser("!") >> 
       
    38 		cell_nameParser >> 
       
    39 		Parser("!$");
       
    40 	abs_cellParser.SetId(abs_cell_ParserId);
       
    41 
       
    42 	// types of value
       
    43 	Parser cellParser = 
       
    44 		cell_nameParser | 
       
    45 		parent_cellParser | 
       
    46 		parentParser | 
       
    47 		comp_cellParser | 
       
    48 		abs_cellParser | 
       
    49 		table_cellParser;
       
    50 
       
    51 	Parser unitsParser = 
       
    52 		Parser::Real() >> 
       
    53 		(Parser("u") | Parser("U"));
       
    54 	unitsParser.SetId(units_ParserId);
       
    55 
       
    56 	Parser constantParser = 
       
    57 		Parser::Real() >> 
       
    58 		Parser("p");
       
    59 	constantParser.SetId(constant_ParserId);
       
    60 
       
    61 	Parser attributeParser = 
       
    62 		Parser("pr") >> 
       
    63 		Parser::Int();
       
    64 	attributeParser.SetId(attribute_ParserId);
       
    65 
       
    66 	Parser mysteryParser = 
       
    67 		Parser::Int() >> 
       
    68 		Parser("pr") >> 
       
    69 		Parser::Int();
       
    70 	mysteryParser.SetId(mystery_ParserId);
       
    71 
       
    72 	// functions
       
    73 	Parser expressionParser;
       
    74 	Parser func_nameParser = Parser("CEIL") | Parser("FLOOR") | Parser("ROUND");
       
    75 	Parser funcParser = func_nameParser >> Parser("(") >> expressionParser >> Parser(")");
       
    76 	funcParser.SetId(func_ParserId);
       
    77 
       
    78 	Parser valueParser = 
       
    79 		unitsParser | 
       
    80 		mysteryParser | 
       
    81 		attributeParser | 
       
    82 		constantParser | 
       
    83 		funcParser | 
       
    84 		cellParser ;
       
    85 
       
    86 	// arithmetic expressions from boost spirit library example
       
    87 	Parser groupParser = Parser("(") >> expressionParser >> Parser(")");
       
    88 	groupParser.SetId(group_ParserId);
       
    89 	Parser factorParser = valueParser | groupParser;
       
    90 
       
    91 	Parser termExtStarParser;
       
    92 	Parser termExtParser = 
       
    93 		((Parser("*") >> factorParser) | 
       
    94 		 (Parser("/") >> factorParser)) >>
       
    95 		termExtStarParser;
       
    96 	termExtStarParser = termExtParser | Parser::Nul();
       
    97 
       
    98 	Parser termParser = 
       
    99 		factorParser >> 
       
   100 		termExtStarParser;
       
   101 	termParser.SetId(term_ParserId);
       
   102 
       
   103 	Parser expressionExtStarParser;
       
   104 	Parser expressionExtParser = 
       
   105 		((Parser("+") >> termParser) | 
       
   106 		 (Parser("-") >> termParser)) >>
       
   107 		expressionExtStarParser;
       
   108 	expressionExtStarParser = expressionExtParser | Parser::Nul();
       
   109 
       
   110 	expressionParser = 
       
   111 		termParser >> 
       
   112 		expressionExtStarParser;
       
   113 	expressionParser.SetId(expression_ParserId);
       
   114 
       
   115 	// comparisons
       
   116 	Parser comp_opParser = Parser(">=") | Parser("<=") | Parser("=") | Parser(">") | Parser("<");
       
   117 
       
   118 	Parser whitespaceParser;
       
   119 	Parser compParser = 
       
   120 		expressionParser >> 
       
   121 		whitespaceParser >> 
       
   122 		comp_opParser >> 
       
   123 		whitespaceParser >> 
       
   124 		expressionParser;
       
   125 	compParser.SetId(comp_ParserId);
       
   126 
       
   127 	Parser comp_groupParser = Parser("(") >> compParser >> Parser(")");
       
   128 	comp_groupParser.SetId(comp_group_ParserId);
       
   129 	Parser compOptParser = compParser | comp_groupParser;
       
   130 
       
   131 	// conditionals
       
   132 	Parser conditionalParser = 
       
   133 		Parser("IF ") >> 
       
   134 		compOptParser >> 
       
   135 		Parser(" THEN ") >> 
       
   136 		expressionParser >> 
       
   137 		Parser(" ELSE ") >> 
       
   138 		expressionParser;
       
   139 	conditionalParser.SetId(conditional_ParserId);
       
   140 
       
   141 
       
   142 	Parser whitespaceExtParser = Parser(" ") >> whitespaceParser;
       
   143 	whitespaceParser = whitespaceExtParser | Parser::Nul();
       
   144 
       
   145 	// formula
       
   146 	Parser formulaParser = conditionalParser | expressionParser;
       
   147 
       
   148 
       
   149 	return formulaParser.Parse(aFormula);
       
   150 	}