加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:23:47 所属栏目:大数据 来源:网络整理
导读:我开始编写BibTeX解析器.我想做的第一件事是解析一个支撑项目.例如,支撑项可以是作者字段或标题.字段中可能有嵌套的大括号.以下代码不处理嵌套大括号: use v6;my $str = q:to/END/; author={Belayneh,M. and Geiger,S. and Matth{"{a}}i,S.K.},END$str .=
我开始编写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,?
 braced-item => ?{Belayneh,S. and Matth{"{a}?

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

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

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

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

解决方法

如果不知道你想要的结果数据,我会改变它看起来像这样:

my $str = ?author={Belayneh,?;

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

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

ExtractBraced.parse( $str ).say;
?author={Belayneh,?
 author => ?{Belayneh,S.K.}?

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

my $str = ?author={Belayneh,?;

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,S.K.}?
  braced-part => ?Belayneh,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,S. and Matth"ai,S.K.

请注意,on< - [{}]>是一个优化,以及<之前'{'>,两者都可以省略,它仍然可以工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读