В 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"
Спасибо Jörg, Да, вы правы. Я предпочитаю сопоставлять число с строкой в правиле значения. И как я могу «разрешить соответствие правила ценности несколько раз»? Чтобы получить приведенный выше пример работы. – lchanmann
@mann: Операторы повторения в Treetop являются '+' и '*' с похожим значением, как в 'Regexp'. Подробнее см. В разделе «Редактирование». –
@Clifford в Treetop Development google group предлагает использовать «!». для соответствия EOF, поэтому после изменения правила количества на «[1-9] [0-9]!». теперь я могу отлично сочетать число и строку. спасибо Йоргу! – lchanmann