كيفية مطابقة العلامات المفتوحة/إغلاق الاختيارية في Javacc؟

StackOverflow https://stackoverflow.com/questions/3806828

  •  25-09-2019
  •  | 
  •  

سؤال

ما ينفذه بناء جملة Javacc النحو التي يمكنها تحليل هذا النوع من الخطوط:

[b]content[/b]
content[/b]
[b]content

على الرغم من أن محلل Javacc يحتاج إلى تحليل جميع الخطوط ، إلا أنه يجب التمييز بين العلامات الصحيحة وغير الصحيحة سلوك.

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

علامات غير صحيحة تشبه الخط 2 و 3 ، ليس لديهم علامة مطابقة مفتوحة أو إغلاق. عندما تحدث هذه ، يتم كتابتها إلى الإخراج كما هو ولن يتم تفسيرها على أنها علامات.

لقد جربت رمز javacc أدناه (lookahead = 999999). المشكلة هي أن هذا بناء الجملة سوف تطابق دائمًا كل شيء على أنه غير صالح () بدلاً من بالخط العريض(). كيف يمكنني التأكد من أن محلل Javacc سوف يتطابق بالخط العريض() متى أمكن؟

String parse() :
{}
{
    body() <EOF>
    { return buffer; }
}

void body() :
{}
{
    (content())*
}

void content() :
{}
{ 
    (text()|bold()|invalidTag)
}

void bold() :
{}
{
    { buffer += "<b>";  }
    <BOLDSTART>(content())*<BOLDEND>
    { buffer += "</b>"; }
}

void invalidTag() :
{
}
{
    <BOLDSTART> | <BOLDEND>
    { // todo: just output token
    }
}

TOKEN :
{
    <TEXT : (<LETTER>|<DIGIT>|<PUNCT>|<OTHER>)+ >
    |<BOLDSTART : "[b]" >
    |<BOLDEND : "[/b]" >

    |<LETTER : ["a"-"z","A"-"Z"] >
    |<DIGIT : ["0"-"9"] >
    |<PUNCT : [".", ":", ",", ";", "\t", "!", "?", " "] >
    |<OTHER : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"]     >
}
هل كانت مفيدة؟

المحلول

قواعدك غامضة. ربما لا يكون هذا خطأك ، لأنه من المحتمل جدًا إنتاج قواعد لا لبس فيها للمشكلة التي تحاول حلها.

محلل LL (K) ربما لا يكون أفضل أداة لهذه الوظيفة.

ومع ذلك ، قد يكون الرمز المميز مفيدًا ، واستخدام مكدس للعثور على أزواج مطابقة ولا مثيل لها من العلامات قد يكون بديلاً مناسبًا.

نصائح أخرى

منذ بعض الوقت ، تعلمت ، أنه يمكن حل بعض المشكلات التافهة بسهولة على المستوى الدلالي أو المعجمي مع إثبات أنها صعبة للغاية أو مستحيلة على المستوى النحوي.

ملحوظة: لست على دراية بجافاك ، لكنني عملت مع مولدات برمجي متعددة في الماضي (المفضل لدي هو saBlecc).

ربما يمكنك فقط تحديد "المحتوى" الخاص بك على أنه شيء مثل هذا:

(text()|boldstart()|boldend()|invalidTag)

حيث سيقوم BoldStart () فقط بإخراج العلامة العمياء و Boldend () - علامة نهائية.

ومع ذلك ، إذا كنت ترغب في تصفية كل ذلك وأن تنتج علامات تنتهي بشكل صحيح فقط ، فأنا أقترح إجراء نوع من الأوتوماتون الهادئ لذلك ، وإطعامه بفتح وإنهاء العلامات ، لاحظ ما إذا كان يجب (على سبيل المثال) أن تبدأ أو تتوقف أو متابعة (ربما بما في ذلك عمق التعشيش) واعتمادًا على هذا الإخراج ، إما البدء أو التوقف أو بدون علامة. سيكون هذا سهل التنفيذ حقًا بدلاً من استخدام الأدوات النحوية أو المعجمية التي لديك في Javacc.

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