boost::spirit::qi ключевые слова и идентификаторы

Я видел несколько постов, связанных с нюансами использования ключевого слова / идентификатора в грамматиках ци, но я не совсем понимаю, как должен работать подход, продемонстрированный в примерах повышения...

Объявление ключевых слов:

qi::symbols<char> keywords;

Пример набора ключевых слов:

keywords.add
        ("foo")
        ("bar")
        ;

Объявление правила идентификатора:

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;

Вот как правило идентификатора определяется в примерах qi calc и compiler:

identifier = !keywords >> qi::raw[ qi::lexeme[ ( qi::alpha | '_' ) >> *( qi::alnum | '_' ) ] ];

Возможно, я неправильно читаю синтаксис ци, но мне кажется, что он не принимает какой-либо литерал, который совпадает или начинается с ключевого слова. Отказ от полного соответствия ключевых слов - желаемое поведение. Но я хочу принять "food" в качестве идентификатора, даже если он начинается с ключевого слова "foo". Это похоже на довольно стандартный сценарий использования, но возникают проблемы с поиском документации, которая действительно его фиксирует.

Может ли кто-нибудь предложить правило идентификатора, которое отклоняет только точные совпадения с ключевыми словами?

Спасибо!

1 ответ

Решение

На самом деле этот вопрос заслуживает нескольких голосов. Это должно быть гораздо чаще реализовано, и, вероятно, должно быть рассмотрено в учебных руководствах по духу, поскольку об этом часто забывают (очевидно, с примерами компилятора все в порядке)


Возможно, я неправильно читаю синтаксис ци, но мне кажется, что он не принимает какой-либо литерал, который совпадает или начинается с ключевого слова.

Правильно. В случае, если вы заметили в одном из моих собственных ответов (довольно хороший шанс), я склонен делать это как быстрый и грязный способ исправить грамматики, у которых в первую очередь не было надлежащих средств защиты ключевых слов.

Но да, требуются разные ключевые слова / идентификаторы, требующие дополнительной работы. Я мог бы найти ссылку на ответ, где это сделано правильно (это не сложно, это просто утомительно).

А пока взглянем на очень актуальные

Если вы создаете действительно надежную грамматику языка общего назначения, это тот момент, когда вам следует подумать об использовании Spirit Lexer. Опять же, по моему скромному мнению, Spirit нацелен на быстрое развитие и небольшие одноразовые грамматики, которые кратко встраиваются с использованием шаблона выражения eDSL Spirit. Я считаю, что во многих отношениях это антипод, когда это важно.

Другие вопросы по тегам