我仍在学习perl6,并且正在阅读此页面上的语法示例:http://examples.perl6.org/categories/parsers/SimpleStrings.html;我已经多次阅读了有关正则表达式的文档,但是仍然有些语法我不理解。谁能启发我?非常感谢!!!
token string { <quote> {} <quotebody($<quote>)> $<quote> }
问题1:令牌中的“ {}”在做什么?捕获标记为<()>,嵌套结构为tilda'('〜')';但是{}是什么?
token quotebody($quote) { ( <escaped($quote)> | <!before $quote> . )* }
问题2a:<>中的转义($ quote)将是一个正则表达式函数,对吗?并以$ quote作为参数并返回另一个正则表达式?
问题2b:如果我想表示“不在报价前的字符”,我应该使用“。<!before $ quote>”而不是“ <!before $ quote>”。 ??
token escaped($quote) { '\\' ( $quote | '\\' ) } # I think this is a function;
非常感谢您!
lisprog
答案 0 :(得分:8)
{}
是一个空代码块。这是语法的程序性元素(而非声明性元素)。您可以在其中放置常规的Perl 6代码以使其执行某些操作。
在这种模式下,它正在执行另一项工作。它提供了一个顺序点,语法引擎知道该顺序点需要做各种事情才能继续。这包括填写捕获变量的值(例如$<quote>
)。模式的下一部分需要确保$<quote>
具有其值,因此它需要一些东西来确保该值可用。
$<quote>
实际上是对Match对象$/
的单个元素访问。作为一种类似散列的事物,实际上是$/<quote>
,其中尖括号之间的事物是“关键”。 Perl 6有点聪明,因此可以让您离开/
而获得$<quote>
。其他匹配变量,例如$1
也是类似的快捷方式。
对于您的最后一个问题,这将有助于查看您尝试匹配的一些示例数据。 Perl 6 Grammars具有许多功能来匹配平衡文本,这可能会使任务变得微不足道。例如,请参见Tilde for nesting structures中的Regexp documentation:
/ '(' ~ ')' <expression> /
这是REPL中的一个简短示例。有一个带引号的字符串:
$ perl6
To exit type 'exit' or '^D'
> my $s = Q/abcdf "Hello" xyz/
abcdf "Hello" xyz
正则表达式中的~
位于定界符之间。结束定界符之后的内容是您期望~
所在的内容:
> $s ~~ m/ '"' ~ '"' .+ /
「"Hello"」
您可以匹配开始的东西并捕获它(现在它在$0
中),因此您可以使用与结束定界符完全相同的东西:
> $s ~~ m/ (<["']>) ~ $0 .+ /
「"Hello"」
0 => 「"」
对于that particular example,我认为有一种更简单的方法。匹配转义的引号或任何非引号而不是环顾四周和任何字符。那不尽如人意。