Boost::Spirit::Lex; Как указать токен ||?

Итак, мой вопрос довольно прост, в моем классе лексера (расширяющем lex::lexer<T>) у меня есть следующее;

this->self.add
    ...
    ("&&", AND_AND)
    ("||", OR_OR)
    ...

Внутри моего конструктора, который отлично компилируется, но вызывает SegFault во время выполнения. Проблема совершенно очевидна | - это оператор "или" в системе регулярных выражений, как мне обойти эту проблему?


person Skeen    schedule 20.08.2013    source источник


Ответы (1)


Из http://www.boost.org/doc/libs/1_54_0/libs/spirit/doc/html/spirit/lex/quick_reference/lexer.html

\X

Если X представляет собой a, b, e, n, r, f, t, v, то интерпретация ANSI-C \x. В противном случае литерал X (используется для экранирования таких операторов, как *)

Таким образом, вы бы использовали

 ("\\|\\|", OR_OR)

Первая обратная косая черта в каждой паре обрабатывается синтаксическим анализатором строк C++ как escape-символ, в результате чего второй символ помещается в содержимое строки. Затем эта обратная косая черта в содержимом строки видна Spirit::Lex и действует, чтобы избежать оператора регулярного выражения.

person Ben Voigt    schedule 20.08.2013
comment
Ух ты, я смотрел на ту же самую страницу, но не видел этого. Должно быть, уже поздно. В любом случае, спасибо! Принятие! - person Skeen; 21.08.2013