2

ツリートップでパーセンテージを解析しようとしています。私は次の文法を書きました:

grammar Numerals
  rule percentage
    (decimal "%") {
      def to_f
        decimal.to_f / 100
      end
    }
  end

  rule decimal
    sign [0-9]+ '.' [0-9]* {
      def to_f
        text_value.to_f
      end
    }
  end

  rule sign
    ('+'/'-')? 
  end
end

これは正しく一致しますが、何らかの理由でto_fルート ノードのメソッドが結果に含まれていません。

tt によって生成されたコードを確認したところ、パーセンテージ ノード用に 2 つのモジュールが作成されており、そのうちの 1 つだけが残りのコードで使用されていました。

module Percentage0
  def decimal
    elements[0]
  end
end

module Percentage1
  def to_f
    decimal.to_f / 100
  end
end

Percentage1 はコード内の他の場所には表示されませんが、Percentage0 は正しいノードで使用されます。

r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
r0.extend(Percentage0)

一方、to_fメソッド onは正常にdecimal動作します (これも 2 つのモジュールですが、両方ともノードを拡張するために使用されます)。その定義の違いがわかりません。それが原因です。

4

1 に答える 1