У меня есть куча данных в (что я думаю) массиве tcl. В основном это в форме {a {b c} d {e f} g}
. Это только вложенная одна глубокая, но не всегда вложенная, то есть a
может просто быть a
или может быть {aa bb}
или, возможно, {}
, но никогда {aa {bb cc}}
. Я хочу извлечь этот массив, чтобы использовать его в ruby.Анализ массивов tcl в ruby с treetop
Моя первая мысль была: «Без проблем, я напишу немного грамматики, чтобы разобрать это». Я установил драгоценный камень из верхушки верхушки и написал парсер, который, казалось, работал нормально. У меня возникли проблемы, когда я попытался извлечь массив из дерева синтаксического анализа. Я хотел бы лучше понять причину проблем и то, что я делаю неправильно.
Вот мой анализатор кода до сих пор: (tcl_array.treetop)
grammar TCLArray
rule array
"{" [\s]* "}" {
def content
[]
end
}
/
"{" [\s]* array_element_list [\s]* "}" {
def content
array_element_list.content
end
}
end
rule array_element_list
array_element {
def content
[array_element.content]
end
}
/
array_element [\s]+ array_element_list {
def content
[array_element.content] + array_element_list.content
end
}
end
rule array_element
[^{}\s]+ {
def content
return text_value
end
}
/
array {
def content
array.content
end
}
end
end
Вызов p.parse("{a}").content
урожайности tcl_array.rb:99:in 'content': undefined local variable or method 'array_element'
Первый член в array_element_list (array_element) говорит, что array_element является неопределенным локальная переменная, но методы доступа должны быть автоматически определены в соответствии с документацией по верхушке.
Ранее я попробовал решение, которое было основано от грамматики с меньшим количеством, но немного более сложные правила:
grammar TCLArray
rule array
"{" ([\s]* array_element ([\s]+ array_element)*)? [\s]* "}"
end
rule array_element
[^{}\s]+/array
end
end
Но с этой грамматикой у меня были проблемы, когда, казалось, анализатор будет создавать несколько различных выражений правило массива, даже если оно не использовало альтернативных выражений (/). В результате я не мог понять, как получить доступ к различным битам правила массива, чтобы вернуть их как массив ruby.
Вы обеспечили восхитительное решение проблемы под руку, так что большое спасибо. :) Сказанное, простейшим решением, вероятно, было бы узнать немного TCL и написать что-то, чтобы вывести массив в нечто, что мог бы понять рубин, но я видел это как возможность немного переосмыслить парсеры. Поэтому мне все еще интересно узнать, что я делаю неправильно. Я не могу сказать, является ли это дефектом в Тритопе или дефектом в моем понимании этого. В любом случае, большое спасибо за вашу тяжелую работу! – enki