我正在尝试获取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 正常工作,返回节点。但是,解析 2 或者 22 返回 nil.

我错过了什么?

有帮助吗?

解决方案

知道了!尽管我通常会删除这个问题,但如果其他人也从根本上误解了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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top