سؤال
أحاول حاليا كتابة قواعد تريتوب لتحليل ملفات تنسيق اللعبة البسيطة، ولديها تعمل في الغالب حتى الآن. ومع ذلك، هناك بعض الأسئلة التي توصلت إليها.
- أنا غير متأكد من كيفية الوصول في الواقع إلى الهيكل الذي ينشئ بعد تحليل.
- هل هناك طريقة أفضل للتعامل مع الاستيلاء على جميع الأحرف من قاعدة الأحرف الخاصة بي؟
هناك قضية للتعليقات التي لا أستطيع الكتابة عليها بشكل صحيح.
ج [Player1 [4K ]: مرحبا Player2 [3K ]: مرحبا!
لا أستطيع أن ألتف رأسي حول كيفية التعامل مع الهيكل المتداخل للعقدة C [] بداخلها.
ما يلي هو تقدمي الحالي.
SGF-Grammar.treetop.
grammar SgfGrammar
rule node
'(' chunk* ')' {
def value
text_value
end
}
end
rule chunk
';' property_set* {
def value
text_value
end
}
end
rule property_set
property ('[' property_data ']')* / property '[' property_data ']' {
def value
text_value
end
}
end
rule property_data
chars '[' (!'\]' . )* '\]' chars / chars / empty {
def value
text_value
end
}
end
rule property
[A-Z]+ / [A-Z] {
def value
text_value
end
}
end
rule chars
[a-zA-Z0-9_/\-:;|'"\\<>(){}!@#$%^&\*\+\-,\.\?!= \r\n\t]*
end
rule empty
''
end
end
وحالة الاختبار الخاصة بي، باستثناء العقد C [] حاليا مع مشكلة قوس المتداخلة المذكورة أعلاه:
مثال
require 'rubygems'
require 'treetop'
require 'sgf-grammar'
parser = SgfGrammarParser.new
parser.parse("(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
RU[Japanese]SZ[19]KM[0.50]TM[1800]OT[5x30 byo-yomi]
PW[stoic]PB[bojo]WR[3k]BR[4k]DT[2008-11-30]RE[B+2.50])")
المحلول
- يعود الهيكل إليك كشجرة SyntaxNodes (إذا كانت النتيجة NIL، تحقق من parser.failure_Reason). يمكنك المشي هذه الشجرة أو (وهذا ينصح بذلك) يمكنك زيادة ذلك مع الوظائف التي تفعل ما تريد فقط واستدعاء وظيفتك الرئيسية على الجذر.
إذا كان ما تعنيه هو "كيف يمكنك الوصول إلى المكونات من داخل وظيفة العقدة؟" هناك عدة طرق. يمكنك الحصول عليها مع عنصر [X] أو عن طريق القاعدة:
rule url_prefix
protocol "://" host_name {
def example
assert element[0] == protocol
assert element[2] == host_name
unless protocol.text_value == "http"
print "#{protocol.text_value} not supported"
end
end
}
يمكنك أيضا تسمية لهم مثل ذلك:
rule phone_number
"(" area_code:( digit digit digit ) ")" ...
ثم الرجوع إليهم بالاسم.
يبدو أن قاعدة الأحرف الخاصة بك على ما يرام إذا كنت ترغب فقط في مطابقة تلك الأحرف. إذا كنت ترغب في المباراة أي حرف يمكنك فقط استخدام نقطة (.) مثل في تعبير منتظم.
أنا لست على دراية باللغة التي تحاول تحليلها، ولكن القاعدة التي تبحث عنها قد تكون مثل:
rule comment "C" balanced_square_bracket_string end rule balanced_square_bracket_string "[" ( [^\[\]] / balanced_square_bracket_string )* "]" end
يطابق الجزء الأوسط من القاعدة الثانية أي شيء غير قوس مربعة أو سلسلة متداخلة مع أقواس متوازنة_square.
ملاحظة: هناك نشط إلى حد ما مجموعة جوجل, مع الأرشيف عبر الإنترنت وقابل للبحث.