تخزين أعداد خطوط التعبيرات مع Boost.Spirit 2
-
22-09-2019 - |
سؤال
أخطط للقيام بأداة تحويل نصية (للحصول على معلومات تشخيصية ممتدة) باستخدام Boost.Spirit 2.
في حين أن هناك دعمًا لمعلومات الخط وما إلى ذلك لأخطاء تحليل ، كيف يمكنني تخزين أرقام الخطوط للتعبيرات التي تم تحليلها بنجاح مع QI؟
المحلول
حسب القائمة البريدية ، الروح التكرار الموضعي يمكن أيضًا استخدامها مع الروح 2.
هناك أيضًا مقال عن iter_pos-parser على ال روح-مقالات.
سأقوم بالتحديث عندما كان لدي وقت للاختبار.
نصائح أخرى
أدرك أنني لاحظت السؤال متأخرًا ، لكن اسمحوا لي أن أضيف هذا على أي حال. كتبت عينة من محلل ملف INI في إجابة أخرى:
هذا يستخدم إجراء دلالي "بسيط" مع line_pos_iterator
.
ها هي ثمرة المخاض: https://gist.github.com/1425972
- متى
POSITIONINFO == 0
- المدخلات تتدفق
- الإخراج سلاسل خام (حسنا ،
map<string, map<string, string> >
للأقسام)
متى
POSITIONINFO == 1
- المدخلات مخزنة
الإخراج هو
textnode_t
:struct textnode_t { int sline, eline, scol, ecol; string_t text; };
هذا يعني أن الناتج
map<textnode_t, map<textnode_t, textnode_t> >
قادر على الإبلاغ بالضبط عن ما (الخط ، العقيد) نقاط البدء والنهاية علامة العقد النصية الفردية.
هنا هو انخفاض العرض التوضيحي. للحصول على الوصف الكامل وحالات الاختبار الواسعة انظر Anser الأصلي أو الرمز في جيثب
المدخلات التجريبية
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
الإخراج التجريبي (positionInfo == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
الإخراج التجريبي (positionInfo == 1)
Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]
هنا هي مقالة مفيدة أخرى تشرح كيفية استخدام استثناء أن phrase_parse
رميات الوظيفة.
تصف المقالة كيفية الحصول على رسائل خطأ مثل هذا:
Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
^- here