Analizador sensible a la sangría usando Parslet en Ruby?

Estoy intentando analizar una sintaxis sensible a la sangría simple usando elParslet biblioteca dentro de ruby.

El siguiente es un ejemplo de la sintaxis que estoy intentando analizar:

level0child0
level0child1
  level1child0
  level1child1
    level2child0
  level1child2

El árbol resultante se vería así:

[
  {
    :identifier => "level0child0",
    :children => []
  },
  {
    :identifier => "level0child1",
    :children => [
      {
        :identifier => "level1child0",
        :children => []
      },
      {
        :identifier => "level1child1",
        :children => [
          {
            :identifier => "level2child0",
            :children => []
          }
        ]
      },
      {
        :identifier => "level1child2",
        :children => []
      },
    ]
  }
]

El analizador que tengo ahora puede analizar los nodos de nivel de anidamiento 0 y 1, pero no puede analizar más allá de eso:

require 'parslet'

class IndentationSensitiveParser < Parslet::Parser

  rule(:indent) { str('  ') }
  rule(:newline) { str("\n") }
  rule(:identifier) { match['A-Za-z0-9'].repeat.as(:identifier) }

  rule(:node) { identifier >> newline >> (indent >> identifier >> newline.maybe).repeat.as(:children) }

  rule(:document) { node.repeat }

  root :document

end

require 'ap'
require 'pp'

begin
  input = DATA.read

  puts '', '----- input ----------------------------------------------------------------------', ''
  ap input

  tree = IndentationSensitiveParser.new.parse(input)

  puts '', '----- tree -----------------------------------------------------------------------', ''
  ap tree

rescue IndentationSensitiveParser::ParseFailed => failure
  puts '', '----- error ----------------------------------------------------------------------', ''
  puts failure.cause.ascii_tree
end

__END__
user
  name
  age
recipe
  name
foo
bar

Está claro que necesito un contador dinámico que espere que 3 nodos de sangría coincidan con un identificador en el nivel de anidamiento 3.

¿Cómo puedo implementar un analizador de sintaxis sensible a la sangría usando Parslet de esta manera? ¿Es posible?

Respuestas a la pregunta(2)

Su respuesta a la pregunta