RegexParsers জন্য কাস্টম ত্রুটি

কেউ আমাকে নিম্নলিখিত আচরণ বুঝতে সাহায্য করবে: parseAll (পার্স, যদি "bl bllalaa") এর ফলে প্রত্যাশিত হবে । পরিবর্তে আমি সর্বদা স্ট্রিং মিলিং রেজেক্স 'পেয়েছি \ b' প্রত্যাশিত কিন্তু 'বো' পাওয়া যায় । আমি মনে করি এটি হোয়াইটস্পেসগুলির সাথে কিছু আছে কারণ "যদি ব্লা ব্লাবল হয়" (শুরুতে সাদা জায়গাগুলিতে লক্ষ্য করুন) একই আচরণের ফলাফল। আমি StandardTokenParsers এর সাথে এটি চেষ্টা করেছি এবং সবকিছু ঠিক আছে। কিন্তু এসটিপি দুর্ভাগ্যবশত regex সমর্থন করে না। ফলোআপ প্রশ্নঃ আমাকে রেজেক্সার্সকে কিভাবে পরিবর্তন করতে হবে যাতে এটি অক্ষরের ক্রম পরিবর্তে স্ট্রিংগুলির ক্রম ব্যবহার করে? যে ত্রুটি অনেক বেশি সহজ রিপোর্ট করা হবে।

lazy val parseIf = roleGiverIf ~ giverRole

lazy val roleGiverIf =
  kwIf ~> identifier | failure("""A rule must begin with if""")
lazy val giverRole =
  kwIs ~> identifier | failure("""is expected""")

lazy val keyword =
  kwIf | kwAnd | kwThen | kwOf | kwIs | kwFrom | kwTo

lazy val identifier =
  not(keyword) ~ roleEntityLiteral
// ...

def roleEntityLiteral: Parser[String] =
  """([^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})\S*""".r 
def kwIf: Parser[String] = "If\\b".r
def kwIs: Parser[String] = "is\\b".r

// ...

parseAll(parseIf, "If bla blablaa") match {
  case Success(parseIf, _) => println(parseIf)
  case Failure(msg, _) => println("Failure: " + msg)
  case Error(msg, _) => println("Error: " + msg)
1

1 উত্তর

এই সমস্যা খুব অদ্ভুত। যখন আপনি | কল করেন এবং উভয় পক্ষের ব্যর্থতা হয়, তখনই ব্যর্থতা শেষ নির্বাচন করা হয়, বাম দিকের পক্ষে পছন্দ করে।

যখন আপনি giverRole দিয়ে সরাসরি বিশ্লেষণ করার চেষ্টা করেন, তখন এটি আপনার প্রত্যাশিত ফলাফল তৈরি করে। ব্যর্থতার আগে যদি আপনি একটি সফল মিল যোগ করেন, তবে এটি আপনার দ্বারা প্রদর্শিত ফলাফল তৈরি করে।

কারণটি বরং সূক্ষ্ম - আমি কেবল সমস্ত পাজারের লগ বিবৃতি ছিটিয়ে এটি খুঁজে পেয়েছি। এটি বোঝার জন্য, আপনাকে RegexParser স্পেসগুলি কীভাবে ছেড়ে দিতে হবে বুঝতে হবে। বিশেষত, স্পেসগুলি স্বীকার করুন এড়িয়ে চলে গেছে। কারণ ব্যর্থতা স্বীকার করবেন না কল করে না, এটি স্পেস এড়িয়ে চলে না।

kwIs এর ব্যর্থতা b এ ঘটলে, যেমন স্থানটি বাদ দেওয়া হয়েছে, ব্যর্থতার এর ব্যর্থতা এর পরে ঘটবে > যদি </কোড> </ই.এম.>। এখানে:

If bla blablaa
   ^ kwIs fails here
  ^ failure fails here

অতএব, kwIs এ ত্রুটি বার্তাটি আমি উল্লেখ করেছি নিয়ম দ্বারা অগ্রাধিকার পায়।

আপনি পার্সার কিছু মিলা ছাড়াই স্পেস বাদ দিয়ে এই সমস্যা প্রায় পেতে পারেন। এটি সর্বদা গুরুত্বপূর্ণ যে এই প্যাটার্নটি সবসময় মেলে, অথবা আপনি আরও বিভ্রান্তিকর ত্রুটির বার্তা পাবেন। এখানে একটি পরামর্শ আমি কাজ মনে করি:

"\\b|$".r ~ failure("is expected")

আরেকটি সমাধান হল গ্রহণ করুন বা স্বীকার করুন ব্যবহার করুন, প্রতিস্থাপিত Regex গ্রহণের পরিবর্তে, কোন ক্ষেত্রে আপনি একটি উপযুক্ত ত্রুটি বার্তা সরবরাহ করতে পারেন।

0
যোগ
@ মার্টোস আমি অবশেষে সমস্যাটি খুঁজে পাই। প্রথম সমাধানটি আমি চিন্তা করার চেয়ে আরও উপযুক্ত ছিলাম - আমি কোনও অ-স্পেস অক্ষর না খেয়ে ভুল জায়গায় সঠিকভাবে ত্রুটি দেখাতে এটি পরিবর্তন করেছি।
যোগ লেখক Daniel C. Sobral, উৎস
আমি regex এবং lexical ক্ষমতা সঙ্গে একটি পার্সার লিখেছেন এবং আপনি সুপারিশ হিসাবে গ্রহণ হিসাবে ব্যবহার। কিন্তু এটি এখনও অদ্ভুত যে উপরের উদাহরণ প্রত্যাশিত হিসাবে কাজ করবে না। আপনার সাহায্যের জন্য ধন্যবাদ
যোগ লেখক awertos, উৎস