我对编写微语法感兴趣。这是解析器不理解语言的完整语法的地方,只是语言的一部分;有点“m4对酸”。
这个想法是解析器读入字符并将它们写入输出,直到它在识别关键字时“醒来”,根据语法进行一些处理,然后再次入睡。
我在构建一个时遇到了麻烦,而且似乎没有任何例子。
答案 0 :(得分:7)
您可能正在寻找.subparse
方法。它锚定在数据的开头并尽可能多地匹配。您可以使用:c
副词告诉它从哪里开始,然后查看Match
对象以查看它停止的位置
my $position = 0;
my $match = Some::Grammar.subparse( $data, :c($position) );
# update the position to the last thing your grammar consumed
$position = $match.end if $match.so;
如果您跟踪自己的位置,可以切换语法,在缓冲区获取更多数据时再试一次,等等。
除此之外,您还没有提出您想要解决的具体问题。