【问题标题】:Treetop ignores methods defined in grammarTreetop 忽略语法中定义的方法
【发布时间】:2013-10-22 15:57:40
【问题描述】:

我正在尝试使用树顶解析百分比。我写了以下语法:

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)

另一方面,decimal 上的 to_f 方法工作正常(也是两个模块,但都用于扩展节点)。我找不到它的定义有什么不同,导致了这种情况。

【问题讨论】:

    标签: ruby treetop


    【解决方案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
    

    【讨论】:

    • 删除括号有帮助。你能解释一下,为什么这些会导致模块不被使用?
    • 我真的不确定。这对我来说似乎也是一个谜。它可能与它是根节点的事实有关?我知道如果没有它,语法节点似乎会有所不同。
    • 括号内和括号外都可以有一个模块,但外面的模块永远不会被扩展。这是 Treetop 编译器中的一个已知错误。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多