Estoy tratando de enseñarme el generador de gramática Treetop de Ruby. Estoy descubriendo que no solo la documentación es escasamente escasa para el "mejor" que existe, sino que no parece funcionar tan intuitivamente como esperaba.Learning Treetop
En un nivel superior, realmente me encantaría un tutorial mejor que los documentos en el sitio o el video, si es que hay alguno.
En un nivel inferior, aquí está una gramática que no puedo ir a trabajar en absoluto:
grammar SimpleTest
rule num
(float/integer)
end
rule float
(
(('+'/'-')? plain_digits '.' plain_digits)/
(('+'/'-')? plain_digits ('E'/'e') plain_digits)/
(('+'/'-')? plain_digits '.')/
(('+'/'-')? '.' plain_digits)
) {
def eval
text_value.to_f
end
}
end
rule integer
(('+'/'-')? plain_digits) {
def eval
text_value.to_i
end
}
end
rule plain_digits
[0-9] [0-9]*
end
end
Cuando cargo y ejecutar algunas afirmaciones en un objeto de prueba muy simple, me parece:
assert_equal @parser.parse('3.14').eval,3.14
funciona bien, mientras que
assert_equal @parser.parse('3').eval,3
plantea el error: NoMethodError: eval método `privado' pidió #
Si invierto el número entero y floto en la descripción, tanto los enteros como los flotantes me dan este error. Creo que esto puede estar relacionado con la búsqueda limitada, pero no puedo encontrar información en ninguno de los documentos para cubrir la idea de evaluar en el contexto "o"
Un poco más de información que puede ayudar. Aquí hay información de pp para ambos bloques de análisis().
El flotador:
SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
SyntaxNode offset=0, ""
SyntaxNode+PlainDigits0 offset=0, "3":
SyntaxNode offset=0, "3"
SyntaxNode offset=1, ""
SyntaxNode offset=1, "."
SyntaxNode+PlainDigits0 offset=2, "14":
SyntaxNode offset=2, "1"
SyntaxNode offset=3, "4":
SyntaxNode offset=3, "4"
el entero ... en cuenta que parece que ha sido definido a seguir la regla número entero, pero no se detecta el método eval():
SyntaxNode+Integer0 offset=0, "3" (plain_digits):
SyntaxNode offset=0, ""
SyntaxNode+PlainDigits0 offset=0, "3":
SyntaxNode offset=0, "3"
SyntaxNode offset=1, ""
actualización :
tengo mi problema particular de trabajo, pero no tengo ni idea de por qué:
rule integer
('+'/'-')? plain_digits
{
def eval
text_value.to_i
end
}
end
Esto no tiene sentido con los documentos que están presentes, pero solo eliminando los paréntesis adicionales que hacen que la coincidencia incluya la clase Integer1 así como Integer0. Integer1 es aparentemente la clase que contiene el método eval(). No tengo idea de por qué este es el caso.
Todavía estoy buscando más información sobre treetop.
Gracias;) Voy a averiguarlo a través de ese – user54650
buena suerte! tal vez podrías escribir algún artículo/tutorial después de que hayas terminado? – Geo
Lamentablemente, la página está deshabilitada por algún motivo. –