باستخدام مكرر تحليل مع تفعيل :: روح القواعد النحوية

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

  •  22-08-2019
  •  | 
  •  

سؤال

وعندما أحاول استخدام النموذج مكرر من تحليل لقواعد اللغة الروح أحصل على حجة تمرير الخطأ التحويل من نوع مكرر لCONST شار *. كيف يمكنني إصلاح هذا؟

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

وهنا هو نموذج التعليمات البرمجية يتظاهرون المشكلة:

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <vector>
#include <string>
using std;
using boost::spirit;
struct ex : public grammar<route_grammar> {
  template <typename ScannerT> struct defintion {
    definition(ex const& self) {
      expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};

int main() {
  file_iterator<char> first;
  file_iterator<char> last = first.make_end();
  ex ex_p;
  parse_info<file_iterator<char> > info = parse(first, last, ex_p, space_p);
  return 0;
}

وهذا الرمز يكسر مع: خطأ: لا يمكن تحويل const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> > إلى const char* في حجة يمر

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

المحلول

ومن الصعب معرفة من الكود كما نشر، لأنه يحتوي على بعض الأخطاء الأساسية. بعد تصحيح هذه، فإنه يجمع بشكل جيد على الجهاز الخاص بي (مع MSVC ++ 7.1):

#include <boost/spirit/core.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace boost::spirit;
struct ex : public grammar<ex> {
template <typename ScannerT> 
struct definition {
    definition(ex const& self)
    {
    expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};
};

int main() {
vector<char> v;
v.push_back('3'); v.push_back('.'); v.push_back('2');
ex ex_p;
parse_info<vector<char>::iterator> info = parse(v.begin(), v.end(), ex_p, space_p);
return 0;
}

نصائح أخرى

وهنا هي طريقة واحدة للحصول على شار * الصورة لافتا في نفس عناصر المكررات:

&v.front() // v.begin()
&v.back() + 1 // v.end()

ولست متأكدا كيف حصل هذا لتجميع على الرغم من:

vector<char> v;
v.push_back("3.2");

وكان الخطأ تجميع ليس في العينة المقدمة. في قواعد اللغة أعلاه ليس لدي أي إجراءات الدلالي، بينما في رمز كنت تبسيط فعلت.

وهذا الاستدعاء لتلك الإجراءات المستخدمة شار * بدلا من نوع مكرر كنت تستخدم.

ويمكنك محاولة التأكد من أن الإجراءات الدلالي الخاص كانت متعددة الأشكال على نوع من ذي الحجة. على وجه التحديد في التعليمات البرمجية كنت تريد شيئا من هذا القبيل:

struct my_action {
  template <class ParamType>
  void operator()(ParamType const & parameter) const {
    // deal with parameter
  }
};

وكنت يمكنك استخدام العمل الدلالي الأحادية مثل هذا كما هو موضح أدناه:

real_p[my_action()]

وأو إذا كنت في حاجة إلى العمل الدلالي ثنائي، وكنت تفعل شيئا مثل:

struct binary_action {
  template <class ParamType>
  void operator()(ParamType const & param1, ParamType const & param2) const {
    // deal with either parameter
  }
};

(*char_p)[binary_action()]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top