J'écris un DSL et j'utilise un lexer Boost Spirit pour tokeniser mon entrée. Dans ma grammaire, je veux une règle similaire à celle-ci (où tok
est le lexer) :
header_block =
tok.name >> ':' >> tok.stringval > ';' >>
tok.description >> ':' >> tok.stringval > ';'
;
Plutôt que de spécifier des mots réservés pour la langue (par exemple, "nom", "description") et de s'occuper de leur synchronisation entre le lexeur et la grammaire, je veux simplement tokeniser tout ce qui correspond à la langue [a-zA-Z_]\w*
en tant que type de jeton unique (par ex. tok.symbol
), et laissez la grammaire s'en charger. Si je n'étaient pas en utilisant un lexer, je pourrais faire quelque chose comme ça :
stringval = lexeme['"' >> *(char_ - '"') >> '"'];
header_block =
lit("name") >> ':' >> stringval > ';' >>
lit("description") >> ':' >> stringval > ';'
;
Avec un lexer dans le mélange, je peux compiler la règle suivante, mais bien sûr, elle correspond à plus de choses que je ne le souhaite - elle ne se soucie pas des valeurs de symbole particulières "name" et "description" :
header_block =
tok.symbol >> ':' >> tok.stringval > ';' >>
tok.symbol >> ':' >> tok.stringval > ';'
;
Ce que je cherche, c'est quelque chose comme ça :
header_block =
specific_symbol_matcher("name") >> ':' >> tok.stringval > ';' >>
specific_symbol_matcher("description") >> ':' >> tok.stringval > ';'
;
Est-ce que Qi fournit quelque chose que je peux utiliser à la place de mon specific_symbol_matcher
de la main, là ? Je préfère ne pas écrire mon propre matcher si je peux m'en approcher en utilisant les éléments fournis. Si je dois écrire mon propre matcher, quelqu'un peut-il me suggérer comment le faire ?