梢とルビーでTCL配列の解析
質問
私は(私はと思われるもの)TCL配列内のデータの束を持っています。基本的には{a {b c} d {e f} g}
の形であります。それだけで深い1ネストされていますが、常にネストされていない、すなわち、a
だけa
することができるか、それが{aa bb}
を{}
ないか、多分{aa {bb cc}}
を、決してすることができます。私はRubyでそれを使用することができますので、この配列を抽出したい。
私が最初に考えたのは、「いいえ問題は、私はこれを解析するために少し文法を書きませんよ。」、でした私は梢の宝石をインストールし、うまく動作するように見えたパーサを、書きました。私が解析された木から配列を抽出しようとしたとき、私は問題を抱え始めました。私はより良い問題の原因とどのような私が間違っているのを理解したいと思います。
ここに私のパーサのコードは、これまでのところです:(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の配列としてそれらを返すために、アレイのルールの様々なビットにアクセスする方法を見つけ出すことができなかったということでした。