如何在语法中引用以前匹配的项目?

时间:2017-11-12 11:36:54

标签: grammar perl6

我正在尝试解析BibTeX作者字段,并将其拆分为单独的作者。这将帮助我重写每个作者的首字母。这是一个最小的例子:

use v6;

my $str = '{Rockhold, Mark L and Yarwood, RR and Selker, John S}';

grammar BibTexAuthor {
    token TOP {
        <all-text> 
    }
    token all-text {
        '{' <authors> '}' 
    }
    token authors { 
        [<author> [' and ' || <?before '}'>]]+
    }
    token author {
        [<-[\s}]> || [' ' <!before 'and '>]]+
    }
}

class BibTexAuthor-actions {
    method TOP($/) {
        say $/;
        print "First author = ";
        say $<author>.made[0];
        make $/.Str;
    }
    method all-text($/) {
        make $/.Str;
    }
    method authors($/) {
        make $/.Str;
    }
    method author($/) {
        make $/.Str;
    }
}
my $res = BibTexAuthor.parse( $str, actions => BibTexAuthor-actions.new).made;

输出

「{Rockhold, Mark L and Yarwood, RR and Selker, John S}」
 all-text => 「{Rockhold, Mark L and Yarwood, RR and Selker, John S}」
  authors => 「Rockhold, Mark L and Yarwood, RR and Selker, John S」
   author => 「Rockhold, Mark L」
   author => 「Yarwood, RR」
   author => 「Selker, John S」
First author = Nil

为什么我无法在TOP方法中提取第一位作者?

2 个答案:

答案 0 :(得分:4)

$<all-text><authors><author>[0];

请注意,我不知道语法到目前为止如何运作。我正在学习这门语言。

但是只要看一下数据结构,很容易就会发现它是一棵树,在那棵树里,你正在寻找的价值是什么。

您可以通过说

输出任何数据结构
dd $someStructure;
say $someStructure.perl;

如果您发现不可读,可以尝试其中一个Dumper Modules

答案 1 :(得分:4)

  

为什么我无法在TOP方法中提取第一位作者?

因为你并没有真正提取动作方法中的任何数据。你所要做的就是将匹配的字符串附加到$/.made,这实际上并不是你想要的数据。

如果您想最终拥有单独的作者,则make动作方法中应该authors一组作者。例如:

use v6;

my $str = '{Rockhold, Mark L and Yarwood, RR and Selker, John S}';

grammar BibTexAuthor {
    token TOP {
        <all-text> 
    }
    token all-text {
        '{' <authors> '}' 
    }
    token authors { 
        [<author> [' and ' || <?before '}'>]]+
    }
    token author {
        [<-[\s}]> || [' ' <!before 'and '>]]+
    }
}

class BibTexAuthor-actions {
    method TOP($/) {
        make { authors => $<all-text>.made };
    }
    method all-text($/) {
        make $/<authors>.made;
    }
    method authors($/) {
        make $/<author>».made;
    }
    method author($/) {
        make $/.Str;
    }
}
my $res = BibTexAuthor.parse( $str, actions => BibTexAuthor-actions.new).made;

say $res.perl;

打印

${:authors($["Rockhold, Mark L", "Yarwood, RR", "Selker, John S"])}

所以现在顶级匹配的.made是一个哈希,其中authors键包含一个数组。如果您想访问第一位作者,现在可以说

say $res<authors>[0];

获取Rockhold, Mark L