2009-02-28 6 views
3

現在、Treetop文法を書いてSimple Game Formatファイルを解析しようとしています。しかし、いくつか質問があります。Treetop SGF Parsing

  1. 私は、ツリートップが実際にパースした後に生成する構造に実際にアクセスする方法がわかりません。
  2. 私のcharsルールよりもすべての文字をキャプチャするより良い方法はありますか?
  3. コメントが正しく書かれていないような場合があります。

    C [player1 [4K \]:HI player2 [3K \]:!HI]

私は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_/\-:;|'"\\<>(){}[email protected]#$%^&\*\+\-,\.\?!= \r\n\t]* 
end 

rule empty 
    '' 
end 
end 

そして、私のテストケース、現在上記のネストされたブラケット問題言及とC []ノードを除く:

example.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])") 
+0

これはほぼ一年後に読んだ人の誰もが次のようになりました:http://github.com/boj/kantan-sgf - 世界で最も効率的なものではありませんが、優れたTreeTop/SGF解析でした実験。 – bojo

答えて

3
  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 

の中央部2番目のルールは、大括弧でないものまたはbalanced_squareの括弧で囲まれた文字列にマッチします。

P.S.かなりアクティブなGoogle groupがあり、オンラインのアーカイブ&が検索可能です。

+0

MarkusQのヒントをありがとう。私はこれの周りに頭を包み込み続けるつもりですが、あなたは正しい方向に私を連れてきました。 – bojo