私は現在、Simple Game Format ファイルを解析する Treetop 文法を作成しようとしていますが、これまでのところほとんど機能しています。ただし、出てきたいくつかの質問があります。
- Treetop が解析後に生成する構造に実際にアクセスする方法がわかりません。
- 私のcharsルールよりもすべての文字のキャプチャを処理するためのより良い方法はありますか?
コメントが正しく書けない場合がございます。
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])")