gpt4 book ai didi

grammar - 使用语法解析可能嵌套的支撑项

转载 作者:行者123 更新时间:2023-12-02 16:09:12 25 4
gpt4 key购买 nike

我开始编写 BibTeX 解析器。我想做的第一件事是解析支撑项。例如,大括号项目可以是作者字段或标题。字段内可能存在嵌套大括号。以下代码处理嵌套大括号:

use v6;

my $str = q:to/END/;
author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},
END

$str .= chomp;

grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { '{' <-[}]>* '}' }
}

ExtractBraced.parse( $str ).say;

输出:

「author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},」
braced-item => 「{Belayneh, M. and Geiger, S. and Matth{\"{a}」

现在,为了使解析器接受嵌套大括号,我想保留当前解析的左大括号数量的计数器,并且当遇到右大括号时,我们递减计数器。如果计数器达到零,我们假设我们已经解析了完整的项目。

为了遵循这个想法,我尝试拆分 braced-item 正则表达式,以对每个字符实现语法操作。 (下面的 braced-item-char 正则表达式上的操作方法应该处理大括号计数器):

grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { '{' <braced-item-char>* '}' }
rule braced-item-char { <-[}]> }
}

但是,现在解析突然失败了。可能是一个愚蠢的错误,但我不明白为什么它现在会失败?

最佳答案

在不知道您希望结果数据如何显示的情况下,我会将其更改为如下所示:

my $str = 「author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},」;

grammar ExtractBraced {
token TOP {
'author='
$<author> = <.braced-item>
.*
}
token braced-item {
'{' ~ '}'

[
|| <- [{}] >+
|| <.before '{'> <.braced-item>
]*
}
}

ExtractBraced.parse( $str ).say;
「author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},」
author => 「{Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.}」

如果你想要更多的结构,它可能看起来更像这样:

my $str = 「author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},」;

grammar ExtractBraced {
token TOP {
'author='
$<author> = <.braced-item>
.*
}
token braced-part {
|| <- [{}] >+
|| <.before '{'> <braced-item>
}
token braced-item {
'{' ~ '}'
<braced-part>*
}
}

class Print {
method TOP ($/){
make $<author>.made
}
method braced-part ($/){
make $<braced-item>.?made // ~$/
}
method braced-item ($/){
make [~] @<braced-part>».made
}
}


my $r = ExtractBraced.parse( $str, :actions(Print) );
say $r;
put();
say $r.made;
「author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},」
author => 「{Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.}」
braced-part => 「Belayneh, M. and Geiger, S. and Matth」
braced-part => 「{\"{a}}」
braced-item => 「{\"{a}}」
braced-part => 「\"」
braced-part => 「{a}」
braced-item => 「{a}」
braced-part => 「a」
braced-part => 「i, S.K.」

Belayneh, M. and Geiger, S. and Matth\"ai, S.K.

请注意 +<-[{}]>+是一种优化,以及<before '{'> ,两者都可以省略,它仍然有效。

关于grammar - 使用语法解析可能嵌套的支撑项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com