当前位置: 首页 > 知识库问答 >
问题:

使用语法分析可能嵌套的大括号项

汪永春
2023-03-14

我开始编写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}」

现在,为了让解析器接受嵌套的大括号,我想保留一个计数器,记录当前解析的开始大括号的数量,当遇到结束大括号时,我们减少计数器。如果计数器达到零,我们假设已解析完整项。

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

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

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

共有1个答案

鞠通
2023-03-14

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

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.

注意上的

 类似资料:
  • 尽管我在编译/解析方面的知识有限,但我还是敢于为OData$filter表达式构建一个小型递归下降解析器。解析器只需要检查表达式的正确性,并在SQL中输出相应的条件。由于输入和输出具有几乎相同的标记和结构,这相当简单,我的实现实现了我想要的90%。 但是现在我被括号卡住了,括号出现在逻辑表达式和算术表达式的不同规则中。ABNF中的完整OData语法在这里,所涉及的规则的精简版本如下: 这个语法如何

  • 我想将带有嵌套大括号的原始字符串解析为多维数组。下面我添加了一些有效的示例代码。但主要问题是,我的正则表达式只捕获第一个匹配的组,而忽略了另一个发生。 非常感谢您的帮助。 代码: 原始字符串(data.txt): 代码输出: 但例外输出:

  • 本文向大家介绍浅析python 中大括号中括号小括号的区分,包括了浅析python 中大括号中括号小括号的区分的使用技巧和注意事项,需要的朋友参考一下 python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ }。其作用也各不相同,分别用来代表不同的python基本内置数据类型。 1.python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列

  • 我使用Elasticsearch 2.3-Nest API来搜索数据。我正在为文档使用属性映射。我想知道如何使用语音分析器使用属性映射。 文档类: 索引创建和插入: ESMapper仅用于从一种类型转换为另一种类型。 结果映射: 我还安装了语音分析插件

  • 我想在像这样的文本中插入()并将它们放入数组中,但里面可能有一些嵌套的括号。 文本: 应该这样处理: 我怎么能这么做?

  • 我在看stackoverflow的另一页时,遇到了一个循环排序的工作实现,但我不明白在while循环中,带分号的语句如何在大括号之前存在。我认为while循环应该完全终止,一旦找到带有分号的语句,就不会执行进一步的操作,那么大括号中的代码是如何执行的呢?乍一看,我会将其解释为“var”随着while循环的每次迭代而递增——但我知道情况并非如此,因为将其从该点移除并将“var”放在花括号内会导致无限