2015-06-09 4 views
4

Я хотел бы совместить объявление функции C++ с значениями аргументов по умолчанию, но игнорируя эти значения. Например:boost spirit: как совместить любой токен lexer в ци?

int myFunction(int a, int b = 5 + 4); 

Здесь (часть) лексер:

struct Lexer : boost::spirit::lex::lexer<lexer_type> 
{ 
    Lexer() 
    { 
     identifier = "[A-Za-z_][A-Za-z0-9_]*"; 
     numLiteral = "([0-9]+)|(0x[0-9a-fA-F]+)"; 

     this->self.add 
      ("int") 
      ('+') 
      ('=') 
      ('(') 
      (')') 
      (';') 
      (',') 
      (identifier) 
      (numLiteral); 
    } 
}; 

Я хотел бы написать несколько правил синтаксического анализа, как:

function = qi::lit("int") >> lexer.identifier >> '(' >> arglist >> ')' >> ';'; 
arglist = (lexer.numLiteral >> lexer.identifier >> -(lit('=') >> rvalue)) % ','; 
rvalue = +(qi::token() - ',' - ')'); 

Я увиденное here, что «примитивы парсера qi :: token и qi :: tokenid теперь могут использоваться без каких-либо аргументов, в этом случае они будут соответствовать любому токену». Это то, что я хочу (и то, что я написал), но, к сожалению, он не компилируется. qi :: token() действительно нуждается в одном аргументе. Я что-то пропустил?

+0

Вы не показываете SSCCE, поэтому я не буду тратить время. Вы пробовали без круглых скобок (это соглашение EDSL, _cf._ 'qi :: string' vs.' qi :: string ("value")) – sehe

+0

Спасибо @sehe для подсказки: нет круглых скобок. Теперь он компилируется. Кстати, что такое EDSL? – ZeeByeZon

+0

Edsl: [Язык встроенных доменных имен] (http://c2.com/cgi/wiki?EmbeddedDomainSpecificLanguage) (примеры шаблонов выражений духа - это ленивые субъекты Феникса [в семантических действиях]) – sehe

ответ

2

Ok, так как это было достаточно очевидно, чтобы ответить на него:

Что я хочу (и то, что я написал), но, к сожалению, он не компилируется. qi :: token() действительно нуждается в одном аргументе. Я что-то пропустил?

Возможно, вы не пропустили достаточно: вы оставили ()? Потому что в EDSL это условность уронить скобки для параметра меньше версии (см qi::string против qi::string("value"))