2012-04-12 14 views
2

Ich habe das folgende Stück Textboost :: spirit Permutationen

Camera { 
    position 0 0 0 
    direction 0 -1 0 
    up 0 1 0 
    FOVy 45 
} 

Meine Wahl auf Schub ging zu analysieren: Geist, da ich mit Flex oder Bison nicht zu tun hatte.

hatte ich endlich diese Grammatik

struct camera_grammar : qi::grammar<Iterator, camera(), ascii::space_type> 
{ 
    qi::rule<Iterator, camera(), ascii::space_type> start; 

    camera_grammar() : camera_grammar::base_type(start) 
    { 
     start %= 
     lit("Camera") 
     >> '{' 
     >> (lit("position") >> float_ >> float_ >> float_) 
     >> (lit("direction") >> float_ >> float_ >> float_) 
     >> (lit("up") >> float_ >> float_ >> float_) 
     >> (lit("FOVy") >> int_) 
     >> '}' 
     ; 
    } 
}; 

Das Problem ist, dass die Teile in geschweiften Klammern selbst getauscht werden könnten; Ich habe über den Permutationsoperator ^ gelesen, aber ich lese das, wenn mindestens einer der Operanden in beliebiger Reihenfolge übereinstimmt. Ich brauche meine Grammatik nur, wenn alle in einer bestimmten Reihenfolge und nur einmal vorhanden sind.

Kann mir jemand helfen?

Antwort

6

Hartmut Kaiser erklärt, wie man das macht in this article.

Sie werden die no_empties_impl Klasse definieren möchten, wie in dem Artikel beschrieben, und dann erklären, eine Funktion

phoenix::function<no_empties_impl> const no_empties = no_empties_impl(); 

Dann in Ihrer Grammatik, wollen Sie für jede position Regeln definieren, direction , up und FOVy. Dann wird Ihre Startgrammatik wie folgt aussehen (ungetestet):

start %= 
lit("Camera") 
>> '{' 
>> position^direction^up^FOVy 
>> '}' 
    [qi::_pass = no_empties(qi::_0)] 
; 
Verwandte Themen