acodercc / jcon

A JavaScript parser combinator Library
MIT License
3 stars 3 forks source link

是否应该增加两个解析器尾处理器 flat,result #4

Open acodercc opened 9 years ago

acodercc commented 9 years ago

之前已经添加了seqJoin这个解析器的尾处理器,与以下两个解析器尾处理器的连续调用是等价的:


var p1 = jcon.string('1');
var p2 = jcon.string('2');

var p12 = jcon.seq(p1, p2);

p12.parse('12'); // 结果是['1','2']  使用数组保存每个被结合的解析器的解析结果

var joined_p12 = p12.joinValue();
joined_p12.parse('12');    //结果是"12",将解析器的value数组进行join的“尾处理”。

jcon.seqJoin(p1, p2).parse('12'); //结果是"12",seqJoin等价于seq().joinValue(),是两个内dsl的结合

现在出现了新的需求,需要设计新的内部dsl来表现需求:


var p1 = jcon.string('1');
var p2 = jcon.string('2');
var p3 = jcon.string('3');

jcon.seq(p1, p2).seq(p3).parse('123');  //  [['1','2'], '3']    没有平坦化的数据

jcon.seq(p1, p2).seq(p3).flat().parse('123'); // ['1', '2', '3']   需要对当前层次的value进行平坦化

另外,有一个需求是需要直接设置value的:

var whitespace = jcon.regex(/ \r\n\t\f+/);
whitespace.parse('   ');  //parse到了3个空白字符
whitespace.value(' ').parse('    ');// 无论parse到多少个空白字符,都返回{success:true, value:' '}