Treetop игнорирует правила грамматики

Кажется, что Treetop игнорирует правила turther после первого и не может проанализировать все, что не соответствует первому правилу в файле грамматики. Я уже пробовал менять местами порядок правил, но все равно считается только первое.

# grammar_pov.treetop
grammar Pov
    rule numeric
        '-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral>
    end
    rule comma
        ','
    end
    rule space
        [\s]+
    end
end

Этот файл грамматики соответствует всем целым числам и числам с плавающей запятой, но не соответствует «123, 456» или «123 456».

Я что-то упускаю?


person paul.ago    schedule 22.09.2013    source источник


Ответы (2)


Как упоминал Йорг, вам нужно использовать правила comma и space в грамматике. Я построил простой пример того, что, как я думаю, вы пытаетесь выполнить ниже. Он должен соответствовать "100", "1,000", "1,000,000" и т. д.

Если вы посмотрите на числовое правило, сначала я проверяю знак вычитания '-'?, затем я проверяю от одной до трех цифр, затем я проверяю ноль или более комбинаций comma и трех цифр.

require 'treetop'
Treetop.load_from_string DATA.read

parser = PovParser.new

p parser.parse('1,000,000')

__END__
grammar Pov
   rule numeric
      '-'? digit 1..3 (comma space* (digit 3..3))*
   end

   rule digit
      [0-9]
   end

   rule comma
      ','
   end

   rule space
      [\s]
   end
end
person Josh Voigts    schedule 25.09.2013
comment
Не за что, рад, что смог помочь :) - person Josh Voigts; 08.10.2013

Ваши правила comma и space нигде не используются. Так что это просто мертвый код.

person Jörg W Mittag    schedule 22.09.2013
comment
Можете ли вы уточнить? Разве правило запятой не должно соответствовать «123 456» и «123 456»? - person paul.ago; 23.09.2013
comment
Нет, правило comma соответствует правилу ',' и ничему другому. Но это в любом случае совершенно не важно, потому что правило даже нигде не используется. Это то же самое, что определить подпрограмму и никогда не вызывать ее. - person Jörg W Mittag; 24.09.2013