我写了一个复杂的语法。语法如下:
grammar i;
options {
output=AST;
}
@header {
package com.data;
}
operatorLogic : 'AND' | 'OR';
value : STRING;
query : (select)*;
select : 'SELECT'^ functions 'FROM table' filters?';';
operator : '=' | '!=' | '<' | '>' | '<=' | '>=';
filters : 'WHERE'^ conditions;
conditions : (members (operatorLogic members)*);
members : STRING operator value;
functions : '*';
STRING : ('a'..'z'|'A'..'Z')+;
WS : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords
输出是使用 AST 完成的。以上只是一个小样本。但是,我正在开发一些大语法,并且需要有关如何处理此问题的建议。
例如根据上面的语法可以产生以下内容:
SELECT * from table;
SELECT * from table WHERE name = i AND name = j;
此查询可能会变得更复杂。我已经在 Java 代码中实现了 AST,并且可以取回 Tree。我想把语法和逻辑分开,所以它们是有凝聚力的。所以 AST 是最好的方法。
用户将以字符串形式输入查询,我的代码需要以最佳方式处理查询。如您所见,函数解析器当前是 * 表示全选。将来,这可能会扩展到包括其他事物。
我的代码如何处理这个?最好的方法是什么?
我可以做这样的事情:
String input = "SELECT * from table;";
if(input.startsWith("SELECT")) {
select();
}
如您所见,这种方法更复杂,因为我还需要处理 * 可选过滤器。也需要做 AND 和 OR 的 operatorLogic。
什么是最好的方法?我在网上看过,但找不到任何关于如何处理这个问题的例子。
你能举出任何例子吗?
编辑:
String input = "SELECT * FROM table;";
if(input.startsWith("SELECT")) {
select();
}
else if(input.startsWith("SELECT *")) {
findAll();
}