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.

  1. No estoy seguro de cómo acceder a la estructura de copa de árbol realidad genera después de un análisis.
  2. ¿Hay una mejor manera de manejar la captura de todos los caracteres que mi regla de caracteres?
  3. 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])")
¿Fue útil?

Solución

  1. 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.

  1. 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.

  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top