كيفية كتابة محلل ANTLR لJSP / ASP / PHP مثل لغة؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

وأنا جديدة على مولدات محلل وأنا أتساءل كيف يمكن للقواعد ANTLR للغة جزءا لا يتجزأ من مثل JSP / ASP / PHP قد تبدو، ولكن للأسف لم يكن الموقع ANTLR توفر أي ملفات قواعد من هذا القبيل.

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

وعلى سبيل المثال ما يلي يجب برموز كشيء مثل مقصوص: AnyText، BlockBegin، كلمات، BlockEnd، AnyText

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet

وربما هناك أيضا آخر مولد محلل التي هي مناسبة بشكل أفضل لاحتياجات بلدي. لقد حاولت فقط ANTLR حتى الآن، بسبب شعبيته الكبيرة هنا في ستاكوفيرفلوو:)

وشكرا جزيلا مقدما!

هل كانت مفيدة؟

المحلول

لا أستطيع أن أتكلم عن ANTLR، كما يمكنني استخدام lexer مختلفة / محلل (في DMS برنامج إعادة هندسة أدوات ، والتي عملت على تطوير هذا بالضبط JSP و PHP lexer / موزعي. (ASP لا تختلف كما كنت قد لاحظت في سؤالك).

ولكن الفكرة الأساسية هي أن lexer يحتاج سائط المعجمية للاعتراف عند التقاط "anytext" وعند معالجة "الحقيقي" النص لغة البرمجة. لذلك أنت بحاجة إلى وضع المفردات ابتداء، ويقول HTML، الذي هو وظيفة لاستيعاب HTML النص، وعندما واجه PHP الانتقالية في، مفاتيح وسائط. أنت أيضا في حاجة إلى وضع PHP التي تلتقط كل الرموز PHP، ويتحول مرة أخرى إلى وضع HTML عندما واجهت الأحرف الانتقالية بها. وفيما يلي رسم:

%%HTML -- mode
#token HTMLText "~[]* \< \% "
   << (GotoPHPMode) >>

%%PHP -- mode
#token KEYWORD "KEYWORD"
...
#token '%>'  "\%\>"
   << (GotoHTMLMode) >>

ومولد lexer الخاص بك هو من المحتمل أن يكون نوعا من القدرة على تبديل وضع التي سيكون لديك لاستخدامها بدلا من ذلك. وسوف تجد أن من المرجح lexing الاشياء HTML أكثر تعقيدا مما يبدو (لديك ما يدعو للقلق حول

نصائح أخرى

وجئت عبر هذا المشروع http://code.google.com/p/phpparser/ الذي يحتوي أيضا على ملف قواعد ANTLR لتحليل PHP: HTTP: // code.google.com/p/phpparser/source/browse/grammar/Php.g

وآمل أن يساعد هذا.

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