سؤال

أحاول إنشاء قواعد نحوية بسيطة تشبه باش على Antlrv3 ولكن لم أتمكن من تحليل (والتحقق) من الإدخال داخل أوامر Subshell.

المزيد من التوضيح:

أريد تحليل الإدخال التالي:

$(command parameters*)

`command parameters`

"some text $(command parameters*)"

وتمكن من التحقق من محتوياتها كما أود مع إدخال بسيط مثل: معلمات الأوامر.

بمعنى آخر:

تحليله سيولد شجرة مثل

(SUBSHELL (CMD command (PARAM parameters*)))
(الرموز في الحالة العليا)


أنا قادر على تجاهل "$ و" S ، لكن هذا لن يغطي الحالات التي يتم فيها استخدام Subshells داخل السلاسل المزدوجة ذات الصلة ، مثل:

$ echo "String test $(ls -l) end"

لذلك ... أي نصائح حول كيف يمكنني تحقيق هذا؟

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

المحلول

لست على دراية بتفاصيل Antlr V3 ، لكن يمكنني أن أخبرك أنه لا يمكنك التعامل مع استبدال الأوامر على طراز باش داخل الأوتار المزدوجة ذات الصلة في Lexer على الطراز التقليدي ، حيث لا يمكن التعبير عن التعشيش باستخدام عادية قواعد. تقيد معظم أجهزة التحويل البرمجي التقليدية Lexers على استخدام قواعد النحو العادية بحيث يمكن بناء DFAs الفعالة لهم. (كان Lexers ، الذي يتعين على كل حرف واحد من المصدر مسح كل حرف واحد من المصدر ، من الناحية التاريخية أحد أبطأ أجزاء المترجم.)

يجب إما تحليل "كرمز رمزي و (بشكل مثالي) استخدام وضع Lexer أو Lexer مختلفًا للداخلية الداخلية للسلاسل ، بحيث لا يتم تحليل معظم metacharacters ، على سبيل المثال ،" ، كرسائل رموز ولكن كنص ؛ أو بدلاً من ذلك ، تفعل ذلك بعيدًا عن قسم Lexer-Parser واستخدم نهجًا بدون ماسحة ، بحيث يمكن لقاعدة "Lexer" للسلاسل المزدوجة التي يتم عرضها استدعاء القاعدة "المحلل" للحصول على بدائل القيادة.

أود أن أتوقع النهج الماسح الضوئي. أود أن تحقق مدى جودة يدعم Antlr V3 كتابة القواعد التي تعمل مباشرة عبر دفق الأحرف ، بدلاً من استخدام دفق رمزي.

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