2009-06-18 2 views
6

Hej, eine andere Frage:boost: Geist Wiederverwendung Regeln

ich eine Reihe von sehr ähnlichen Parser geschrieben haben, die eine Reihe von gemeinsamen Regeln verwenden. Kann ich diese Regeln <> Objekte an einem Ort speichern, an dem sie von mehreren Parsern bearbeitet werden können? Es sieht irgendwie wie folgt aus:

rule<> nmeaStart = ch_p('$'); 
rule<> nmeaAddress = alnum_p() >> alnum_p() >> !alnum_p() >> !alnum_p(); 
rule<> nmeaDelim = ch_p(','); 
rule<> nmeaHead = nmeaStart >> nmeaAddress >> nmeaDelim; 
... 
/* other rules. Different for each parser*/ 
... 
rule<> nmeaChkSumStart = ch_p('*'); 
rule<> nmeaChkSum = int_parser<unsigned int,16,2,2>(); 
rule<> nmeaTail = nmeaChkSumStart >> nmeaChkSum >> eol_p; 

Ich mag würde alle Regeln nmea ... in einen gemeinsamen Ort namens setzen, vorzugsweise in eine geschützte statische Variable einer Klasse. Ich nehme an, das Ding Grammatik in der Geist-Dokumentation ist der Schlüssel, aber ehrlich gesagt verstehe ich noch nicht viel darüber.

Vielen Dank! Prost!

Antwort

2

Sie sind nur normale Variablen, Sie müssen nichts Besonderes tun. Also in Ihrem Header schreiben:

class nmea { 
protected: 
    static rule<> start, address; 
}; 

Und in Ihrer Implementierungsdatei:

rule<> nmea::start = ch_p('$'); 
rule<> nmea::address = ch_p('$'); 
// etc. 

Obwohl, ich glaube, es wird empfohlen, dass Sie Mitglied Variablen verwenden.