我目前正在尝试编写一个Treetop语法来解析简单游戏格式文件,并且到目前为止它主要使用它。但是,有一些问题已经出现。
有一些评论我似乎无法正确撰写。
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_/\-:;|'"\\<>(){}!@#$%^&\*\+\-,\.\?!= \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 :(得分:3)
如果您的意思是“如何从节点功能中访问组件?”有几种方法。您可以使用元素[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 ) ")" ...
然后按名称引用它们。
如果您只想匹配这些字符,那么您的字符规则就可以了。如果你想匹配任何字符,你可以像使用正则表达式一样使用点(。)。
我不熟悉您要解析的语言,但您要查找的规则可能类似于:
rule comment "C" balanced_square_bracket_string end rule balanced_square_bracket_string "[" ( [^\[\]] / balanced_square_bracket_string )* "]" end
第二条规则的中间部分匹配任何非方括号或带有balanced_square括号的嵌套字符串。
P.S。有一个相当活跃的Google group,其中有档案在线&amp;可搜索的。