문제

나는 현재 간단한 게임 형식 파일을 구문 분석하기 위해 Treetop 문법을 작성하려고 노력하고 있으며 지금까지 대부분 작동하도록합니다. 그러나 몇 가지 질문이 있습니다.

  1. Parse 후에 Treetop이 생성하는 구조에 실제로 액세스하는 방법은 확실하지 않습니다.
  2. 내 chars 규칙보다 모든 캐릭터를 캡처하는 더 좋은 방법이 있습니까?
  3. 제대로 쓸 수없는 의견이 있습니다.

    C [Player1 [4K ] : Hi 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 [] 노드를 제외한 내 테스트 사례 :

예 .RB

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. 구조는 구문의 나무로 돌아옵니다 (결과가 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

두 번째 규칙의 중간 부분은 정사각형 괄호 나 Balanced_Square 브래킷이있는 중첩 문자열과 일치합니다.

추신 : 상당히 활동적입니다 Google 그룹, 아카이브 온라인 및 검색 가능.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top