سؤال

أنا أعمل على تعزيز الروح 2.0 المحلل المحلل نصف مجموعة صغيرة من Fortran 77. القضية التي أواجهها هي أن FORTRAN 77 موجهة نحو الأعمدة، ولم أتمكن من العثور على أي شيء بروح يمكنه السماح بتحليلي أن تكون علم عمود. هل هناك أي طريقة للقيام بذلك؟

ليس من الضروري حقا دعم بناء جملة ARCANE FORTRAN الكامل، ولكن يجب أن تكون قادرا على تجاهل الخطوط التي تحتوي على حرف في العمود الأول (تعليقات FORTRAN)، وتعرف على خطوط بحرف في العمود السادس كوسائل استمرارية وبعد

يبدو أن الأشخاص الذين يتعاملون مع ملفات الدفعات سوف يكون لديهم نفس مشكلة العمود الأول مثلي. يبدو أن الروح تحتوي على محلل نهاية الخط، ولكن ليس محللا مبتذلا (و Sertianly ليس محللا عمود (x).

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

المحلول

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

Fortran 77، مثل كل اللغات الأخرى التي تهتم بالأعمدة، هي لغة موجهة خطية. هذا يعني أن محللك يتعين على تتبع EOL واستخدامه بالفعل في تحليله.

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

بالنظر إلى هذين الأمرين، يمكنني التعامل تماما مع هذه المشكلة بروح تخطي المحلل المحلل. كتبت الألغام إلى

  • تخطي الخط بأكمله إذا كان العمود الأول (التعليق) يحتوي على Charater الأبجدية.
  • تخطي الخط بأكمله إذا لم يكن هناك شيء على ذلك.
  • تجاهل EOL مسبقا وكل شيء يصل إلى العمود الخامس إذا كان العمود الخامس يحتوي على "." (خط الاستمرار). هذا يكمن في خط مقدما.
  • تخطي جميع Whitespace غير EOL (حتى المسافات لا يهم في Fortran. نعم، إنها لغة Wierd.)

إليك الرمز:

        skip = 
            // Full line comment
            (spirit::eol >> spirit::ascii::alpha >> *(spirit::ascii::char_  - spirit::eol))
            [boost::bind (&fortran::parse_info::skipping_line, &pi)]
        |  
            // remaining line comment
            (spirit::ascii::char_ ('!') >> *(spirit::ascii::char_ - spirit::eol)
             [boost::bind (&fortran::parse_info::skipping_line_comment, &pi)])
        |
            // Continuation
            (spirit::eol >> spirit::ascii::blank >> 
             spirit::qi::repeat(4)[spirit::ascii::char_ - spirit::eol] >> ".")
            [boost::bind (&fortran::parse_info::skipping_continue, &pi)]

        |   
            // empty line 
            (spirit::eol >> 
             -(spirit::ascii::blank >> spirit::qi::repeat(0, 4)[spirit::ascii::char_ - spirit::eol] >> 
               *(spirit::ascii::blank) ) >> 
             &(spirit::eol | spirit::eoi))
            [boost::bind (&fortran::parse_info::skipping_empty, &pi)]
        |   
            // whitespace (this needs to be the last alternative).
            (spirit::ascii::space - spirit::eol)
            [boost::bind (&fortran::parse_info::skipping_space, &pi)]
        ;

أود أن أنصح بمكافحة استخدام هذا بنفسك من أجل FORTRAN الموجهة نحو الخط، كما أتجاهل أرقام الخطوط، وللجمعات التحويل البرمجولات المختلفة قواعد مختلفة لأحرف التعليق الصحيحة والمستمرة.

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