Tokenizing
-
Hallo zusammen,
wie kann ich z.B. folgenden Ausdrucke effizient in Token unterteilen?.if( (xx== "5")&& (yy !="Enable") )Tokens:
.if
(
(
xx"5"
(
usw.Eine Bastellösung mit STL Stings habe ich realisiert. Weiss jemand wie man dies richtig macht?
Spark
-
du könntest beispielsweise zuallererst mal nen replace machen und um alle (), =, &, !, | einfach Leerzeichen Strickst, wobei du die Inhalte von "" rauslassen solltest.
Damit hast du dann hoffentlich deine Tokens nutzen. Wirklich schnell ist das allerdings nicht, glaub ich.
Natürlich könntest du den Programmierer auch zu sauberer Arbeit zwingen indem du ihm einbläust, dass er gefälligst Leerzeichen zu machen hat- wird ja heutzutage als Feature verkauft sowas
-
Würde der boost::tokenizer für dich in Frage kommen? Wäre auf jeden Fall mal nen Blick wert.
Da du wohl eine Sprache parsen möchtest, würd ich dir allerdings gleich zu nem Parser-Generator raten, da gäbe es boost::spirit und boost::phoenix.
-
Ja, Parser Generatoren habe ich gefunden - ich schätze der Aufwand einen solchen richtig in einem Code - Projekt zu integrieren ist gross, zumal ich mich nicht gut mit der Materie auskenne (z.B. RegEx).
Die Source sollte auch einfach austauschbar sein. Deshalb würde ich gerne eine STL basierende Tokenizer-Klasse bauen...
-
Dann gehe einfach Zeichen für Zeichen den String durch und je nach Zeichen-Typ (z.B. Buchstaben, Zahlen, Sonderzeichen) liest du solange weiter, bis das Zeichen nicht mehr zum Typ paßt und schreibst das ganze dann in einen std::vectorstd::string.
Wenn du dann noch die Zeichen-Typen variabel machst, hast du eine schöne Parser-Klasse (bzw. Funktion).
-
Sparkle schrieb:
Ja, Parser Generatoren habe ich gefunden - ich schätze der Aufwand einen solchen richtig in einem Code - Projekt zu integrieren ist gross, zumal ich mich nicht gut mit der Materie auskenne (z.B. RegEx).
Die Source sollte auch einfach austauschbar sein. Deshalb würde ich gerne eine STL basierende Tokenizer-Klasse bauen...Naja, mehr STL-Style wäre allerdings eine Tokenize-Funktion oder ein entsprechender Pseudoiterator. Sowas gibts auch in Boost.
Aber da du scheinbar sowieso etwas parsen willst, schau dir doch mal Spirit an. Mit regulären Ausdrücken hat das nichts zu tun.
-
Natürlich hat das was mit reg ausdrücken zu tun. Für das was er machen will reicht ein Lexer dafür braucht man keinen Parser. Und ein Lexer ist intern natürlich über reg. ausdrücke aufgebaut.