2013-09-22 4 views
0

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

# 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» или «123456» Свойства парсера failure_reason говорит, что это «ожидаемое - в строке 1, столбец 1 (байты 1) после '

Я что-то не хватает?

ответ

0

Как указано в Jörg, вам необходимо использовать правила 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 
+0

Что это хороший пример, спасибо! –

+0

Без проблем, рад, что я мог бы помочь :) –

1

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

+0

Можете ли вы уточнить? Должно ли правило запятой соответствовать «123,456» и «123, 456»? –

+0

Нет, правило 'comma' соответствует' ',' 'и ничего больше. Но это все равно не имеет значения, потому что правило даже не используется. Это то же самое, что и определение подпрограммы и никогда ее не назовешь. –

 Смежные вопросы

  • Нет связанных вопросов^_^