boost.spirit und rules mit context



  • Hallo Leute,

    ich habe eine recht spezielle Frage:

    Ist es möglich (ja vermutlich, aber wie) eine rule in einer Grammatik zu definieren, in der ich wie in einem parser weitere rules übergeben kann?

    Okay, das war jetzt vllt wenig zu verstehen. Hier ein Beispiel:

    //sowas hier kann man mit vorgefertigeten parsern machen
    lexeme[*( (char_ - char_("!")) )]

    //kann ich mir auch eine rule definieren die sowas kann. wie etwa:
    myRule[*( (char_ - char_("!")) )]
    //wenn ja, wie komme ich an den zusammen gesetzten Parser-ausdruck von den eckigen Klammern?

    /Sinn des ganzen soll sein eine XML struktur lesen zu können.
    Einerseits soll der Name des jeweiligen XML-ELements als inherited attribute übergeben werden,
    und in den eckigen klammern wie es in dem element weiter gehen soll.
    Also vom prinzip sowas hier:
    /

    //aufruf
    mein_dokument
    = xml_tag_(val("gml:MuliPoint"))[
    *xml_tag_(val("gml:PointMember"))[/*u.s.w.*/]
    ]
    ;

    //def
    xml_tag_
    = lit('<') > lit(_r1) > eps[&CreateElement] > *omit[xml_attribute_[&CreateAttr]] > lit('>')
    > //hier jetzt das was in den eckigen klammern steht
    > lit("</")> lit(_r1) > lit('>')

    //dec
    qi::rule<Iterator, void(std::string), Skipper> xml_tag_;

    Macht das überhaupt Sinn sich hier mit dem rule-Konstrukt zu versuchen (die Syntax sieht ja den der semantic-actions für rules sehr ähnlich), oder läuft es auf eine schreiben eines eigenen parser hinaus?

    Grüße,
    Jan.

    PS: Hätte den pseudocode gerne in cpp -Klammern gesetzt, doch das wollter der forum-parser nicht umsetzen 😕 Hoffe es ist dennoch lesbar.


Anmelden zum Antworten