Copas de los árboles de análisis SGF
Pregunta
Actualmente estoy tratando de escribir una gramática copa de árbol para analizar archivos de formato de juego sencillo, y tenerlo todo trabajando hasta ahora. Sin embargo, hay algunas preguntas que han surgido.
- No estoy seguro de cómo acceder a la estructura de copa de árbol realidad genera después de un análisis.
- ¿Hay una mejor manera de manejar la captura de todos los caracteres que mi regla de caracteres?
-
Hay un caso de comentarios que me parece que no puede escribir correctamente.
C [player1 [4k \]: hi jugador2 [3k \]: hi]
No puedo envolver mi cabeza alrededor de cómo hacer frente a la estructura anidada del nodo C [] con [] 's dentro de ellos.
La siguiente es mi progreso actual.
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
Y mi caso de prueba, actualmente excluyendo C [] nodos con el problema del soporte anidada mencionado anteriormente:
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])")
Solución
- La estructura se vuelve a usted como un árbol de SyntaxNodes (si el resultado es nulo, comprobar parser.failure_reason). Se puede caminar a este árbol (y esto es recomendado) puede incrementarla con funciones que hacer lo que desee y simplemente llamar a su función principal en la raíz.
Si lo que quiere decir es "¿cómo acceder a los componentes dentro de una función de nodo?" hay varias maneras. Puede llegar a ellos con el elemento [x] notación o por la regla:
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
}
También puede nombrarlos así:
rule phone_number
"(" area_code:( digit digit digit ) ")" ...
y luego referirse a ellos por su nombre.
-
Su regla de caracteres se ve bien si solo deseas para que coincida con esos caracteres. Si desea hacer coincidir cualquier carácter que sólo puede utilizar un punto (.) Como en una expresión regular.
-
No estoy familiarizado con el idioma que está tratando de analizar, pero la regla que busca puede ser algo como:
rule comment "C" balanced_square_bracket_string end rule balanced_square_bracket_string "[" ( [^\[\]] / balanced_square_bracket_string )* "]" end
La parte central de la segunda regla coincide con nada que no sea un corchete o una cadena anidada con soportes balanced_square.
P.S. Hay una grupo Google , con archivos en línea y realizar búsquedas.