相关疑难解决方法(0)

如何在 Raku 中使用匹配的分隔符

我正在尝试编写一个令牌,允许使用匹配的分隔符嵌套内容。如果不是“(AB)”,则 (AB) 应至少匹配“AB”。并且 (A(c)B) 将返回两个匹配项“(A(c)B)”,依此类推。

代码从其来源归结为:

#!/home/hsmyers/rakudo741/bin/perl6
use v6d;

my @tie;

class add-in {
    method tie($/) { @tie.push: $/; }
}

grammar tied {
    rule TOP { <line>* }
    token line {
        <.ws>?
        [
            | <tie>
            | <simpleNotes>
        ]+
        <.ws>?
    }
    token tie {
        [
            || <.ws>? <simpleNotes>+ <tie>* <simpleNotes>* <.ws>?
            || <openParen> ~ <closeParen> <tie>
        ]+
    }
    token openParen { '(' }
    token closeParen { ')' }
    token simpleNotes {
        [
            | <[A..Ga..g,'>0..9]>
            | <[|\]]>
            | <blank>
        ]
    } …
Run Code Online (Sandbox Code Playgroud)

grammar raku

5
推荐指数
1
解决办法
110
查看次数

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

我开始编写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;
Run Code Online (Sandbox Code Playgroud)

输出:

?author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},?
 braced-item => ?{Belayneh, M. and Geiger, S. and Matth{\"{a}?
Run Code Online (Sandbox Code Playgroud)

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

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

grammar ExtractBraced {
    rule TOP {
        'author=' <braced-item> .*
    }
    rule braced-item      { …
Run Code Online (Sandbox Code Playgroud)

grammar perl6 raku

4
推荐指数
1
解决办法
129
查看次数

标签 统计

grammar ×2

raku ×2

perl6 ×1