سؤال

لقد كان هذا شيئا يزعجني لفترة من الوقت. كيف يقوم المرء بتحليل النص التالي في HTML أدناه باستخدام Antlr؟ لا أستطيع أن ألتف رأسي حول هذا على الإطلاق.

أيه أفكار؟

تخفيض السعر:

> الخط الأول> السطر الثاني >> اقتباس متداخل

إخراج HTML:

<blockquote>
  <p>first line
  second line</p>
  <blockquote>
    <p>nested quote</p>
  </blockquote>
</blockquote>
هل كانت مفيدة؟

المحلول

مضحك أن تذكر ذلك لأنني كنت أتعامل مع هذه المشكلة فقط الأسبوع الماضي. يرى JMD، علامة تجارية ومحة موجزة عن التحليل والتركيبات. وبعد أنا أعمل على محلل رسمي حقيقي وجربته مع Antlr.

هناك بطرقاء يمكنك التعامل مع هذا.

أولا، يمكنك فقط تحليل:

BLOCK_QUOTE : '>' (' ' | '\t')? ;

والعمل عليها في خطوة التحليل، ربما كقاعدة إعادة كتابة.

الشيء هو أن هذه مهمة فقط عندما تظهر في بداية الخط حتى هنا هو نهج آخر:

@members {
  int quoteDepth = 0;
}

BLOCK_QUOTE : '\n' (q+='>' (' ' | '\t')?)+
  { if ($q.size() > quoteDepth) /* emit one or more START_QUOTE tokens */
    else if ($q.size() < quoteDepth /* emit one or more END_QUOTE tokens */
    quoteDepth = $q.size(); }

ما سبق قد يحتاج إلى أن تكون قاعدة محلل تحلل بدلا من قاعدة معجمية أيضا. لقد نسيت.

ولكن حتى هذا غير مرضي لأنه ينقلك إلى التعامل مع مصدر التسوية كسلسلة من الخطوط، والتي ليست حقا ما تريد في أجزاء أخرى.

عادة ما يمكن أن تؤدي كل قاعدة متعمدة فقط إلى رمز واحد حتى يتعين عليك الكتابة فوق فئة أخرى تهرب مني للسماح بانبعاثات الرموز المتعددة. هناك مثال على ذلك في (ممتاز مطلوب تقريبا) مرجع مضاد للتأييد النهائي: بناء لغات خاصة بالمجال.

في النهاية تخلت عن Antlr كأداة اختيار لهذا. يجب أن يظهر محللي مشفر يدي في الأسبوع التالي أو اثنين.

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