Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Die Artikel ::  Boost::Spirit - Eine Einführung  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Thema geschlossen
Autor Nachricht
Paddy82
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.01.2005
Beiträge: 113
Beitrag Paddy82 Mitglied 08:02:25 15.08.2006   Titel:              Zitieren

Wie performant ist spirit eigentlich?
Kann man einen kompletten Parser der die Syntaxanalyse für C++ durchführen soll damit realisieren oder sollte man lieber auf Lex und Yacc bzw. ANTLR zurückgreifen?

Das Framework sieht echt sehr interessant aus.
Guter Artikel...

Gruß Patrick
Tobias Gerg
Autor

Benutzerprofil
Anmeldungsdatum: 29.10.2001
Beiträge: 348
Beitrag Tobias Gerg Autor 13:06:54 01.09.2006   Titel:              Zitieren

Hallo Paddy82,

man kann durchaus in einer akzeptablen Zeit die Syntaxanalyse von Codedateiten bewerkstelligen. Allerdings bläst sich der Parser ziemlich auf.

Ich würde für solche Sachen mittlerweile wohl eher auf Lex und Yacc zurückgreifen.

Grüsse
Tobi

_________________
_ _ _________________ _ _
Wenn man keine Ahnung hat, einfach mal die Fresse halten - Dieter Nuhr
Artchi
Autor

Benutzerprofil
Anmeldungsdatum: 16.03.2002
Beiträge: 8571
Beitrag Artchi Autor 01:18:33 23.11.2006   Titel:              Zitieren

Habe mich mal an deinen Artikel versucht. Leider erhalte ich einen Compile-Error für das Debugout-Bsp. aus Abschnitt 6. Angemeckert wir die Zeile, in der _SECTION die DebugOut-Funktion übergeben bekommt:

Zitat:
Spirit1.cpp(27) : error C2896: 'boost::spirit::action<DerivedT,ParserT> boost::spirit::parser<DerivedT>::operator [](const ActionT &) const': Funktionsvorlage 'void DebugOut(IteratorT,IteratorT)' kann nicht als Funktionsargument verwendet werden
with
[
DerivedT=boost::spirit::rule<>
]
Spirit1.cpp(27) : error C2676: Binärer Operator '[': 'boost::spirit::rule<>' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht


Compiler: MSVC 7.1
Spirit: 1.8.x aus Boost 1.33.1

Laut MSDN ist Fehler C2896 so, das ein Funktionstemplate selbst kein Funktionstemplate verwenden kann. Hem...

Hat jemand ebenfalls diesen Fehler?

Wenn ich aus DebugOut keine Templatefunktion mache, funktioniert es, so wie es der Compiler haben will.

_________________
Bring back the Windows Start Menu Petition | GoPetition


Zuletzt bearbeitet von Artchi am 01:22:48 23.11.2006, insgesamt 2-mal bearbeitet
CStoll
Moderator

Benutzerprofil
Anmeldungsdatum: 17.10.2005
Beiträge: 17913
Beitrag CStoll Moderator 10:28:49 23.11.2006   Titel:              Zitieren

Du solltest einfach angeben, welche Spezialisierung deiner Template-Funkion verwendet werden soll (beachte das '_SECTION[&DebugOut<const char*>]' im Beispiel).

_________________
Wo ich bin, herrscht Chaos. Leider kann ich nicht überall sein.

Moderator im MFC- und C++-Board und Magazin-Autor
Artchi
Autor

Benutzerprofil
Anmeldungsdatum: 16.03.2002
Beiträge: 8571
Beitrag Artchi Autor 11:21:28 23.11.2006   Titel:              Zitieren

Das hatte ich ja gemacht, habe sogar vorsichtshalber den Source aus dem Artikel Copy&Paste gemacht. Meldung kam trotzdem.

_________________
Bring back the Windows Start Menu Petition | GoPetition
Artchi
Autor

Benutzerprofil
Anmeldungsdatum: 16.03.2002
Beiträge: 8571
Beitrag Artchi Autor 12:03:20 23.11.2006   Titel:              Zitieren

So, hab es jetzt mal mit MinGW ausprobiert. Da funktioniert es anstandslos. Fragt sich jetzt, ob MSVC7.1 hier eine Standardlücke hat...

_________________
Bring back the Windows Start Menu Petition | GoPetition
otze
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.01.2004
Beiträge: 6653
Beitrag otze Mitglied 09:44:42 26.06.2007   Titel:              Zitieren

