我正在使用HOP::Lexer来扫描BlitzMax模块源代码以从中获取一些数据。我目前感兴趣的一个特定数据是模块描述。
目前,我正在搜索ModuleInfo "Description: foobar"
或ModuleInfo "Desc: foobar"
格式的说明。这很好用。但遗憾的是,我扫描的大多数模块都在其他地方定义了描述块。这实际上是在BlitzMax中执行它的常用方法,正如文档生成器所期望的那样。
这就是所有模块在主源文件中定义其描述的方式。
Rem
bbdoc: my module description
End Rem
Module namespace.modulename
这也不是一个真正的问题。但End Rem之后的行也包含我想要的数据(模块名称)。这是一个问题,因为现在2个令牌的定义彼此重叠,并且在检测到第一个令牌之后,它将从它停止的位置(正被扫描的内容的位置)继续。这意味着模块名称的标记不会检测到任何内容。
是的,我确保我的令牌订单是正确的。将光标移回一行似乎不太可能(有点可以理解)。
用于从Rem-End Rem块中获取描述的一小段代码,该代码高于模块定义(未解决,但适用于当前测试用例):
[ 'MODULEDESCRIPTION',
qr/[ \t]*\bRem\n(?:\n|.)*?\s*\bEnd[ \t]*Rem\nModule[\s\t]+/i,
sub {
my ($label, $value) = @_;
$value =~ /bbdoc: (.+)/;
[$label, $1];
}
],
所以在我的测试用例中,我首先扫描一个注释,然后是上面的块(MODULEDESCRIPTION),然后是块注释(Rem-End Rem),模块名称等。
目前我能想到的唯一解决方案是仅为模块描述设置第二个词法分析器,但我不喜欢这样。用HOP :: Lexer来完全是我想要的吗?
我的Lexer的来源可以在https://github.com/maximos/maximus-web/blob/develop/lib/Maximus/Class/Lexer.pm
找到答案 0 :(得分:1)
我通过添加(稍微修改过的版本)MODULEDESCRIPTION来解决它。在子例程中,我只是过滤掉模块名称并返回一个包含4个元素的arrayref,我稍后会迭代创建一个带有标记及其值的可用数组。
解决方案再次位于https://github.com/maximos/maximus-web/blob/develop/lib/Maximus/Class/Lexer.pm
编辑:或者让我在这里粘贴一段代码
[ 'MODULEDESCRIPTION',
qr/[ \t]*\bRem\R(?:\R|.)*?\bEnd[ \t]*Rem\R\bModule[\s\t]\w+\.\w+/i,
sub {
my ($label, $value) = @_;
my ($desc) = ($value =~ /\bbbdoc: (.+)/i);
my ($name) = ($value =~ /\bModule (\w+\.\w+)/i);
[$label, $desc, 'MODULENAME', $name];
}
],