Treetop忽略语法中定义的方法

时间:2013-10-22 15:57:40

标签: ruby treetop

我正试图用树梢解析一个百分比。我写了以下语法:

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生成的代码时,它为百分比节点创建了两个模块,其余的代码中只使用了其中一个:

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上的decimal方法工作正常(也是两个模块,但两者都用于扩展节点)。我找不到它的定义有什么不同,这导致了这一点。

1 个答案:

答案 0 :(得分:1)

我认为您只需要从根规则中删除括号。

此外,对于小数规则,您应该在小数点后使用+而不是*;你在那里至少想要一个号码。

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