سؤال

أرغب في تحليل القيم الأساسية المنسقة وبعض السلاسل المخصصة من ملف TextReader - مثل في الأساس scanf يسمح.

  • قد لا تحتوي مدخلاتي على فواصل أسطر، لذا فإن ReadLine+Regex ليس خيارًا.يمكنني استخدام طريقة أخرى لتقطيع إدخال النص؛لكن المشكلة هي أنني لا أعرف المحدد في وقت الترجمة (لذا فهذا أمر صعب)، وأن هذا المحدد قد يعتمد على الترجمة.على سبيل المثال، قد يكون العدد العائم متبوعًا بفاصلة "1.5" أو "1,5"، ولكن في كلتا الحالتين يجب أن تكون محاولة تحليل العدد العائم "جشعة".
  • لكي أكون آمنًا، أود أن أفترض أن مدخلاتي معادية بشكل نشط (على سبيل المثال، التدفق من تدفق الشبكة):أي.في عداد المفقودين عمدا محددات التقطيع.
  • أرغب في تجنب Regex المخصص:يعمل كل من int.Parse وdouble.Parse بشكل جيد ويدركان الترجمة.لا تجعلني أبدأ في DateTime - قد أحتاج إلى بعض الأنماط المخصصة على أية حال، لكن كتابة التعابير العادية لتغطية هذا السيناريو لا تبدو ممتعة.

للحصول على مثال ملموس، لنفترض أن لدي TextReader وأنني أعلم أن القيمة التالية يجب أن تكون أ double - كيف يمكنني استخراج هذا المضاعفة وربما كمية محدودة من البحث الأمامي دون قراءة الدفق بأكمله ودون كتابة محلل مزدوج قابل للترجمة يدويًا؟

أسئلة مماثلة

هناك سؤال سابق "أبحث عن ما يعادل C# scanf" والذي يبدو مشابهًا ولكن السؤال + A يركز على readline + regex (وهو ما أود تجنبه). كيف يمكنني استخدام Regex ضد TextReader؟ لم أجد إجابة (تتجاوز التقطيع)، وعلى أية حال أود تجنب كتابة التعابير العادية الخاصة بي.

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

المحلول

بناءً على هذا النقص في الإجابات وعدم العثور على أي شيء بنفسي، يبدو ذلك

  • لا توجد وسيلة لاستخدام التحليل المترجم مباشرة من التدفقات (أو TextReaders) في .NET، ولا توجد طريقة لمعرفة مقدار الدفق الذي يتوافق مع بادئة قابلة للتحليل بطريقة منهجية.
  • لا توجد وسيلة لتطبيق التعبيرات العادية على التدفقات (أو TextReaders) في .NET، لذلك لا توجد طريقة سهلة لتنفيذ شيء مثل هذا بنفسك.
  • إذا كنت حقا بحاجة إلى شيء من هذا القبيل، فإن الخيار الأسهل هو مولد محلل كامل.ANTLR يعمل بشكل جيد لهذا؛يحتوي على الكثير من القواعد النحوية الموجودة التي يمكنك نسخها ولصقها للأساسيات، ويأتي مزودًا بواجهة مستخدم رسومية للمساعدة في فهم قواعدك النحوية وإنشاء محللين لـ .NET وjava وC ومجموعة من اللغات الأخرى.إنه صديق للمطورين وسريع ......ولكنها قوية جدًا ومرنة بالنسبة لما أحتاج إليه؛مثل إطلاق النار على حشرة ببندقية - لست سعيدًا بهذا الحل.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top