IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

[boost] grammar et parametre


Sujet :

Boost C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut [boost] grammar et parametre
    Bonjour,

    J'ai le code suivant (une grammar) avec une variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    size_t								g_pointersSize;
     
    struct MyGrammar : public grammar<MyGrammar>
    {	// Explicit identifiers to switch properly when evaluating the AST
    	typedef enum
    	{	noID,
    		factorID,
    		termID,
    		expressionID,
    		unaryID,
    		variableID,
    		numberID,
    	} id_type;
     
    	// Meta function from scanner type to a proper rule type
    	template<typename ScannerT> struct definition
    	{	rule<ScannerT, parser_context<>, parser_tag<factorID > >		factor_p;
    		rule<ScannerT, parser_context<>, parser_tag<termID > >			term_p;
    		rule<ScannerT, parser_context<>, parser_tag<expressionID > >	expression_p;
    		rule<ScannerT, parser_context<>, parser_tag<unaryID > >			unary_p;
    		rule<ScannerT, parser_context<>, parser_tag<variableID > >		variable_p;
    		rule<ScannerT, parser_context<>, parser_tag<numberID > >		number_p;
    		rule<ScannerT> start_p;
     
    		// Arithmetic expression l_ogrammar:
    		definition(const MyGrammar& self)
    		{	factor_p		// numbers, variables or parentheticals
    				= number_p 
    				| variable_p 
    				| ( inner_node_d['(' >> expect_expression(start_p) >> expect_close(ch_p(')'))] );
     
    			unary_p			// unary operators (right-to-left)
    				= (root_node_d[ch_p('-')]) >> expect_expression(unary_p)
    				| factor_p;
     
    			term_p			// multiplicatives (left-to-right) 
    				= unary_p >> *(root_node_d[ch_p('*')|'/'] >> expect_expression(unary_p));
     
    			expression_p	// additives       (left-to-right)
    				= term_p  >> *(root_node_d[ch_p('+')|'-'] >> expect_expression(term_p));
     
    			number_p
    				= leaf_node_d[real_p];
     
    			variable_p
    				= leaf_node_d[ lexeme_d[as_lower_d[chlit<>('m')] >> max_limit_d(g_pointersSize - 1)[uint_p] ] ];
     
    			start_p
    				= expect_expression(expression_p);
     
    			#ifdef BOOST_SPIRIT_DEBUG
    			BOOST_SPIRIT_DEBUG_RULE(factor_p);
    			BOOST_SPIRIT_DEBUG_RULE(term_p);
    			BOOST_SPIRIT_DEBUG_RULE(unary_p);
    			BOOST_SPIRIT_DEBUG_RULE(number_p);
    			BOOST_SPIRIT_DEBUG_RULE(variable_p);
    			BOOST_SPIRIT_DEBUG_RULE(expression_p);
    			BOOST_SPIRIT_DEBUG_RULE(start_p);
    			#endif
    		}
     
    		// Specify the starting rule for the parse
    		const rule<ScannerT> & start() const { return start_p; }
    	};
    };
    Je dois éliminer cette variable. Je pense donc pouvoir transmettre cette variable en tant que paramètre dans le constructeur de la grammar. Est-ce bien réalisable?

    Cela donnerait le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    struct MyGrammar : public grammar<MyGrammar>
    {	// Explicit identifiers to switch properly when evaluating the AST
    	typedef enum
    	{	//..
    		variableID,
    		//..
    	} id_type;
     
            static size_t m_pointersSize;
     
            MyGrammar(size_t parametre)
            {
             m_pointersSize=parametre;
            }
     
    	// Meta function from scanner type to a proper rule type
    	template<typename ScannerT> struct definition
    	{	
                    //..
                    rule<ScannerT, parser_context<>, parser_tag<variableID > >		variable_p;
    		//..
     
    		// Arithmetic expression l_ogrammar:
    		definition(const MyGrammar& self)
    		{	
                            //...
     
    			variable_p
    				= leaf_node_d[ lexeme_d[as_lower_d[chlit<>('m')] >> max_limit_d(m_pointersSize - 1)[uint_p] ] ];
     
                             //...
    		}
     
    		// Specify the starting rule for the parse
    		const rule<ScannerT> & start() const { return start_p; }
    	};
    };
    je précise que si je ne mets pas mon attribut en static, j'ai le droit à un message d'erreur explicite.
    Mais cela m'engendre tout de même un message d'erreur :
    monfichierclasse.obj : error LNK2019: symbole externe non rÚsolu "
    public: static unsigned int MyGrammar::m_pointersSize" (?m_pointersSize@MyGrammar@@2IA) rÚfÚrencÚ dans la fonction "public:
    __thiscall MyGrammar
    ::definition<class boost::spirit::scanner<char const *,struct boost::spirit::scanner_policies<class boost::spirit::skip_parser_iteration_policy<struct boost::spirit::space_parser,struct boost::spirit::iteration_policy>,struct boost::spirit::ast_match_policy<char const *,class boost::spirit::node_val_data_factory<struct boost::spirit::nil_t> >,struct boost::spirit::action_policy> > >
    ::definition<class boost::spirit::scanner<char const *,struct boost::spirit::scanner_policies<class boost::spirit::skip_parser_iteration_policy<struct boost::spirit::space_parser,struct boost::spirit::iteration_policy>,struct boost::spirit::ast_match_policy<char const *,class boost::spirit::node_val_data_factory<struct boost::spirit::nil_t> >,struct boost::spirit::action_policy> > >
    (struct MyGrammar const &)"
    (??0?$definition@V?$scanner@PBDU?$scanner_policies@V?$skip_parser_iteration_policy@Uspace_parser@s
    pirit@boost@@Uiteration_policy@23@@spirit@boost@@U?$ast_match_policy@PBDV?$node_
    val_data_factory@Unil_t@spirit@boost@@@spirit@boost@@@23@Uaction_policy@23@@spir
    it@boost@@@spirit@boost@@@MyGrammar@@QAE@ABU1@@Z)
    Je sens que c'est encore lié à mon élément static...mais le jargon boost m'est presque inconnu alors, je vous demande de l'aide!
    Comment comprendre ce message et comment régler mon problème de paramètre?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    FAQ ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    cela semble me donner en effet une réponse mais je ne suis pas sûr de bien la traduire ou bien cela revient à ma variable globale. Est-ce bien ce qui suit qui m'est suggéré ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int MyGrammar ::j_ = 0;
     
    struct MyGrammar : public grammar<MyGrammar>
    {
            //...
             MyGrammar(size_t param)
             {
              MyGrammar::j_=param;
             }
            //...
    };
    Je précise que j'ai besoin de changer la valeur de mon parametre en cours de route ou au moins à la construction...d'où le sujet de ce topic

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Il faut juste de faire comme le dit là FAQ (aka déclarer ta variable stattique dans un fichier cpp). Ca ne revient pas à une variable globale, cette variable est membre de ta classe, elle n'est juste pas liée à un objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class A
    {
    static int n;
    public:
    A(){++n;}
    ~A(){--n;}
    };
     
    int A::n=0;
     
    int main()
    {A a;
    A aa;
    std::cout<<A::n<<std::endl;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire des parametres L et C d'un hacheur Boost
    Par atam1987 dans le forum Signal
    Réponses: 0
    Dernier message: 23/11/2013, 07h19
  2. boost::thread_group et parametres
    Par lyxthe dans le forum Boost
    Réponses: 6
    Dernier message: 09/09/2010, 12h54
  3. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45
  4. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59
  5. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo