From: <geo...@us...> - 2014-06-22 08:24:01
|
Revision: 7183 http://sourceforge.net/p/freeorion/code/7183 Author: geoffthemedio Date: 2014-06-22 08:23:56 +0000 (Sun, 22 Jun 2014) Log Message: ----------- -Parsing for int and double free variables as string free variables. -Parsing for galaxy seed string free variable. -Parsing for various galaxy setup parameters as integer free variables. -Parsing for int free variables as double free variables. -grooming of parsing code Modified Paths: -------------- trunk/FreeOrion/parse/DoubleValueRefParser.cpp trunk/FreeOrion/parse/IntValueRefParser.cpp trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp trunk/FreeOrion/parse/StringValueRefParser.cpp trunk/FreeOrion/parse/ValueRefParserImpl.h trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/parse/DoubleValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/DoubleValueRefParser.cpp 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/parse/DoubleValueRefParser.cpp 2014-06-22 08:23:56 UTC (rev 7183) @@ -14,81 +14,84 @@ const parse::lexer& tok = parse::lexer::instance(); - variable_name - = tok.Industry_ - | tok.TargetIndustry_ - | tok.Research_ - | tok.TargetResearch_ - | tok.Trade_ - | tok.TargetTrade_ - | tok.Construction_ - | tok.TargetConstruction_ - | tok.Population_ - | tok.TargetPopulation_ - | tok.TargetHappiness_ - | tok.Happiness_ - | tok.MaxFuel_ - | tok.Fuel_ - | tok.MaxShield_ - | tok.Shield_ - | tok.MaxDefense_ - | tok.Defense_ - | tok.MaxTroops_ - | tok.Troops_ - | tok.RebelTroops_ - | tok.MaxStructure_ - | tok.Structure_ - | tok.Supply_ - | tok.Stealth_ - | tok.Detection_ - | tok.BattleSpeed_ - | tok.StarlaneSpeed_ - | tok.TradeStockpile_ - //| tok.DistanceToSource_ // Note: DistanceToSource will be a Source-variant property, but without an explicit Source reference, so will be treated as Source-invariant by ValueRef and parsing code. This is bad. - | tok.X_ - | tok.Y_ - | tok.SizeAsDouble_ - | tok.NextTurnPopGrowth_ - | tok.Size_ - | tok.DistanceFromOriginalType_ + bound_variable_name + = tok.Industry_ + | tok.TargetIndustry_ + | tok.Research_ + | tok.TargetResearch_ + | tok.Trade_ + | tok.TargetTrade_ + | tok.Construction_ + | tok.TargetConstruction_ + | tok.Population_ + | tok.TargetPopulation_ + | tok.TargetHappiness_ + | tok.Happiness_ + | tok.MaxFuel_ + | tok.Fuel_ + | tok.MaxShield_ + | tok.Shield_ + | tok.MaxDefense_ + | tok.Defense_ + | tok.MaxTroops_ + | tok.Troops_ + | tok.RebelTroops_ + | tok.MaxStructure_ + | tok.Structure_ + | tok.Supply_ + | tok.Stealth_ + | tok.Detection_ + | tok.BattleSpeed_ + | tok.StarlaneSpeed_ + | tok.TradeStockpile_ + | tok.X_ + | tok.Y_ + | tok.SizeAsDouble_ + | tok.NextTurnPopGrowth_ + | tok.Size_ + | tok.DistanceFromOriginalType_ + //| tok.DistanceToSource_ // Note: DistanceToSource will be a Source-variant property, but without an explicit Source reference, so will be treated as Source-invariant by ValueRef and parsing code. This is bad. ; + free_variable_name + = tok.UniverseCentreX_ + | tok.UniverseCentreY_ + ; + constant - = tok.int_ [ _val = new_<ValueRef::Constant<double> >(static_cast_<double>(_1)) ] - | tok.double_ [ _val = new_<ValueRef::Constant<double> >(_1) ] + = tok.int_ [ _val = new_<ValueRef::Constant<double> >(static_cast_<double>(_1)) ] + | tok.double_ [ _val = new_<ValueRef::Constant<double> >(_1) ] ; free_variable - = - tok.Value_ [ _val = new_<ValueRef::Variable<double> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE, _a) ] - | - ( - tok.UniverseCentreX_ - | tok.UniverseCentreY_ - // add more object-independent ValueRef int functions here - ) [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::Variable<double> >(ValueRef::NON_OBJECT_REFERENCE, _a) ] + = ( + tok.Value_ + [ _val = new_<ValueRef::Variable<double> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE) ] + ) + | ( + free_variable_name + [ _val = new_<ValueRef::Variable<double> >(ValueRef::NON_OBJECT_REFERENCE, _1) ] + ) + | ( + int_free_variable() + [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] + ) ; - variable + bound_variable = ( variable_scope() [ _b = _1 ] > '.' // determines reference type from explicit use of Source, Target, LocalCandiate, or RootCandidate in expression > -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') > ( - variable_name [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::Variable<double> >(_b, _a) ] - | int_var_variable_name() [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::StaticCast<int, double> >(new_<ValueRef::Variable<int> >(_b, _a)) ] + bound_variable_name [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::Variable<double> >(_b, _a) ] + | int_bound_variable_name() [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::StaticCast<int, double> >(new_<ValueRef::Variable<int> >(_b, _a)) ] ) ) - | ( - tok.CurrentTurn_ - [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::StaticCast<int, double> >(new_<ValueRef::Variable<int> >(ValueRef::NON_OBJECT_REFERENCE, _a)) ] - ) ; - initialize_numeric_statistic_parser<double>(statistic, variable_name); + initialize_numeric_statistic_parser<double>(statistic, bound_variable_name); initialize_expression_parsers<double>(function_expr, exponential_expr, multiplicative_expr, @@ -96,6 +99,13 @@ expr, primary_expr); + int_bound_variable + = variable_scope() [ _b = _1 ] > '.' // determines reference type from explicit use of Source, Target, LocalCandiate, or RootCandidate in expression + > -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') + > int_bound_variable_name() [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::StaticCast<int, double> >(new_<ValueRef::Variable<int> >(_b, _a)) ] + ; + int_statistic = int_var_statistic() [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] ; @@ -108,19 +118,21 @@ = '(' > expr > ')' | constant | free_variable - | variable + | bound_variable +// | int_bound_variable | statistic | int_statistic | int_complex_variable ; - variable_name.name("real number variable name (e.g., Growth)"); + bound_variable_name.name("real number bound variable name (e.g., Population)"); + free_variable_name.name("real number free variable name (e.g., UniverseCentreX)"); constant.name("real number constant"); - free_variable.name("free integer variable"); - variable.name("real number variable"); + free_variable.name("free real number variable"); + bound_variable.name("real number bound variable"); + int_bound_variable.name("integer bound variable"); statistic.name("real number statistic"); int_statistic.name("integer statistic"); - //complex_variable.name("real number complex variable"); int_complex_variable.name("integer complex variable"); function_expr.name("real number function expression"); exponential_expr.name("real number exponential expression"); @@ -130,13 +142,14 @@ primary_expr.name("real number expression"); #if DEBUG_VALUEREF_PARSERS - debug(variable_name); + debug(bound_variable_name); + debug(free_variable_name); debug(constant); debug(free_variable); - debug(variable); + debug(bound_variable); + debu(int_bound_variable); debug(statistic); debug(int_statistic); - //debug(complex_variable); debug(int_complex_variable); debug(negate_expr); debug(multiplicative_expr); @@ -149,16 +162,16 @@ typedef parse::value_ref_parser_rule<double>::type rule; typedef variable_rule<double>::type variable_rule; typedef statistic_rule<double>::type statistic_rule; - //typedef complex_variable_rule<double>::type complex_rule; typedef expression_rule<double>::type expression_rule; - name_token_rule variable_name; + name_token_rule bound_variable_name; + name_token_rule free_variable_name; rule constant; variable_rule free_variable; - variable_rule variable; + variable_rule bound_variable; + variable_rule int_bound_variable; statistic_rule statistic; rule int_statistic; - //complex_rule complex_variable; rule int_complex_variable; expression_rule function_expr; expression_rule exponential_expr; @@ -174,9 +187,15 @@ } } -const name_token_rule& double_var_variable_name() -{ return get_double_parser_rules().variable_name; } +const name_token_rule& double_bound_variable_name() +{ return get_double_parser_rules().bound_variable_name; } +const name_token_rule& double_free_variable_name() +{ return get_double_parser_rules().free_variable_name; } + +const variable_rule<double>::type& double_free_variable() +{ return get_double_parser_rules().free_variable; } + const statistic_rule<double>::type& double_var_statistic() { return get_double_parser_rules().statistic; } Modified: trunk/FreeOrion/parse/IntValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/IntValueRefParser.cpp 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/parse/IntValueRefParser.cpp 2014-06-22 08:23:56 UTC (rev 7183) @@ -16,7 +16,7 @@ // TODO: Should we apply elements of this list only to certain // objects? For example, if one writes "Source.Planet.", // "NumShips" should not follow. - variable_name + bound_variable_name = tok.Owner_ | tok.ID_ | tok.CreationTurn_ @@ -38,17 +38,31 @@ constant = tok.double_ [ _val = new_<ValueRef::Constant<int> >(static_cast_<int>(_1)) ] - | tok.int_ [ _val = new_<ValueRef::Constant<int> >(_1) ] + | tok.int_ [ _val = new_<ValueRef::Constant<int> >(_1) ] ; - // add more object-independent ValueRef int functions here + free_variable_name + = tok.CurrentTurn_ + | tok.GalaxyAge_ + | tok.GalaxyMaxAIAggression_ + | tok.GalaxyMonsterFrequency_ + | tok.GalaxyNativeFrequency_ + | tok.GalaxyPlanetDensity_ + | tok.GalaxyShape_ + | tok.GalaxySize_ + | tok.GalaxySpecialFrequency_ + | tok.GalaxyStarlaneFrequency_ + ; + free_variable - = tok.CurrentTurn_ [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::Variable<int> >(ValueRef::NON_OBJECT_REFERENCE, _a) ] - | tok.Value_ [ _val = new_<ValueRef::Variable<int> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE, _a) ] + = tok.Value_ + [ _val = new_<ValueRef::Variable<int> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE) ] + | free_variable_name + [ _val = new_<ValueRef::Variable<int> >(ValueRef::NON_OBJECT_REFERENCE, _1) ] ; - initialize_bound_variable_parser<int>(bound_variable, variable_name); - initialize_numeric_statistic_parser<int>(statistic, variable_name); + initialize_bound_variable_parser<int>(bound_variable, bound_variable_name); + initialize_numeric_statistic_parser<int>(statistic, bound_variable_name); initialize_expression_parsers<int>(function_expr, exponential_expr, multiplicative_expr, @@ -65,7 +79,8 @@ | int_var_complex() ; - variable_name.name("integer variable name (e.g., FleetID)"); + free_variable_name.name("integer free variable name (e.g. CurrentTurn)"); + bound_variable_name.name("integer bound variable name (e.g., FleetID)"); constant.name("integer constant"); free_variable.name("free integer variable"); bound_variable.name("bound integer variable"); @@ -78,7 +93,8 @@ primary_expr.name("integer expression"); #if DEBUG_VALUEREF_PARSERS - debug(variable_name); + debug(free_variable_name); + debug(bound_variable_name); debug(constant); debug(free_variable); debug(bound_variable); @@ -96,7 +112,8 @@ typedef statistic_rule<int>::type statistic_rule; typedef expression_rule<int>::type expression_rule; - name_token_rule variable_name; + name_token_rule free_variable_name; + name_token_rule bound_variable_name; rule constant; variable_rule free_variable; variable_rule bound_variable; @@ -115,9 +132,12 @@ } } -const name_token_rule& int_var_variable_name() -{ return get_int_parser_rules().variable_name; } +const name_token_rule& int_bound_variable_name() +{ return get_int_parser_rules().bound_variable_name; } +const variable_rule<int>::type& int_free_variable() +{ return get_int_parser_rules().free_variable; } + const statistic_rule<int>::type& int_var_statistic() { return get_int_parser_rules().statistic; } Modified: trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp 2014-06-22 08:23:56 UTC (rev 7183) @@ -56,10 +56,10 @@ typedef statistic_rule<PlanetType>::type statistic_rule; name_token_rule variable_name; - rule constant; - variable_rule bound_variable; - statistic_rule statistic; - rule primary_expr; + rule constant; + variable_rule bound_variable; + statistic_rule statistic; + rule primary_expr; }; } Modified: trunk/FreeOrion/parse/StringValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/StringValueRefParser.cpp 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/parse/StringValueRefParser.cpp 2014-06-22 08:23:56 UTC (rev 7183) @@ -43,8 +43,14 @@ ; free_variable - = tok.Value_ [ _val = new_<ValueRef::Variable<std::string> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE, _1) ] - | tok.GalaxySeed_ [ _val = new_<ValueRef::Variable<std::string> >(ValueRef::NON_OBJECT_REFERENCE, _1) ] + = tok.Value_ + [ _val = new_<ValueRef::Variable<std::string> >(ValueRef::EFFECT_TARGET_VALUE_REFERENCE) ] + | tok.GalaxySeed_ + [ _val = new_<ValueRef::Variable<std::string> >(ValueRef::NON_OBJECT_REFERENCE, _1) ] + | int_free_variable() + [ _val = new_<ValueRef::StringCast<int> >(_1) ] + | double_free_variable() + [ _val = new_<ValueRef::StringCast<double> >(_1) ] ; bound_variable @@ -53,11 +59,14 @@ > -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') >> ( variable_name - [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::Variable<std::string> >(_b, _a) ] - | int_var_variable_name() - [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::StringCast<int> >(new_<ValueRef::Variable<int> >(_b, _a)) ] - | double_var_variable_name() - [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::StringCast<double> >(new_<ValueRef::Variable<double> >(_b, _a)) ] + [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::Variable<std::string> >(_b, _a) ] + | int_bound_variable_name() + [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::StringCast<int> >(new_<ValueRef::Variable<int> >(_b, _a)) ] + | double_bound_variable_name() + [ push_back(_a, construct<std::string>(_1)), + _val = new_<ValueRef::StringCast<double> >(new_<ValueRef::Variable<double> >(_b, _a)) ] ) ) ; Modified: trunk/FreeOrion/parse/ValueRefParserImpl.h =================================================================== --- trunk/FreeOrion/parse/ValueRefParserImpl.h 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/parse/ValueRefParserImpl.h 2014-06-22 08:23:56 UTC (rev 7183) @@ -208,10 +208,14 @@ const reference_token_rule& variable_scope(); const name_token_rule& container_type(); -const name_token_rule& int_var_variable_name(); +const name_token_rule& int_bound_variable_name(); +const name_token_rule& int_free_variable_name(); +const variable_rule<int>::type& int_free_variable(); const statistic_rule<int>::type& int_var_statistic(); const complex_variable_rule<int>::type& int_var_complex(); -const name_token_rule& double_var_variable_name(); +const name_token_rule& double_bound_variable_name(); +const name_token_rule& double_free_variable_name(); +const variable_rule<double>::type& double_free_variable(); const statistic_rule<double>::type& double_var_statistic(); Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2014-06-22 02:18:12 UTC (rev 7182) +++ trunk/FreeOrion/universe/ValueRef.h 2014-06-22 08:23:56 UTC (rev 7183) @@ -151,7 +151,7 @@ struct FO_COMMON_API ValueRef::Variable : public ValueRef::ValueRefBase<T> { Variable(ReferenceType ref_type, const std::vector<std::string>& property_name); - Variable(ReferenceType ref_type, const std::string& property_name); + Variable(ReferenceType ref_type, const std::string& property_name = ""); virtual bool operator==(const ValueRef::ValueRefBase<T>& rhs) const; ReferenceType GetReferenceType() const; |