以下代码编译
clang ++ -std = c ++ 11 test.cpp -o test
但是当抛出异常时
在抛出一个实例后终止调用 '的boost ::词法:: runtime_error' what():Lookahead(' /')尚不支持。
问题是输入和/或正则表达式中的斜杠(/)(第12行和第39行)但我无法找到解决方法如何正确地逃避它。任何提示?
#include <string>
#include <cstring>
#include <boost/spirit/include/lex.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace lex = boost::spirit::lex;
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
std::string regex("FOO/BAR");
template <typename Type>
struct Lexer : boost::spirit::lex::lexer<Type> {
Lexer() : foobar_(regex) {
this->self.add(foobar_);
}
boost::spirit::lex::token_def<std::string> foobar_;
};
template <typename Iterator, typename Def>
struct Grammar
: qi::grammar <Iterator, qi::in_state_skipper<Def> > {
template <typename Lexer> Grammar(const Lexer & _lexer);
typedef qi::in_state_skipper<Def> Skipper;
qi::rule<Iterator, Skipper> rule_;
};
template <typename Iterator, typename Def>
template <typename Lexer>
Grammar<Iterator, Def>::Grammar(const Lexer & _lexer)
: Grammar::base_type(rule_) {
rule_ = _lexer.foobar_;
}
int main() {
// INPUT
char const * first("FOO/BAR");
char const * last(first + strlen(first));
// LEXER
typedef lex::lexertl::token<const char *> Token;
typedef lex::lexertl::lexer<Token> Type;
Lexer<Type> l;
// GRAMMAR
typedef Lexer<Type>::iterator_type Iterator;
typedef Lexer<Type>::lexer_def Def;
Grammar<Iterator, Def> g(l);
// PARSE
bool ok = lex::tokenize_and_phrase_parse (
first
, last
, l
, g
, qi::in_state("WS")[l.self]
);
// CHECK
if (!ok || first != last) {
std::cout << "Failed parsing input file" << std::endl;
return 1;
}
return 0;
}
答案 0 :(得分:1)
作为sehe points out,/
可能会被用作前瞻算子,可能需要the syntax of flex之后。不幸的是,Spirit不会使用更多normal lookahead syntax(不是我认为其他语法更优雅;它只会让正则表达式语法中的所有微妙变化混淆)。
如果你看re_tokeniser.hpp
:
// Not an escape sequence and not inside a string, so
// check for meta characters.
switch (ch_)
{
...
case '/':
throw runtime_error("Lookahead ('/') is not supported yet.");
break;
...
}
它认为您不在转义序列中,也不在字符串中,因此它会检查元字符。 /
被视为前瞻的元字符(即使功能未实现),必须进行转义,despite the Boost docs not mentioning that at all。
尝试使用反斜杠(例如/
)转义"\\/"
(不在输入中),如果使用原始字符串,则转义为"\/"
。或者,others have suggested using [/]
。
我认为这是Spirit Lex文档中的一个错误,因为它没有指出必须转义/
。