2010-12-22 3 views
1

Я определил простую грамматику для синтаксического анализа строки и числа, используя Treetop, как показано ниже.Treetop ruby ​​parser - не удалось разобрать Упорядоченный выбор

grammar Simple 
    rule value 
     number/string 
    end 

    rule string 
     word space string 
     /
     word 
    end 

    rule word 
     [0-9a-zA-Z]+ 
    end 

    rule number 
     [1-9] [0-9]* 
    end 

    rule space 
     ' '+ 
    end 
end 

Ruby:

parser = SimpleParser.new 
parser.parse('123abc wer') # => nil 

Я ожидаю, что синтаксический анализатор для возврата струнного узла но выглядит как синтаксический анализатор не мог понять вход. Любая идея была бы оценена.

ответ

4

В Treetop (и PEG в целом, фактически) оператор выбора заказал, в отличие от большинства других формальных формализаций.

Так, в

rule value 
    number/string 
end 

вы говорите, что вы Treetop предпочитаютnumber над string.

Ваш вход начинается с 1, который соответствует какnumber и string (через word), но вы сказали Treetop предпочесть number интерпретацию, поэтому он разбирает его как number. Когда дело доходит до a на входе, у него больше нет правил для применения, и поэтому он ничего не возвращает (nil), потому что в Treetop это ошибка, чтобы не потреблять весь входной поток.

Если вы просто изменить порядок выбора, весь вход будет истолкован как вместо него string из number:

SyntaxNode+String0 offset=0, "123abc wer" (word,space,string): 
    SyntaxNode offset=0, "123abc": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "2" 
    SyntaxNode offset=2, "3" 
    SyntaxNode offset=3, "a" 
    SyntaxNode offset=4, "b" 
    SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
    SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
    SyntaxNode offset=7, "w" 
    SyntaxNode offset=8, "e" 
    SyntaxNode offset=9, "r" 

Или вы могли бы сохранить порядок, как это, но разрешить value правила для согласования несколько раз. Либо вставить новое правило верхнего уровня, как это:

rule values 
    value+ 
end 

или модифицировать value правило так:

rule value 
    (number/string)+ 
end 

Который даст вам AST примерно так:

SyntaxNode offset=0, "123abc wer": 
    SyntaxNode+Number0 offset=0, "123": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "23": 
     SyntaxNode offset=1, "2" 
     SyntaxNode offset=2, "3" 
     SyntaxNode+String0 offset=3, "abc wer" (word,space,string): 
     SyntaxNode offset=3, "abc": 
      SyntaxNode offset=3, "a" 
      SyntaxNode offset=4, "b" 
     SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
     SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
     SyntaxNode offset=7, "w" 
     SyntaxNode offset=8, "e" 
     SyntaxNode offset=9, "r" 
+0

Спасибо Jörg, Да, вы правы. Я предпочитаю сопоставлять число с строкой в ​​правиле значения. И как я могу «разрешить соответствие правила ценности несколько раз»? Чтобы получить приведенный выше пример работы. – lchanmann

+0

@mann: Операторы повторения в Treetop являются '+' и '*' с похожим значением, как в 'Regexp'. Подробнее см. В разделе «Редактирование». –

+0

@Clifford в Treetop Development google group предлагает использовать «!». для соответствия EOF, поэтому после изменения правила количества на «[1-9] [0-9]!». теперь я могу отлично сочетать число и строку. спасибо Йоргу! – lchanmann

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

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