Treetop: анализ одного узла возвращает ноль - PullRequest
1 голос
/ 18 мая 2010

Я пытаюсь понять основы синтаксического анализа 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.

Что я пропустил?

1 Ответ

1 голос
/ 18 мая 2010

Понял! Хотя я обычно удаляю этот вопрос, я не удивлюсь, если кто-то еще также фундаментально не поймет 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
...