Tobias Gerg(offline) schrieb:
@Justin:
@cplusplus.:
Hallo cplusplus. Die rule<> Klasse ist deshalb eine Templateklasse, weil du manchmal eben nicht mit einfachen plain vanilla parsern in der rule klar. Manchmal braucht man was "stärkers". :)
Da gibt's noch Grammatiken, Parsebäume und vieles mehr wo die rule<> parametrisiert werden muss.

brauchte man nicht auch einen anderen scanner, wenn man mit anderen typen als char oder wchar_t arbeiten wollte?

_________________
Jesus Christus! Da blickt ja kein Mensch mehr durch.
Tobias Gerg(offline)
Unregistrierter




Beitrag Tobias Gerg(offline) Unregistrierter 11:50:08 26.06.2007   Titel:              Zitieren

Hallo Artchi,

ich check das noch mal gegen wenn ich den MSVC wieder mal zur Hand habe.

Gruß
Tobi

Hallo otze,

boah das ist ne gute Frage... Bin schon ziemlich lange wieder aus Spirit draußen... Daher bin ich mir nicht sicher... Ich probier das bei gelegenheit mal wieder...

Gruß
Tobi
CTLeser
Unregistrierter




Beitrag CTLeser Unregistrierter 12:54:53 06.02.2008   Titel:              Zitieren

der artikel ist btw in der CT 1/2008 im boost::spirit artikel als eine der (wenigen) referenzen angegeben :live:
markusrw
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.11.2007
Beiträge: 110
Beitrag markusrw Mitglied 19:38:22 11.05.2008   Titel:              Zitieren

Artchi schrieb:
So, hab es jetzt mal mit MinGW ausprobiert. Da funktioniert es anstandslos. Fragt sich jetzt, ob MSVC7.1 hier eine Standardlücke hat...

Hab zwar eine neuere Version, glaub ich, aber ich bekomm den gleichen Fehler, wäre mal echt geil, wenn hier jemand eine Lösung parat hätte.^^
Möchte net wegen sowas direkt den Compiler wechseln...

[e]
K, hab es jetzt mit functoren probiert, die gehen, vielleicht sollte ich ich mal statt normalen Funktionen Funktionszeiger verwenden.
[e2]
So, wenn ich statt &f einfach einen Funktionszeiger auf die Funktion F verwende, dann funktionierts!
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef void (*fun)(const char*,const char*);

void f(const char*,const char*);

int
main()
{
    fun _f = f; // funkt sowohl mit als auch ohne & vor f -> fun _f = &f
    // func f;

    rule<> r = *(real_p>>+(ch_p(',')));
    //rule<> r2 = r[func()];
    rule<> r2 = r[_f];
    if(parse("1,2,3,4,5,",r2).full)
        cout << "full" << endl;
    _getch();
    return 0;
}
void f(const char* beg, const char* end)
{
    string str(beg,end);
    cout << str << endl;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef void (*fun)(const char*,const char*);

void f(const char*,const char*);

int
main()
{
fun _f = f; // funkt sowohl mit als auch ohne & vor f -> fun _f = &f
// func f;

rule<> r = *(real_p>>+(ch_p(',')));
//rule<> r2 = r[func()];
rule<> r2 = r[_f];
if(parse("1,2,3,4,5,",r2).full)
cout << "full" << endl;
_getch();
return 0;
}
void f(const char* beg, const char* end)
{
string str(beg,end);
cout << str << endl;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef void (*fun)(const char*,const char*);

void f(const char*,const char*);

int
main()
{
    fun _f = f; // funkt sowohl mit als auch ohne & vor f -> fun _f = &f
    // func f;

    rule<> r = *(real_p>>+(ch_p(',')));
    //rule<> r2 = r[func()];
    rule<> r2 = r[_f];
    if(parse("1,2,3,4,5,",r2).full)
        cout << "full" << endl;
    _getch();
    return 0;
}
void f(const char* beg, const char* end)
{
    string str(beg,end);
    cout << str << endl;
}


Zuletzt bearbeitet von markusrw am 12:55:20 12.05.2008, insgesamt 3-mal bearbeitet
C/C++ Forum :: Die Artikel ::  Boost::Spirit - Eine Einführung  
Gehen Sie zu Seite Zurück  1, 2
Thema geschlossen

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.