相关疑难解决方法(0)

令牌和规则之间的真正区别是什么?

我被 Raku 所吸引是因为它的内置语法,并认为我会玩弄它并编写一个简单的电子邮件地址解析器,唯一的问题是:我无法让它工作。

在找到真正有效的东西之前,我尝试了无数次迭代,但我很难理解为什么。

它归结为,正在更改tokenrule

这是我的示例代码:

grammar Email {
  token TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }  
  token name { \w+ ['.' \w+]* }
  token domain { \w+ }
  token subdomain { \w+ }
  token tld { \w+ }
}
say Email.parse('foo.bar@baz.example.com');
Run Code Online (Sandbox Code Playgroud)

不起作用,它只是打印Nil,但是

grammar Email {
  rule TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }  
  token name { \w+ ['.' \w+]* }
  token domain { \w+ }
  token subdomain …
Run Code Online (Sandbox Code Playgroud)

grammar raku

16
推荐指数
2
解决办法
377
查看次数

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

我开始编写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
查看次数

如何在语法中引用先前匹配的项目?

我正在尝试解析 BibTeX 作者字段,并将其拆分为单独的作者。这将帮助我重写每个作者的姓名首字母。这是一个最小的例子:

use v6;

my $str = '{Rockhold, Mark L and Yarwood, RR and Selker, John S}';

grammar BibTexAuthor {
    token TOP {
        <all-text> 
    }
    token all-text {
        '{' <authors> '}' 
    }
    token authors { 
        [<author> [' and ' || <?before '}'>]]+
    }
    token author {
        [<-[\s}]> || [' ' <!before 'and '>]]+
    }
}

class BibTexAuthor-actions {
    method TOP($/) {
        say $/;
        print "First author = ";
        say $<author>.made[0];
        make $/.Str;
    }
    method all-text($/) {
        make $/.Str;
    } …
Run Code Online (Sandbox Code Playgroud)

grammar raku

3
推荐指数
1
解决办法
131
查看次数

标签 统计

grammar ×3

raku ×3

perl6 ×1