سؤال

أخطط للقيام بأداة تحويل نصية (للحصول على معلومات تشخيصية ممتدة) باستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top