Я создал простую программу на основе примера Raku parsefile
, представленного здесь. Содержимое моего файла Raku:
grammar Names {
token TOP { [<name><.ws>]+ }
token name { <:alpha>+ }
}
say Names.parsefile('names.txt');
Содержимое name.txt приведено ниже:
Andrea
John
Запуск этой минимальной программы указывает на успешный анализ:
「Andrea
John
」
name => 「Andrea」
name => 「John」
Если я теперь добавлю что-то, что не будет анализироваться токеном name
(т. е. 99999999
):
Andrea
99999999
John
...запуск программы выводит только Nil
. Есть ли способ изменить программу, чтобы я мог обнаружить, что «Андреа» и «Джон» были успешно проанализированы токеном name
?
Вероятно, в вашем случае лучше использовать comb
, match
или contains
.
my token name { <:alpha>+ };
say './raku/names.txt'.IO.comb(/<name>/);
say slurp('./raku/names.txt').match(/<name>/,:g);
say './raku/names.txt'.IO.words.grep: *.contains: /^<name>$/;
(Andrea John)
(「Andrea」
name => 「Andrea」 「John」
name => 「John」)
(Andrea John)
Если вы действительно хотите grammar
, вы можете переопределить <ws>
.
grammar Names {
rule TOP { ^ <name> + }
token name { <:alpha>+ }
token ws { <-alpha>* }
#or more general token ws { [<!before <name>>.]* }
}
say Names.parsefile: './raku/names.txt';
「Andrea
99999999
John
」
name => 「Andrea」
name => 「John」
потрясающий ответ, кстати