我编写了以下解析器(粘贴到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规则,但它只是抛出异常而不是继续前进。
祝贺那些幸存者来到这里,我做错了什么? :) 谢谢
答案 0 :(得分:0)
使用语法更多,解决方案是使用!配对和(由于某种原因)改变&#34;表达式#34;规则:
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;