Treetop: الحصول على إزاحة العقدة
سؤال
أنا أستخدم Treetop لإنشاء محلل للغة البرمجة الصغيرة.
عند التحليل الناجح ، أود إجراء بعض التحليلات الدلالية على شجرة بناء الجملة. من الناحية المثالية ، كلما واجهت جزءًا من رمز غير صالح (دلالي) ، أود طباعة رسالة خطأ تتضمن السطر الذي حدث فيه الخطأ. أعلم أن هذا ممكن لأنه إذا فعلت
parser = MyParser.new
tree = parser.parse("foobar")
p tree
أحصل على شيء مثل
SyntaxNode offset=0, "foobar":
SyntaxNode offset=0, "f"
SyntaxNode offset=1, "o"
SyntaxNode offset=2, "o"
SyntaxNode offset=3, "b"
SyntaxNode offset=4, "a"
SyntaxNode offset=5, "r"
في الأساس ، أود الحصول على وسيلة للوصول إلى offset
سمة معينة SyntaxNode
كائن (أو فئة فرعية منه). لسوء الحظ ، حسب http://treetop.rubyforge.org/semantic_interpretation.html الطرق الوحيدة المتاحة على Treetop::Runtime::SyntaxNode
نكون terminal?
, nonterminal?
, text_value
و elements
, ، لذلك لا يبدو أن هناك طريقة مدمجة للقيام بذلك.
المحلول
يحتوي كل بناء جملة على طريقة "فاصل" وهو كائن Ruby Range. الإزاحة هو الفاصل الزمني.
قائمة بريد دعم TRETOP في http://groups.google.com/group/treetop-dev