Вопрос

Я пытаюсь получить базовый анализ 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