PEG.js帮助 - 可选的自由文本,后跟键值对

时间:2016-10-31 14:31:17

标签: regex parsing pegjs

我编写了以下解析器(粘贴到http://pegjs.org/online并且有效):

Expression = Pairs / FullTextWithPairs 

Pairs = (';'? _ p:Pair { return p; })*

FullTextWithPairs = fto:FullText po:Pairs
{ 
	var arr = [];
    if (fto) {
    	arr.push(fto);
     }
     return arr.concat(po);
}
 
FullText = ft:ValueString ';'
	{ 
    	return {'key' : 'fullText', 'op': '=', 'value': ft};
    }

Pair = k:Field op:Operator v:ValueString 
	{ 
    	var res = {'key' : k, 'op': op, 'value': v};
        console.log(res);
        return res;
    }
 
Operator = ('<>' / [=><])

ValueString = vs:[^;]+ {return vs.join('');}

Field = 'location' / 'application' / 'count'

_ = ' '*

它解析了这一串键值对:location=USA; application<>app; count>5 对此: [ { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]

问题是我想要启用自由文本搜索,这是在键值对之前输入的,例如: 这个:free text foobar; location=USA; application<>app; count>5 得到这个: [ { "key": "fullText", "op": "=", "value": "free text foobar" }, { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]

解析器应该识别第一部分不是键值对(根据“配对”规则)并将其作为“fullText”对象插入。

基本上“表达”规则应该这样做,根据我在文档中读到的内容 - A / B表示如果A未通过B则尝试。在第二种情况下,“巴黎”是faild,因为“自由文本foobar”没有通过Pairs规则,但它只是抛出异常而不是继续前进。

祝贺那些幸存者来到这里,我做错了什么? :) 谢谢

1 个答案:

答案 0 :(得分:0)

使用语法更多,解决方案是使用!配对和(由于某种原因)改变&#34;表达式#34;规则:

&#13;
&#13;
 try (DataInputStream in = new DataInputStream(new GZIPInputStream(new FileInputStream(filename), 4096))) {
        for (int i = 0; i < max; ++i) {
            long value = in.readLong();
            if (value != num + i) {
                throw new RuntimeException("unexpected value: " + value);
            }
        }
    }
&#13;
&#13;
&#13;