私は(私が思うに)tcl配列にたくさんのデータを持っています。基本的にはの形式です{a {b c} d {e f} g}
。ネストされているのは1つだけですが、常にネストされているわけではありません。つまり、ネストされている場合もあれば、そうである場合もありa
ますが、決してネストされていない場合もあります。この配列を抽出して、rubyで使用できるようにします。a
{aa bb}
{}
{aa {bb cc}}
私が最初に考えたのは、「問題ありません。これを解析するための文法を少し書きます」でした。ツリートップのgemをインストールし、パーサーを作成しました。これは問題なく機能しているようです。解析されたツリーから配列を抽出しようとすると、問題が発生し始めました。問題の原因と私が間違っていることをよりよく理解したいと思います。
これまでの私のパーサーコードは次のとおりです:(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
しかし、この文法では、パーサーが代替式(/)を使用していなくても、配列ルールに対していくつかの異なる式を作成しているように見えるという問題がありました。その結果、配列ルールのさまざまなビットにアクセスして、それらをルビー配列として返す方法がわかりませんでした。