【发布时间】:2020-07-04 11:59:36
【问题描述】:
我想捕捉nested structure 的内部。
my $str = "(a)";
say $str ~~ /"(" ~ ")" (\w) /;
say $str ~~ /"(" ~ ")" <(\w)> /;
say $str ~~ /"(" <(~)> ")" \w /;
say $str ~~ /"(" <(~ ")" \w /;
第一个有效;最后一个有效,但也捕获了右括号。另外两个失败了,所以在这种情况下不能使用捕获标记。但是在语法的上下文中问题更复杂,因为捕获组似乎也不起作用,就像这里:
# Please paste this together with the code above so that it compiles.
grammar G {
token TOP {
'(' ~ ')' $<content> = .+?
}
}
grammar H {
token TOP {
'(' ~ ')' (.+?)
}
}
grammar I {
token TOP {
'(' ~ ')' <( .+? )>
}
}
$str = "(one of us)";
for G,H,I -> $grammar {
say $grammar.parse( $str );
}
由于捕获分组或capture markers 似乎都不起作用,除非它被动态分配给变量。但是,这会创建一个我非常想避免的额外令牌。 所以有两个问题
- 使捕获标记在嵌套结构中起作用的正确方法是什么?
- 有没有办法使用捕获组或捕获标记中的标记来获取嵌套结构的内部?
【问题讨论】:
-
这种情况有什么可怕的......你不知道问题,所以看起来有点多?另外,您是否尝试过运行发布的代码以查看它是否可以编译(它没有)?不管怎样,你的语法我应该是
'(' ~ ')' [<( .+? )>] -
它是分裂的;如果您将它们一起发布,则可以。为澄清而添加。另外,为什么这里需要使用非捕获石斑鱼?