Парсер, чувствительный к отступам, использующий Parslet в Ruby?

Я пытаюсь разобрать простой чувствительный к отступам синтаксис, используяParslet библиотека в рубине.

Ниже приведен пример синтаксиса, который я пытаюсь проанализировать:

level0child0
level0child1
  level1child0
  level1child1
    level2child0
  level1child2

Результирующее дерево будет выглядеть так:

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

Парсер, который у меня сейчас есть, может анализировать узлы вложенности уровня 0 и 1, но не может выполнить анализ этого:

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

Понятно, что мне нужен динамический счетчик, который ожидает, что 3 узла отступа будут соответствовать идентификатору на уровне вложенности 3.

Как я могу реализовать синтаксический анализатор, чувствительный к отступам, используя Parslet таким образом? Является ли это возможным?

Ответы на вопрос(2)

Ваш ответ на вопрос