質問

私は(私はと思われるもの)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の配列としてそれらを返すために、アレイのルールの様々なビットにアクセスする方法を見つけ出すことができなかったということでした。

役に立ちましたか?

解決

たぶん、パーサジェネレータは、この場合には過剰です。ここではジェームズ・エドワード・グレイII にすることで、このJSONパーサーnoreferrer">

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top