【发布时间】:2021-03-17 03:43:23
【问题描述】:
我正在尝试编写一个 Raku 语法,它可以解析要求编程难题的命令。
这是仅针对我的问题的简化版本,但命令结合了难度级别和可选的语言列表。
有效输入示例:
- 无语言:
easy - 一种语言:
hard javascript - 多种语言:
medium javascript python raku
我可以让它匹配一种语言,但不能匹配多种语言。我不确定在哪里添加:g。
这是我目前所拥有的一个例子:
grammar Command {
rule TOP { <difficulty> <languages>? }
token difficulty { 'easy' | 'medium' | 'hard' }
rule languages { <language>+ }
token language { \w+ }
}
multi sub MAIN(Bool :$test) {
use Test;
plan 5;
# These first 3 pass.
ok Command.parse('hard', :token<difficulty>), '<difficulty> can parse a difficulty';
nok Command.parse('no', :token<difficulty>), '<difficulty> should not parse random words';
# Why does this parse <languages>, but <language> fails below?
ok Command.parse('js', :rule<languages>), '<languages> can parse a language';
# These last 2 fail.
ok Command.parse('js', :token<language>), '<language> can parse a language';
# Why does this not match both words? Can I use :g somewhere?
ok Command.parse('js python', :rule<languages>), '<languages> can parse multiple languages';
}
即使我的测试 #4 失败,这也有效:
my token wrd { \w+ }
'js' ~~ &wrd; #=> 「js」
使用这种语法提取多种语言可以使用正则表达式,但我不确定如何在语法中使用它:
'js python' ~~ m:g/ \w+ /; #=> (「js」 「python」)
另外,是否有一种理想的方法可以使订单不重要,以便difficulty 可以出现在字符串中的任何位置?示例:
rule TOP { <languages>* <difficulty> <languages>? }
理想情况下,我希望将不是difficulty 的任何内容都读取为language。示例:raku python medium js 应将medium 读作difficulty,其余读作languages。
【问题讨论】:
标签: raku