【发布时间】:2017-03-17 14:56:13
【问题描述】:
我对编写微语法很感兴趣。这就是解析器不理解语言的完整语法的地方,只理解它的一部分;一种“酸上的 m4”。
这个想法是解析器读取字符并将它们写入输出,直到它在识别关键字时“唤醒”,根据语法进行一些处理,然后再次进入睡眠状态。
我在构建一个时遇到了问题,而且那里似乎没有任何示例。
【问题讨论】:
我对编写微语法很感兴趣。这就是解析器不理解语言的完整语法的地方,只理解它的一部分;一种“酸上的 m4”。
这个想法是解析器读取字符并将它们写入输出,直到它在识别关键字时“唤醒”,根据语法进行一些处理,然后再次进入睡眠状态。
我在构建一个时遇到了问题,而且那里似乎没有任何示例。
【问题讨论】:
.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;
如果您跟踪自己的位置,您可以切换语法,当缓冲区获得更多数据时重试,等等。
除此之外,您还没有提出您要解决的具体问题。
【讨论】: