Ragel 手册6.5 Semantic conditions中有一个示例,该示例演示了如何使用when子句为可变大小结构编写语法。
action rec_num { i = 0; n = getnumber(); }
action test_len { i++ < n }
data_fields = (
’d’
[0-9]+ %rec_num
’:’
( [a-z] when test_len )*
)**;
它适用于小型结构,但是对于较大的结构,它会减慢速度,因为解析器会尝试评估每个字符的条件。
我想要做的是跳过扫描并将数据复制到缓冲区中,对于这样的语法(注意any*):
action rec_num { i = 0; n = getnumber(); }
action test_len { i++ < n }
data_fields = (
’d’
[0-9]+ %rec_num
’:’
( any* when test_len )*
)**;
所以我想直接复制长度为n的缓冲区而不需要迭代。如何在不离开解析器上下文的情况下做到这一点?