Рассмотрим грамматику:
TOP ⩴ 'x' Y 'z'
Y ⩴ 'y'
Вот как получить точное значение ["TOP","x",["Y","y"],"z"]
с различными синтаксическими анализаторами (не написанными вручную, но сгенерированными из грамматики):
xyz__Parse-Eyapp.eyp
%strict
%tree
%%
start:
TOP { shift; use JSON::MaybeXS qw(encode_json); print encode_json $_[0] };
TOP:
'x' Y 'z' { shift; ['TOP', (scalar @_) ? @_ : undef] };
Y:
'y' { shift; ['Y', (scalar @_) ? @_ : undef] };
%%
xyz__Regexp-Grammars.pl
use 5.028;
use strictures;
use Regexp::Grammars;
use JSON::MaybeXS qw(encode_json);
print encode_json $/{TOP} if (do { local $/; readline; }) =~ qr{
<nocontext:>
<TOP>
<rule: TOP>
<[anon=(x)]> <[anon=Y]> <[anon=(z)]>
<MATCH=(?{['TOP', $MATCH{anon} ? $MATCH{anon}->@* : undef]})>
<rule: Y>
<[anon=(y)]>
<MATCH=(?{['Y', $MATCH{anon} ? $MATCH{anon}->@* : undef]})>
}msx;
Код исключен для следующих двух анализаторов,С Pegex функциональность достигается путем наследования от Pegex :: Receiver .С Marpa-R2 настройка возвращаемого значения довольно ограничена , но вложенные массивы возможны из коробки с опцией конфигурации.
Я продемонстрировал, что желаемая настройка возможна, хотя это не всегда легко или просто.Эти фрагменты кода, прикрепленные к правилам, запускаются при сборке дерева.
Метод parse не возвращает ничего, кроме вложенных объектов Match, которые являются громоздкими.Они не сохраняют безымянные терминалы!(Просто чтобы убедиться, о чем я говорю: это две части данных в RHS правила TOP
, значения которых 'x'
и 'z'
.) Видимо, добавляются только данные, возникающие из именованных деклараторов.к дереву.
Назначение переменной соответствия (аналогично тому, как она работает в Regexp-Grammars), похоже, не имеет никакого эффекта.Поскольку терминалы не попадают в переменную сопоставления, действия тоже не помогают.
В итоге, вот грамматика и обычное значение анализа:
grammar {rule TOP { x <Y> z }; rule Y { y };}.parse('x y z')
Как вы получаете значение ["TOP","x",["Y","y"],"z"]
из него?Вы не можете изменять форму правил, потому что это может испортить семантику, присоединенную пользователем, иначе все остальное будет честной игрой.Я все еще думаю, что ключом к решению является переменная соответствия, но я не понимаю, как.