تحليل السلاسل النار مع روح التعزيز
-
26-09-2019 - |
سؤال
أنا أعمل مع الروح 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{
تليها المحتوى متبوعًا}
المحتوى هو مثيل واحد على الأقل من شخصية (ولكن لا
}
) أو esccharescchar هو فرد واحد
\\
,{
, ، أو}
لاحظ ال escchar القاعدة الآن تُرجع شخصية واحدة وتتجاهل الهروب \\
. لست متأكدًا مما إذا كان هذا ما تحتاجه. بالإضافة إلى ذلك ، قمت بإزالة القائد المحتوى و escchar القواعد التي تسمح بالترك lexeme[]
(قاعدة بدون قائد تعمل مثل لكزسم ضمني).
لا تنتمي إلى StackOverflow