سؤال

ما هي الطريقة الصحيحة لحل هذه المشكلة في Antlr:

لدي قاعدة قواعد اللغة البسيطة، كما يقول لقائمة بعدد تعسفي من العناصر.

list
: '[]' 
| '[' value (COMMA value)* ']'

إذا أردت تعيين قيمة إرجاع للقائمة، ولدي هذه القيمة تكون القائمة الفعلية للقيم التي تم إرجاعها من الإنتاج، فما هي الطريقة الصحيحة للقيام بذلك؟ البدائل أنا مسلية هي:

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

أعتقد أن السؤال هو: كيف يفعل الأطفال البارد ذلك؟

(لمعلوماتك أنا أستخدم بيثون API ل Antlr، ولكن إذا ضربتني بلغة أخرى، يمكنني التعامل مع ذلك)

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

المحلول

في C # قد تبدو مثل هذا:

list returns [ List<string> ValueList ]
    @init
    {
        $ValueList = new List<string>();
    }
    : '[]'
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']'
    ;

نصائح أخرى

أعتقد أن طريقة أكثر وضوحا يمكن أن يكون

list returns [ List values ]
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' {
        $values = $vs;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top