Je suis en train d'écrire un analyseur d'identifiant, qui analyse une chaîne alphanum qui n'est pas un mot-clé. les mots-clés sont dans une table:analyser les identifiants à l'exception des mots-clés
struct keywords_t : x3::symbols<x3::unused_type> {
keywords_t() {
add("for", x3::unused)
("in", x3::unused)
("while", x3::unused);
}
} const keywords;
et l'analyseur pour un identifiant doit être le suivant:
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_')
];
maintenant j'essayer de combiner ces soi un analyseur d'identifiant échoue sur l'analyse d'un mot-clé. Je l'ai essayé comme ceci:
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_')
]-keywords;
et ceci:
auto const identifier_def =
x3::lexeme[
(x3::alpha | '_') >> *(x3::alnum | '_') - keywords
];
il fonctionne sur la plupart des entrées, mais si une chaîne commence par un mot-clé comme comme int, whilefoo, forbar
l'analyseur ne parvient pas à analyser ces chaînes. comment puis-je obtenir ce parser correct?
Vous voudrez peut-être regarder le libtooling de LLVM: http://clang.llvm.org/docs/LibTooling.html –
Je me attendais aussi une telle sémantique de 'operator -', mais c'est plutôt différent. Il y a une discussion connexe [ici] (http://boost.2283326.n4.nabble.com/Parser-operator-Difference-td4675788.html). – Orient