سؤال

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

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

    ج [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])")
هل كانت مفيدة؟

المحلول

  1. يعود الهيكل إليك كشجرة 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 ) ")" ...

ثم الرجوع إليهم بالاسم.

  1. يبدو أن قاعدة الأحرف الخاصة بك على ما يرام إذا كنت ترغب فقط في مطابقة تلك الأحرف. إذا كنت ترغب في المباراة أي حرف يمكنك فقط استخدام نقطة (.) مثل في تعبير منتظم.

  2. أنا لست على دراية باللغة التي تحاول تحليلها، ولكن القاعدة التي تبحث عنها قد تكون مثل:

rule comment
    "C" balanced_square_bracket_string
    end
rule balanced_square_bracket_string
    "[" ( [^\[\]]  / balanced_square_bracket_string )* "]"
    end

يطابق الجزء الأوسط من القاعدة الثانية أي شيء غير قوس مربعة أو سلسلة متداخلة مع أقواس متوازنة_square.

ملاحظة: هناك نشط إلى حد ما مجموعة جوجل, مع الأرشيف عبر الإنترنت وقابل للبحث.

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