Вот мой файл g4
grammar sql;
singleStatement
: CREATE TIMESERIES dataType
;
CREATE: 'CREATE';
TIMESERIES: 'TIMESERIES';
dataType
: INT32 | INT64 | FLOAT | DOUBLE | BOOLEAN | TEXT
;
INT32: 'INT32';
INT64: 'INT64';
FLOAT: 'FLOAT';
DOUBLE: 'DOUBLE';
BOOLEAN: 'BOOLEAN';
TEXT: 'TEXT';
WS
: [ \r\n\t]+ -> channel(HIDDEN)
;
Это слушатель. Я написал это случайно, Пожалуйста, игнорируйте имя класса и другие тривиальные вещи.
package com.boris.sql;
import com.boris.sql.sqlParser.SingleStatementContext;
public class Hello extends sqlBaseListener {
@Override
public void enterSingleStatement(SingleStatementContext ctx) {
super.enterSingleStatement(ctx);
if (ctx.dataType().BOOLEAN() != null) {
System.out.println(ctx.dataType().BOOLEAN().getText());
}
if (ctx.dataType().FLOAT() != null) {
System.out.println(ctx.dataType().FLOAT().getText());
}
if(ctx.dataType().DOUBLE() != null) {
System.out.println(ctx.dataType().DOUBLE().getText());
}
if(ctx.dataType().INT32() != null) {
System.out.println(ctx.dataType().INT32().getText());
}
if(ctx.dataType().INT64() != null) {
System.out.println(ctx.dataType().INT64().getText());
}
if(ctx.dataType().TEXT() != null) {
System.out.println(ctx.dataType().TEXT().getText());
}
}
}
Программа-драйвер для запуска простого примера,
package com.boris.sql;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class Driver {
public static void main(String[] args) {
String query = "CREATE TIMESERIES INT32";
sqlLexer lexer = new sqlLexer(new ANTLRInputStream(query));
CommonTokenStream tokns = new CommonTokenStream(lexer);
sqlParser parser = new sqlParser(tokns);
ParseTree tree = parser.singleStatement();
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(new Hello(), tree);
}
}
Да, как вы можете видеть, яполучить правильный результат "INT32". Я знаю методы «ввода», используемые для входа в узлы и выполнения каких-либо действий при обходе дерева. Но я стараюсь не использовать слишком много if. У вас есть другие способы получить dataType?
Класс sqlBaseListener генерируется anltr4, вы должны знать anltr4, чтобы понять его.