3

私は現在、Simple Game Format ファイルを解析する Treetop 文法を作成しようとしていますが、これまでのところほとんど機能しています。ただし、出てきたいくつかの質問があります。

  1. Treetop が解析後に生成する構造に実際にアクセスする方法がわかりません。
  2. 私のcharsルールよりもすべての文字のキャプチャを処理するためのより良い方法はありますか?
  3. コメントが正しく書けない場合がございます。

    C[プレイヤー1 [4k\]: やあ、プレイヤー2 [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])")
4

1 に答える 1

3
  1. 構造はSyntaxNodesのツリーとして返されます(結果がnilの場合は、parser.failure_reasonを確認してください)。このツリーを歩くか(そしてこれが推奨されます)、必要なことを実行する関数でツリーを拡張し、ルートでメイン関数を呼び出すことができます。

「ノード関数内からコンポーネントにどのようにアクセスするか」という意味の場合。いくつかの方法があります。element [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. これらの文字のみを一致させたい場合は、charsルールは問題なく表示されます。任意の文字に一致させたい場合は、正規表現のようにドット(。)を使用できます。

  2. 私はあなたが解析しようとしている言語に精通していませんが、あなたが探しているルールは次のようなものかもしれません:

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

2番目のルールの中央部分は、角かっこまたはbalanced_squareかっこ付きのネストされた文字列以外のものと一致します。

PSかなり活発なGoogleグループがあり、アーカイブはオンラインで検索可能です。

于 2009-02-28T02:58:50.903 に答える