编写一个搜索表达式解析器可以帮助你解析和处理用户输入的搜索查询。这个解析器可以支持基本的逻辑操作符(如 AND、OR、NOT)以及括号来分组表达式。以下是一个简单的 JavaScript 实现示例。
我们将使用递归下降解析器来解析搜索表达式。这个解析器将支持以下操作符:
AND
:逻辑与OR
:逻辑或NOT
:逻辑非(
和 )
:用于分组以下是一个简单的 JavaScript 实现:
class SearchExpressionParser {
constructor(expression) {
this.expression = expression;
this.index = 0;
}
parse() {
this.tokens = this.tokenize(this.expression);
return this.parseExpression();
}
tokenize(expression) {
const regex = /\s*(=>|&&|\|\||!|\(|\)|\w+)\s*/g;
return expression.match(regex).map(token => token.trim());
}
parseExpression() {
let left = this.parseTerm();
while (this.peek() === 'OR') {
this.consume('OR');
const right = this.parseTerm();
left = { type: 'OR', left, right };
}
return left;
}
parseTerm() {
let left = this.parseFactor();
while (this.peek() === 'AND') {
this.consume('AND');
const right = this.parseFactor();
left = { type: 'AND', left, right };
}
return left;
}
parseFactor() {
if (this.peek() === 'NOT') {
this.consume('NOT');
const operand = this.parseFactor();
return { type: 'NOT', operand };
} else if (this.peek() === '(') {
this.consume('(');
const expression = this.parseExpression();
this.consume(')');
return expression;
} else {
return this.parseLiteral();
}
}
parseLiteral() {
const token = this.consume();
return { type: 'LITERAL', value: token };
}
peek() {
return this.tokens[this.index];
}
consume(expected) {
const token = this.tokens[this.index];
if (expected && token !== expected) {
throw new Error(`Expected ${expected} but found ${token}`);
}
this.index++;
return token;
}
}
// 示例用法
const expression = "NOT (apple AND orange) OR banana";
const parser = new SearchExpressionParser(expression);
const ast = parser.parse();
console.log(JSON.stringify(ast, null, 2));
tokenize
方法:将输入的表达式字符串分割成标记(tokens)。使用正则表达式匹配操作符、括号和字面量。parseExpression
方法:解析 OR 表达式。parseTerm
方法:解析 AND 表达式。parseFactor
方法:解析 NOT 表达式和括号分组。parseLiteral
方法:解析字面量(如单词)。peek
和 consume
方法:用于查看和消费当前标记。解析器将输入的表达式解析为一个抽象语法树(AST)。例如,输入 "NOT (apple AND orange) OR banana"
将生成以下 AST:
{
"type": "OR",
"left": {
"type": "NOT",
"operand": {
"type": "AND",
"left": {
"type": "LITERAL",
"value": "apple"
},
"right": {
"type": "LITERAL",
"value": "orange"
}
}
},
"right": {
"type": "LITERAL",
"value": "banana"
}
}
你可以扩展这个解析器以支持更多的操作符或功能。解析后的 AST 可以用于进一步的处理,例如执行搜索查询或生成 SQL 查询。
领取专属 10元无门槛券
手把手带您无忧上云