问题描述
我正在编写一个peg js语法,以将逻辑查询文字解析为json格式,但是在条件值中选择多值字时遇到了问题。就像(city ='a'OR city ='b')正常工作一样,但(city ='ab'OR city ='b')无法正常工作是因为它具有第一个条件的多字值。 我有一个正则表达式'((?:''| [^'])*)',它可以匹配单引号值内的字符串,但是PEG js解析器无法解析它。>
有人可以帮助我实现这一目标吗? 以下是我的语法: 在线编译器:https://pegjs.org/online 输入:(城市='a b'或城市='b') 语法:
Set = col: Column right: (_ 'in'
i_ '('
Series ')') {
return {
column: col,operator: right[1],value: right[4].split(','),conditions: []
}
}
Series = left: Column right: (_ ','
_(Series / Column)) ? {
if (right) {
var leftValue = left.slice(1).substring(0,left.length - 2);
var rightValue = right[3];
return leftValue + ',' + rightValue;
} else {
var leftValue = left.slice(1).substring(0,left.length - 2);
return leftValue;
}
}
LogicalCondition = left: LogicalSeparator right: (_('AND'
i / 'OR') _ LogicalSeparator) * {
var conditions = right.reduce(function (result,element) {
var condition = element[3];
if (condition.groupCondition) {
condition.groupOperator = element[1];
}
result.push(condition);
return result;
},[left]);
if (right.length > 0) {
return {
"groupCondition": true,"conditions": conditions,"groupOperator": right[0][1]
}
} else if (left.groupCondition === true) {
return left;
} else {
return {
"groupCondition": true,"conditions": [left]
}
}
}
/ Set
LogicalSeparator = Set /
"("
_ expr: LogicalCondition _ ")" {
return expr;
}
/ Condition
Condition = left: Column right: (_('customequalto'
i / 'customnotequalto'
i / '='
i / '!='
i / 'contains'
i / 'not contains'
i / 'in'
i / 'matches'
i / 'not matches'
i / 'is empty'
i / 'is not empty'
i / '<>') _ ConditionValue) * {
var validColumns = Array.of('employee_name','city','disabled','birthDate','age');
if (!validColumns.includes(left)) {
error('invalid column name ' + left);
}
return right.reduce(function (result,element) {
var valueText = right[0][3];
return {
conditions: [],column: left,operator: right[0][1],value: valueText.slice(1).substring(0,valueText.length - 2),};
},left);
}
ConditionValue "string" = _['/A-Za-z0-9-_'] + {
return text();
}
Column "string" = _['/A-Za-z0-9-_'] + {
return text();
}
_ "whitespace" = [\t\ n\ r] *```
It would be a great help if you can help!.
Thank you in advance.
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)