سؤال

وأنا أحاول تعليم نفسي الشجرة قواعد مولد روبي. أنا وجدت أن ليس فقط وثائق قليلة يرثى له عن "أفضل" واحد هناك، ولكن هذا لا يبدو للعمل بشكل حدسي كما كنت أتمنى.

وعلى مستوى عال، وأنا أحب حقا تعليمي أفضل من مستندات في الموقع أو الفيديو، وإذا كان هناك واحد.

في مستوى أدنى، وهنا قواعد اللغة لا أستطيع الحصول على العمل على الإطلاق:

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end

وعندما تحميله وتشغيل بعض التأكيدات في كائن اختبار بسيط جدا، وأجد:

assert_equal @parser.parse('3.14').eval,3.14

ويعمل بشكل جيد، في حين

assert_equal @parser.parse('3').eval,3

ويثير الخطأ: NoMethodError: الخاص طريقة `حدة التقييم" دعا #

إذا كنت عكس صحيح وتطفو على الوصف، وكلاهما صحيحة ويطفو تعطيني هذا الخطأ. وأعتقد أن هذه قد تكون ذات صلة lookahead محدود، ولكن لا أستطيع أن أجد أي معلومات في أي من مستندات لتغطية حتى فكرة تقييم في "أو" السياق

وأكثر قليلا من المعلومات التي يمكن أن تساعد. وفيما يلي المعلومات ص لكل من تلك تحليل () كتل.

وتعويم:

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"

وهذا صحيح ... لاحظ أنه يبدو أنه قد تم تعريفها لمتابعة حكم صحيح، ولكن ليس القبض على طريقة وحدة التقييم ():

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

تحديث:

وحصولي على مشكلة معينة تعمل، ولكن ليس لدي أي فكرة لماذا:

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

وهذا لا معنى له مع المستندات التي تكون موجودة، ولكن مجرد إزالة الأقواس إضافية جعلت المباراة تشمل الطبقة Integer1 وكذلك Integer0. Integer1 على ما يبدو الطبقة عقد طريقة حدة التقييم (). ليس لدي فكرة لماذا هذا هو الحال.

وأنا لا تزال تبحث عن مزيد من المعلومات حول الشجرة.

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

المحلول

للأسف، تمتص الوثائق الشجرة و. كثير. والأمثلة على الموقع الإلكتروني ليست مفيدة. لقد وجدت أن dzone لديه مجموعة كبيرة جدا من كتب النحو الشجرة:

الشجرة قواعد النحو

نصائح أخرى

وقد نقدر لطيفة، والبرنامج التعليمي بول Battley البسيط في الشروع في العمل مع الشجرة

وبدءا من قواعد الحد الأدنى، وقال انه تبين كيفية إنشاء محلل ثم من خلال زوجين من التكرار يضيف قليلا من وظائف. كان يكفي أن يحصل لي من كتل البداية.

أعطى

ورولان Swingler عرضا حول الشجرة لLRUG: http://skillsmatter.com/podcast/ajax-ria/treetop التي وجدت من المفيد بدء العمل.

والحمضيات هو بديل أخف بكثير لالشجرة: http://github.com/mjijackson/citrus

وتابعت هذا الشجرة تمهيدية البرنامج التعليمي بضع سنوات لفهم أساسيات الشجرة.

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

ولقد بدأت للتو تجريب الشجرة.

وحاولت تغيير

 rule num
      (float / integer)
 end

إلى

 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end

وعلى ما يبدو للعمل.

وومستندات الشجرة ويبدو أن تفترض أنك تعرف بالفعل قدرا كبيرا حول <م> تحليل التعبير قواعد النحو (أوتاد). ويستند كليا على الشجرة أوتاد. أوتاد هي أكبر من الشجرة فقط رغم ذلك، أي أنها تستخدم في المكتبات تحليل الأخرى كذلك. في تعلم الشجرة، وجدت أنه من المفيد جدا للدراسة حتى على أوتاد بشكل عام. التي ساعدت في ملء الكثير من الثغرات الموجودة في الوثائق.

وهذا خطأ. الأقواس غير الضرورية حول قاعدة لعدد صحيح يؤدي بناء وحدة إضافية للسيطرة على تعريف وحدة التقييم، وهذه الوحدة لا تحصل المختلط في لالعقدة، لذلك "وحدة التقييم 'غير متوفرة. يمكنك ان ترى هذا بوضوح إذا ما قورنت رمز روبي (تم إنشاؤها باستخدام الأمر ترينيداد وتوباغو) لإصدارات مع وبدون هذه الأقواس إضافية.

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