作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前正在尝试编写一个 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])")
最佳答案
如果您的意思是“如何从节点函数中访问组件?”有几种方法。您可以使用 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 ) ")" ...
然后按名称引用它们。
如果您只想匹配那些字符,您的字符规则看起来不错。如果您想匹配任何字符,您可以像在正则表达式中一样使用点 (.)。
我不熟悉您要解析的语言,但您要查找的规则可能类似于:
rule comment
"C" balanced_square_bracket_string
end
rule balanced_square_bracket_string
"[" ( [^\[\]] / balanced_square_bracket_string )* "]"
end
第二条规则的中间部分匹配任何非方括号或带 balanced_square 括号的嵌套字符串。
附言有一个相当活跃的Google group , 具有在线和可搜索的文件。
关于ruby - 树顶 SGF 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597385/
我目前正在尝试编写一个 Treetop 语法来解析简单游戏格式文件,并且到目前为止它大部分都在工作。但是,出现了一些问题。 我不确定如何实际访问 Treetop 在解析后生成的结构。 有没有比我的字符
我是一名优秀的程序员,十分优秀!