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

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

Декларация ключевых слов:

qi::symbols<char> keywords;

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

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

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

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

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

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

Возможно, я неправильно читаю синтаксис qi, но мне кажется, что он не будет принимать любой литерал, который соответствует ключевому слову или начинается с ключевого слова. Желаемым поведением является отклонение полного соответствия ключевому слову. Но я хочу принять «еду» в качестве идентификатора, даже если она начинается с ключевого слова «foo». Это кажется довольно стандартным вариантом использования, но у вас возникли проблемы с поиском документации, которая действительно фиксирует это.

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

Спасибо!


person pt3dNyc    schedule 13.12.2014    source источник
comment
На самом деле этот вопрос заслуживает нескольких голосов. Это следует чаще осознавать и, вероятно, рассматривать в учебных пособиях по Духу, поскольку его часто упускают из виду (очевидно, примеры компилятора в порядке)   -  person sehe    schedule 14.12.2014


Ответы (1)


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


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

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

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

Между тем, взгляните на очень актуальные

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

person sehe    schedule 13.12.2014
comment
Большое спасибо за ваш ответ. Это проясняет ситуацию. Я знал об отдельной директиве, но подумал, что могу что-то упустить с этим быстрым исправлением. Спасибо! - person pt3dNyc; 16.12.2014