我目前正在尝试编写 Treetop 语法来解析简单游戏格式文件,并且到目前为止大部分都可以正常工作。但是,有几个问题出现了。
- 我不确定如何在解析后实际访问 Treetop 生成的结构。
- 有没有比我的字符规则更好的方法来处理捕获所有字符?
有一种情况是我似乎无法正确写出评论。
C[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[] 节点:
例子.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])")