如果语法不匹配,有没有办法让Perl 6生成错误消息?或者至少返回它处理的最后一个数据的位置?如果从解析器获得的所有内容都是"不匹配",则很难修复语法错误.
我需要匹配key = valueBibTeX 文件中对的值,这些文件可以包含任意嵌套的大括号,由大括号分隔。我最多匹配两个深嵌套的花括号,就像{some {stuff} like {this}}kludgey一样:
token brace-value {
'{' <-[{}]>* ['{' <-[}]>* '}' <-[{}]>* ]* '}'
}
Run Code Online (Sandbox Code Playgroud)
我对再往下一层的想法感到不寒而栗……但是正确解析我的 BibTeX 内容至少需要三层深。
是的,我知道周围有 BibTeX 解析器,但我需要获取完整的条目以进行进一步处理,同时查看几个键。我的*.bib文件相当温和(我不介意手动处理一些杂散条目),问题是我有很多文件,并且有很多重叠。但是一些“相同”的条目有不同的键,或者额外的数据。我想将它们合并成几个主文件(BibTeX 背后的整个想法,对吧?)。如果bibtool给出一个没有重复(ha!)大约 20,000 行的文件,手工就不好玩了...
我已经写了这个 - 效果很好:
use Grammar::Tracer;
my grammar Lambda {
token TOP { <signature> <body> ' as ' <r-type> }
rule signature { '|' <a-sig> [',' <b-sig>]? '|' }
rule a-sig { 'a:' <a-type> }
rule b-sig { 'b:' <b-type> }
token body { '(' <expr> ')' <?before ' as '> }
token expr { <-[()]>* }
token a-type { @types }
token b-type { @types }
token r-type { @types }
}
Lambda.parse("|a: i32, b: i32| (a + b) as …Run Code Online (Sandbox Code Playgroud) 我想用希伯来语处理整个 Tanach 文件。为此,我选择了 Raku 语言,因为它的一些特性(语法和 unicode 支持)。
因此,我定义了一些标记来选择相关数据。
grammar HEB {
token TOP {'<hebrewname>'<t_word>'</hebrewname>'}
token t_word {<graph>+}
};
grammar CHA {
token TOP {'<c n="'<t_number>'">'}
token t_number {\d+}
};
grammar VER {
token TOP {'<v n="'<t_number>'">'}
token t_number {\d+}
};
grammar WOR {
token TOP {'<w>'<t_word>'</w>'}
token t_word {<graph>+}
};
Run Code Online (Sandbox Code Playgroud)
在这里,文档的一小部分(XML 格式的 Tanach)足以说明问题:
<names>
<name>Genesis</name>
<abbrev>Gen</abbrev>
<number>1</number>
<filename>Genesis</filename>
<hebrewname>??????</hebrewname>
</names>
<c n="1">
<v n="1">
<w>???/?????????</w>
<w>???????</w>
<w>?????????</w>
<w>????</w>
<w>??/??????????</w>
<w>??/????</w>
<w>??/???????</w>
</v>
<v n="2">
<w>??/??/??????</w>
<w>????????</w>
<w>???????</w>
<w>??/??????</w>
<w>??/????????</w>
<w>????</w> …
当Perl 6语法规则中的空白区域显着时,有人可以澄清吗?我正在通过反复试验来学习一些,但似乎无法在文档中找到实际的规则.
例1:
rule number {
<pm> \d '.'? \d*[ <pm> \d* ]?
}
rule pm {
[ '+' || '-' ]?
}
Run Code Online (Sandbox Code Playgroud)
将匹配一个数字2.68156e+154,而不关心存在的空格rule number.但是,如果我之后添加一个空格\d*,它将失败.(即<pm> \d '.'? \d* [ <pm> \d* ]?失败).
示例2:如果我试图在单词的中间找到文字,那么它们之间的间距很重要.即,在找到条目Double_t Delta_phi_R_1_9_pTproj_13_dat_cent_fx3001[52] = {
grammar TOP {
^ .*? <word-to-find> .* ?
}
rule word-to-find {
\w*?fx\w*
}
Run Code Online (Sandbox Code Playgroud)
会找到这个词.然而,如果规则的定义word-to-find更改为:
fx
或 \w* fx\w*
或 \w*fx \w*那么就不会进行匹配.
此外,然后定义'[52]'将匹配,而定义'fx[52]'将不匹配.
感谢您的任何见解.指向文档中正确点的指针将有很大帮助!谢谢,