在尝试回答问题时,在找到特定字符时将文本写入新行,我使用了Regexp :: Grammars.它一直对我感兴趣,最后我有理由学习.我注意到作者的描述部分有一个LaTeX解析器(我是狂热的LaTeX用户,所以这让我很感兴趣)但是它有一个奇怪的构造在这里看到:
<rule: Option> [^][\$&%#_{}~^\s,]+
<rule: Literal> [^][\$&%#_{}~^\s]+
Run Code Online (Sandbox Code Playgroud)
什么的[^]
字符类完成?
在perl6语法,如所解释这里(注意,不能保证设计文件被向上最新作为实现完成)时,如果开度角托架之后是一个标识符,则构建体是一个子规则的呼叫时,方法或功能.
如果标识符后面的字符是开头,那么它是对方法或函数的调用,例如:<foo('bar')>
.正如在页面下方进一步解释的那样,如果标识符后面的第一个字符是空格,那么直到结束角度的其余字符串将被解释为方法的正则表达式参数 - 引用:
<foo bar>
Run Code Online (Sandbox Code Playgroud)
或多或少相当于
<foo(/bar/)>
Run Code Online (Sandbox Code Playgroud)
使用此功能的正确方法是什么?在我的例子中,我正在解析面向行的数据,而我正在尝试声明一条规则,该规则将对正在解析的当前行进行单独搜索:
#!/usr/bin/env perl6
# use Grammar::Tracer ;
grammar G {
my $SOLpos = -1 ; # Start-of-line pos
regex TOP { <line>+ }
method SOLscan($regex) {
# Start a new cursor
my $cur = self."!cursor_start_cur"() ;
# Set pos and from to start of the current line
$cur.from($SOLpos) ;
$cur.pos($SOLpos) ;
# Run the given regex on the cursor
$cur = $regex($cur) ;
# If pos is >= …
Run Code Online (Sandbox Code Playgroud) 几年来,我一直在断断续续地研究 Perl 解析器,但由于它一直处于 pre-alpha 阶段,我从不担心会加快它的速度。然而,我已经开始研究优化它的方法,并对我的发现感到惊讶。
经过一些算法和正则表达式优化后,正常执行大约需要 3.5 秒,其中,大约 2.3 秒是 Perl 启动所需的时间(我在放置“die(”Done ");" 在第一行)。我知道 Regexp::Grammars 不是最快的 Perl 模块,但它的初始化似乎比实际执行脚本花费的时间要长得多。
因此,我开始寻找一种在运行之前将其编译为字节码的简单方法。似乎 B::Bytecode 是执行此操作的唯一功能方式,不再维护或包含在主要 Perl 发行版中。有什么简单的方法可以减少启动时间吗?
谢谢!
在perl模块Regexp :: Grammars中,考虑以下标记:
<token: command> <%commands>
Run Code Online (Sandbox Code Playgroud)
此标记是复杂语法的一部分,可解析各种不同的句子。
该令牌与哈希%commands中的任何单词匹配,我已定义如下(当然,在任何函数之外):
our %commands = (
'Basic_import' => 1,
'Wait' => 1,
'Reload' => 1,
'Log' => 1,
);
Run Code Online (Sandbox Code Playgroud)
这适用于匹配“ Basic_import”,“ Wait”等关键字,但是,我也希望它与“ basic_import”,“ wait”等字匹配。
如何使此哈希大小写不敏感,而不必多次复制和粘贴每个关键字?因为这是复杂语法的一部分,所以我想使用Regexp :: Grammars,并且我不希望不必针对此特殊异常恢复为grep。
我真的很喜欢perl的Regexp :: Grammars模块..NET有这样的东西吗?
我真的想在C#中以正则表达式的方式使用递归下降解析器(例如,通过大文档搜索匹配的模式),并且能够递归地表达该模式.
更新从brian d foy 读取这个小宝石之后,我发现perl 5.10支持使用(?和NAME)标记的子模式.PCRE现在有一个Nuget包,PCRE支持命名/标记的子模式.
我想为以下内容创建一个正则表达式.
我有一些如下文字:
field = "test string";
type = INT;
funcCall(.., field, ...);
...
text = "desc";
field = "test string 1";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 2";
field = "test string 2";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 3";
.... keeps repeating
Run Code Online (Sandbox Code Playgroud)
基本上我正在尝试创建一个正则表达式,它将从第一个"field ="的开头到第二个"field ="的开头获取所有文本.它必须跳过函数调用中使用的字段文本.
我目前有以下内容:
my @overall = ($string =~ m/field\s*=.*?/gis);
Run Code Online (Sandbox Code Playgroud)
但是,这只是获得文本"field =".没有"?" 它从第一个到最后一个实例获取所有数据.
我也尝试过:
my @overall = ($string =~ m/field\s*=.*field\s*=/gis);
Run Code Online (Sandbox Code Playgroud)
然而,这将使我得到所有其他实例,因为它占有第二个"field ="字符串.有什么建议?
我现在开始在一些Perl6上弄脏手.具体来说,我正在尝试编写基于语法的Fortran解析器(Fortran :: Grammar模块)
出于测试目的,我希望有可能将Match
对象转换为JSON可序列化Hash
.
谷歌搜索/ 官方Perl6文档没有帮助.如果我忽视某些事情,我道歉.
到目前为止我的尝试:
Match $m
为Hash
via $m.hash
.但这会保留嵌套Match
对象.Match
对象的内容显然最好通过make
/ 来完成made
.我希望有一个超级简单的Actions
对象,用于所有匹配.parse
的默认方法,基本上只是做一个make $/.hash
或类似的东西.我根本不知道如何指定默认方法.