1

我正在尝试了解 Treetop 解析的基础知识。这是一个非常简单的语法,所以我可以说ArithmeticParser.parse('2+2').value == 4

grammar Arithmetic
  rule additive
    first:number '+' second:number {
      def value
        first.value + second.value
      end
    }
  end

  rule number
    [1-9] [0-9]* {
      def value
        text_value.to_i
      end
    }
  end
end

解析2+2工作正常,返回一个节点。但是,解析222返回nil.

我错过了什么?

4

1 回答 1

1

知道了!虽然我通常会删除这个问题,但如果其他人也从根本上误解了 Treetop,我不会感到惊讶,所以我将把它留在这里以供参考。

Treetop 不只是通过规则,寻找适用的规则。相反,它从第一条规则开始,如果第一条规则不匹配,则必须强制考虑替代方案。因此,/ number必须出现在additive规则的末尾。

grammar Arithmetic
  rule additive
    first:number '+' second:number {
      def value
        first.value + second.value
      end
    }
    / number
  end

  rule number
    [1-9] [0-9]* {
      def value
        text_value.to_i
      end
    }
  end
end
于 2010-05-18T16:08:13.050 回答