* } rule article { '@article{' $=<-[,]>+ ',' '}' } rule kv-pairs { * % ',' } rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* } } ``` 有了这个语法之后,我们现在可以编写如下内容: ``` die "Maybe use Grammar::Tracer?" unless bib.parsefile: 'derm.bib'; for $ { say . ~ ': ' ~ .[0] ~ "\n" } ``` 生成与早期“高级用户”和“基本Perl 6”解决方案完全相同的输出-但使用语法/解析器方法。 Bib语法的说明 `# use Grammar::Tracer;` 如果解析失败,则返回值为Nil。P6不会告诉您距离有多远。您将没有零头绪来解释为什么解析失败。 如果没有更好的选择(?),则当语法失败时,use Grammar::Tracer可以帮助调试(如果尚未安装,请先安装)。 grammar bib { 该grammar关键字是一样class的,但语法可以不仅包含名为methodS作为平时也称为regexS,tokens和rule秒。 rule TOP { 除非你指定,解析程序通过调用开始时rule(或token,regex或method)命名TOP。 根据经验,呃,规则,如果你不知道你应该使用rule,regex,token,或method解析的某些位,使用token。(与regex模式不同,tokens不会回溯,因此它们消除了由于回溯而不必要地缓慢运行的风险。) 但是在这种情况下,我使用了rule。像token模式一样,rule也避免回溯。但是此外,它们以自然方式将跟随模式中任何原子的空白视为有效。这通常适合于解析树的顶部。(令牌和偶尔的正则表达式通常适合于叶子。) rule TOP { * } 规则末尾的空格表示语法将匹配输入末尾的任意数量的空格。 在此语法中调用另一个命名规则(或令牌/正则表达式/方法)。 由于看起来每个bib文件中应允许包含任意数量的文章,因此我在的末尾添加了*(零个或多个)*。 ``` rule article { '@article{' $=<-[,]>+ ',' '}' } ``` 有时我会制定规则,使其类似于典型输入的外观。我试图在这里这样做。 <[...]>是字符类的P6语法,就像[...]传统的regex语法一样。它功能更强大,但现在您只需要知道-in <-[,]>表示取反,即与^in ye olde [^,]语法相同。因此,<-[,]>+尝试匹配一个或多个字符,都不是,。 $=<-[,]>+告诉P6尝试匹配=(<-[,]>+即位)右侧的量化原子并将结果存储'id'在当前Match对象内的键处。后者将挂在解析树的一个分支上;我们稍后会精确到达。 ` rule kv-pairs { * % ',' }` 此正则表达式代码说明了几种方便的P6正则表达式功能之一。它表示您要匹配零个或多个以逗号分隔的kv-pair s 。 (更详细地讲,%正则表达式中缀运算符要求其左侧的量化原子的匹配被其右侧的原子分隔。) ` rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* }` 这里的新位是'={' ~ '}'。这是另一个方便的正则表达式功能。该正则表达式代字号操作者解析(在这种情况下,一个具有一个定界的结构={开启器和}更近)具有匹配的上越靠近右侧的量化正则表达式原子分隔符之间的比特。这具有多种好处,但主要的好处是错误消息可以更加清晰。 解析树的构造/解构的说明 最后一行()中的$和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
{ say . ~ ': ' ~ .[0] ~ "\n" } ``` 生成与早期“高级用户”和“基本Perl 6”解决方案完全相同的输出-但使用语法/解析器方法。 Bib语法的说明 `# use Grammar::Tracer;` 如果解析失败,则返回值为Nil。P6不会告诉您距离有多远。您将没有零头绪来解释为什么解析失败。 如果没有更好的选择(?),则当语法失败时,use Grammar::Tracer可以帮助调试(如果尚未安装,请先安装)。 grammar bib { 该grammar关键字是一样class的,但语法可以不仅包含名为methodS作为平时也称为regexS,tokens和rule秒。 rule TOP { 除非你指定,解析程序通过调用开始时rule(或token,regex或method)命名TOP。 根据经验,呃,规则,如果你不知道你应该使用rule,regex,token,或method解析的某些位,使用token。(与regex模式不同,tokens不会回溯,因此它们消除了由于回溯而不必要地缓慢运行的风险。) 但是在这种情况下,我使用了rule。像token模式一样,rule也避免回溯。但是此外,它们以自然方式将跟随模式中任何原子的空白视为有效。这通常适合于解析树的顶部。(令牌和偶尔的正则表达式通常适合于叶子。) rule TOP { * } 规则末尾的空格表示语法将匹配输入末尾的任意数量的空格。 在此语法中调用另一个命名规则(或令牌/正则表达式/方法)。 由于看起来每个bib文件中应允许包含任意数量的文章,因此我在的末尾添加了*(零个或多个)*。 ``` rule article { '@article{' $=<-[,]>+ ',' '}' } ``` 有时我会制定规则,使其类似于典型输入的外观。我试图在这里这样做。 <[...]>是字符类的P6语法,就像[...]传统的regex语法一样。它功能更强大,但现在您只需要知道-in <-[,]>表示取反,即与^in ye olde [^,]语法相同。因此,<-[,]>+尝试匹配一个或多个字符,都不是,。 $=<-[,]>+告诉P6尝试匹配=(<-[,]>+即位)右侧的量化原子并将结果存储'id'在当前Match对象内的键处。后者将挂在解析树的一个分支上;我们稍后会精确到达。 ` rule kv-pairs { * % ',' }` 此正则表达式代码说明了几种方便的P6正则表达式功能之一。它表示您要匹配零个或多个以逗号分隔的kv-pair s 。 (更详细地讲,%正则表达式中缀运算符要求其左侧的量化原子的匹配被其右侧的原子分隔。) ` rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* }` 这里的新位是'={' ~ '}'。这是另一个方便的正则表达式功能。该正则表达式代字号操作者解析(在这种情况下,一个具有一个定界的结构={开启器和}更近)具有匹配的上越靠近右侧的量化正则表达式原子分隔符之间的比特。这具有多种好处,但主要的好处是错误消息可以更加清晰。 解析树的构造/解构的说明 最后一行()中的$和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
* } 规则末尾的空格表示语法将匹配输入末尾的任意数量的空格。 在此语法中调用另一个命名规则(或令牌/正则表达式/方法)。 由于看起来每个bib文件中应允许包含任意数量的文章,因此我在的末尾添加了*(零个或多个)*。 ``` rule article { '@article{' $=<-[,]>+ ',' '}' } ``` 有时我会制定规则,使其类似于典型输入的外观。我试图在这里这样做。 <[...]>是字符类的P6语法,就像[...]传统的regex语法一样。它功能更强大,但现在您只需要知道-in <-[,]>表示取反,即与^in ye olde [^,]语法相同。因此,<-[,]>+尝试匹配一个或多个字符,都不是,。 $=<-[,]>+告诉P6尝试匹配=(<-[,]>+即位)右侧的量化原子并将结果存储'id'在当前Match对象内的键处。后者将挂在解析树的一个分支上;我们稍后会精确到达。 ` rule kv-pairs { * % ',' }` 此正则表达式代码说明了几种方便的P6正则表达式功能之一。它表示您要匹配零个或多个以逗号分隔的kv-pair s 。 (更详细地讲,%正则表达式中缀运算符要求其左侧的量化原子的匹配被其右侧的原子分隔。) ` rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* }` 这里的新位是'={' ~ '}'。这是另一个方便的正则表达式功能。该正则表达式代字号操作者解析(在这种情况下,一个具有一个定界的结构={开启器和}更近)具有匹配的上越靠近右侧的量化正则表达式原子分隔符之间的比特。这具有多种好处,但主要的好处是错误消息可以更加清晰。 解析树的构造/解构的说明 最后一行()中的$和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
在此语法中调用另一个命名规则(或令牌/正则表达式/方法)。 由于看起来每个bib文件中应允许包含任意数量的文章,因此我在的末尾添加了*(零个或多个)*。 ``` rule article { '@article{' $=<-[,]>+ ',' '}' } ``` 有时我会制定规则,使其类似于典型输入的外观。我试图在这里这样做。 <[...]>是字符类的P6语法,就像[...]传统的regex语法一样。它功能更强大,但现在您只需要知道-in <-[,]>表示取反,即与^in ye olde [^,]语法相同。因此,<-[,]>+尝试匹配一个或多个字符,都不是,。 $=<-[,]>+告诉P6尝试匹配=(<-[,]>+即位)右侧的量化原子并将结果存储'id'在当前Match对象内的键处。后者将挂在解析树的一个分支上;我们稍后会精确到达。 ` rule kv-pairs { * % ',' }` 此正则表达式代码说明了几种方便的P6正则表达式功能之一。它表示您要匹配零个或多个以逗号分隔的kv-pair s 。 (更详细地讲,%正则表达式中缀运算符要求其左侧的量化原子的匹配被其右侧的原子分隔。) ` rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* }` 这里的新位是'={' ~ '}'。这是另一个方便的正则表达式功能。该正则表达式代字号操作者解析(在这种情况下,一个具有一个定界的结构={开启器和}更近)具有匹配的上越靠近右侧的量化正则表达式原子分隔符之间的比特。这具有多种好处,但主要的好处是错误消息可以更加清晰。 解析树的构造/解构的说明 最后一行()中的$和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
*。 ``` rule article { '@article{' $=<-[,]>+ ',' '}' } ``` 有时我会制定规则,使其类似于典型输入的外观。我试图在这里这样做。 <[...]>是字符类的P6语法,就像[...]传统的regex语法一样。它功能更强大,但现在您只需要知道-in <-[,]>表示取反,即与^in ye olde [^,]语法相同。因此,<-[,]>+尝试匹配一个或多个字符,都不是,。 $=<-[,]>+告诉P6尝试匹配=(<-[,]>+即位)右侧的量化原子并将结果存储'id'在当前Match对象内的键处。后者将挂在解析树的一个分支上;我们稍后会精确到达。 ` rule kv-pairs { * % ',' }` 此正则表达式代码说明了几种方便的P6正则表达式功能之一。它表示您要匹配零个或多个以逗号分隔的kv-pair s 。 (更详细地讲,%正则表达式中缀运算符要求其左侧的量化原子的匹配被其右侧的原子分隔。) ` rule kv-pair { $=\w* '={' ~ '}' $=<-[}]>* }` 这里的新位是'={' ~ '}'。这是另一个方便的正则表达式功能。该正则表达式代字号操作者解析(在这种情况下,一个具有一个定界的结构={开启器和}更近)具有匹配的上越靠近右侧的量化正则表达式原子分隔符之间的比特。这具有多种好处,但主要的好处是错误消息可以更加清晰。 解析树的构造/解构的说明 最后一行()中的$和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
和.等位for $ { say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
{ say . ~ ':' ~ .[0] ~ "\n" }表示匹配对象,该对象存储在成功解析后生成并返回的解析树中。 返回语法顶部: rule TOP { 如果解析成功,则返回单个“ TOP”级别的 Match对象,该对象对应于解析树的顶部。(它也可用于通过变量在parse方法调用之后立即进行编码$/。) 但是,在最终的解析返回之前,将生成许多其他 Match对象,它们代表整个解析的子部分,并将其添加到解析树中。通过将单个生成的Match对象或它们的列表分配给“父” Match对象的Positional或Associative元素,可以将Match对象添加到解析树中,如下所述。 rule TOP { * } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
* } 像这样的规则调用有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
有两个作用。首先,P6尝试匹配该规则。其次,如果匹配,则P6生成一个相应的Match对象,并将其添加到解析树中。 如果成功匹配的模式是,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
,而不是*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
*,则将仅尝试进行一次匹配,并且仅生成一个值(即单个Match对象)并将其添加到解析树中。 但是这种模式*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
*不仅是这样。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
。因此,P6尝试article多次匹配该规则。如果至少匹配一次,则它将生成并存储一个或多个Match对象的对应列表。(有关详细说明,请参见我对“如何在比赛中访问捕获内容?”的回答。) 因此,将匹配对象列表分配给'article'TOP级别匹配对象的键。(如果匹配的正则表达式不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
不是,*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
*则匹配将导致仅将一个Match对象分配给'article'键,而不是它们的列表。) 因此,现在我将尝试解释$最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
最后一行代码的一部分,即: ``` for $ { say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
{ say . ~ ': ' ~ .[0] ~ "\n" } $是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
是的缩写$/.。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
。 ``` $ /上的每个P6文档,“ $/是match变量。它存储最后一次Regex匹配的结果,因此通常包含Match类型的对象。” 在本例中,最后一个正则表达式匹配是语法TOP规则bib。 解析返回的TOP级别Match对象$的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
的'article'键下的值也是如此。此值是3个“文章”级别 Match对象的列表。 ` rule article { '@article{' $=<-[,]>+ ','` 该article反过来正则表达式包含$在赋值的左侧。这对应于将Match对象分配给'id'添加到商品级别 Match对象的新键。 希望这足够了(也许太多了!),我现在可以解释一下最后一行代码,再次是: `for $ { say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。
{ say . ~ ': ' ~ .[0] ~ "\n" }` 在for超过3个匹配对象(对应于输入的3篇)解析期间生成和下储存该列表迭代'article'顶层匹配对象的键。 (此迭代会自动将这三个子Match对象的每一个分配给$_,也就是“ it”或“ thetopic”,然后在每次分配后,在代码块({ ... })中执行代码。代码块中的代码通常会引用,或者显式或隐式地)$_。 .块中的位等效于$_.,即隐式引用$_。正如刚才解释的,$_是article正在处理的级别相匹配对象中的这一次for循环。该位意味着.返回存储在级别Match对象的'id'键下的articleMatch对象。 最后,该.[0]位指的是存储在匹配对象的'value'关键字下的匹配对象,该对象作为kv-pair与kv-pairs规则对应存储的匹配对象的关键字下存储的匹配对象列表的第一个(第0个)元素,而规则又依次存储在级别Match对象的'kv-pairs'键article。 ! 当自动生成的解析树不是您想要的时 似乎以上所有内容还不够,我需要再提一件事。 语法分析树强烈反映了语法的隐式树结构。但是,由于解析而获得这种结构有时是不便的-人们可能想要一个不同的树结构,也许是一个更简单的树,也许是一些非树数据结构。 当自动结果不合适时,从解析中准确生成所需内容的主要机制是使用make。(这可以在规则内的代码块中使用,也可以分解为与语法分开的Action类。) 反过来,的主要用例make是生成悬在解析树之外的节点的稀疏树。 最后,这些稀疏树的主要用例是存储AST。