将 BibTeX 作者字段拆分为多个部分

Split a BibTeX author field into parts

我正在尝试使用以下语法解析 BibTeX 作者字段:

use v6;
use Grammar::Tracer;

# Extract BibTeX author parts from string. The parts are separated
# by a comma and optional space around the comma
grammar Author {
    token TOP {
        <all-text> 
    }
    token all-text {
        [<author-part> [[\s* ',' \s*] || [\s* $]]]+ 
    }
    token author-part { 
        [<-[\s,]> || [\s* <!before ','>]]+
    }
}

my $str = "Rockhold, Mark L";
my $result = Author.parse( $str );
say $result;

输出:

TOP
|  all-text
|  |  author-part
|  |  * MATCH "Rockhold"
|  |  author-part

但是程序在这里挂起(我必须按 CTRL-C)才能中止。 我怀疑问题与否定前瞻断言有关。我试图删除它,然后程序不再挂起,但是我也无法使用内部 space.

提取最后一部分 "Mark L"

请注意,出于调试目的,上面的 Author 语法是我实际程序中使用的语法的简化版本。

表达式[\s* <!before ','>]可能没有任何进展。由于它在量词中,它会一次又一次地重试(但不会继续),导致观察到挂起。

这样的构造将可靠地挂在字符串的末尾;做 [\s* <!before ',' || $>] 通过使前瞻在字符串末尾也失败来修复它(在字符串末尾是不在 , 之前的有效方法)。

至少对于这个简单的示例,看起来整个 author-part 标记可能只是 <-[,]>+,但对于从中减少的实际问题来说,这可能过于简单化了。

扫一眼 all-text,我还要指出 % quantifier modifier 这使得匹配 comma-separated(或 anything-separated,真的)变得更容易。