Próbuję parsować prostą składnię wrażliwą przy użyciu biblioteki Parslet w Ruby.Parsera wrażliwego z użyciem indentacji przy użyciu Parslet w Ruby?
Poniżej przedstawiono przykład składni Ja próbuje zanalizować:
level0child0
level0child1
level1child0
level1child1
level2child0
level1child2
Powstały drzewo będzie wyglądać tak:
[
{
:identifier => "level0child0",
:children => []
},
{
:identifier => "level0child1",
:children => [
{
:identifier => "level1child0",
:children => []
},
{
:identifier => "level1child1",
:children => [
{
:identifier => "level2child0",
:children => []
}
]
},
{
:identifier => "level1child2",
:children => []
},
]
}
]
parser, że mam teraz można analizować poziom zagnieżdżenia 0 i 1 węzłów, ale nie można przetworzyć przeszłości:
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
Jasne, że potrzebuję dynamiki c licznik, który oczekuje 3 węzłów wcięcia pasujących do identyfikatora na poziomie zagnieżdżenia 3.
Jak mogę zaimplementować parser składni wrażliwy przy użyciu Parsleta w ten sposób? Czy to możliwe?
Nie wiem, czy to jest lepiej zrobione jako parse/budować oddzielne etapy. Prawie każda kombinacja poziomów wcięć byłaby ważna i parsowana, więc dla mnie jest to bardzo prosty parser oparty na liniach, który przechwytuje tylko poziom wcięcia, a następnie coś, co pobiera dane wyjściowe analizatora składni i buduje strukturę zagnieżdżoną. –