كيفية الجمع بين regexp والكلمات الرئيسية في مجموعات محللات Scala
-
04-10-2019 - |
سؤال
لقد رأيت نهجين لبناء محلات في سكالا.
الأول هو أن يمتد من regexparsers وتحديد أنماط معجمية فازت. المشكلة التي أراها مع هذا هي أنني لا أفهم حقًا كيف تتعامل مع غموض الكلمات الرئيسية. على سبيل المثال ، إذا كانت كلمتي الرئيسية تتطابق مع نفس نمط المعرفات ، فإنها تقوم بمعالجة الكلمات الرئيسية كمعرفات.
لمواجهة ذلك ، رأيت منشورات مثل هذا هذا يوضح كيفية استخدام StandardTokenParsers لتحديد الكلمات الرئيسية. ولكن بعد ذلك ، لا أفهم كيفية تحديد أنماط regexp! نعم ، يأتي StandardTokenParsers مع "Ident" ، لكنه لا يأتي مع الآخر الذي أحتاجه (تمثيلات أرقام نقطة عائمة معقدة ، وأنماط وقواعد حرفية محددة للهروب ، إلخ).
كيف تحصل على القدرة على تحديد الكلمات الرئيسية والقدرة على تحديد أنماط رمزية مع تعبيرات منتظمة؟
المحلول
لقد كتبت فقط RegexParsers
-محللون ، لكن ما أفعله هو شيء من هذا القبيل:
val name: Parser[String] = "[A-Z_a-z][A-Z_a-z0-9]*".r
val kwIf: Parser[String] = "if\\b".r
val kwFor: Parser[String] = "for\\b".r
val kwWhile: Parser[String] = "while\\b".r
val reserved: Parser[String] = ( kwIf | kwFor | kwWhile )
val identifier: Parser[String] = not(reserved) ~> name