سؤال

أنا أعمل مع الروح 2.4 وأريد تحليل هيكل مثل هذا:

النص {text_field} ؛

النقطة المهمة هي أنه في Text_field عبارة عن سلسلة هربت مع الرموز "{'و'} 'و' '. أرغب في إنشاء محلل لهذا الغرض باستخدام Qi. لقد كنت أحاول هذا:

using boost::spirit::standard::char_;
using boost::spirit::standard::string;
using qi::lexeme;
using qi::lit;

qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string(), ascii::space_type > content;
qi::rule< IteratorT, std::string(), ascii::space_type > escChar;


text %= 
  lit( "Text" ) >> '{' >>
    content >>
  "};"
  ;

content %= lexeme[ +( +(char_ - ( lit( '\\' ) | '}' ) )  >> escChar ) ];

escChar %= string( "\\\\" ) 
  | string( "\\{" ) 
  | string( "\\}" );

ولكن لا يجمع حتى. اي فكرة؟

هل كانت مفيدة؟

المحلول

يمكن كتابة القواعد الخاصة بك على النحو التالي:

qi::rule< IteratorT, std::string(), ascii::space_type > text; 
qi::rule< IteratorT, std::string() > content;   
qi::rule< IteratorT, char() > escChar;   

text = "Text{" >> content >> "};";  
content = +(~char_('}') | escChar); 
escChar = '\\' >> char_("\\{}");

بمعنى آخر

  • نص هو Text{ تليها المحتوى متبوعًا }

  • المحتوى هو مثيل واحد على الأقل من شخصية (ولكن لا }) أو escchar

  • escchar هو فرد واحد \\, {, ، أو }

لاحظ ال escchar القاعدة الآن تُرجع شخصية واحدة وتتجاهل الهروب \\. لست متأكدًا مما إذا كان هذا ما تحتاجه. بالإضافة إلى ذلك ، قمت بإزالة القائد المحتوى و escchar القواعد التي تسمح بالترك lexeme[] (قاعدة بدون قائد تعمل مثل لكزسم ضمني).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top