我正在尝试解析以下形式的连接查询: “答案(x,y,z):-R(x,y),U(y,z)。”。
在Java(Maven)中使用Antlr4我构建了以下语法
grammar CQgrammar;
// Parser rules
query : head ':-' body;
head : atom;
body : atom (',' atom)* '.';
atom : ATOMNAME '(' term* (',' term)* ')';
term : CONST | VAR;
// Lexer rules
VAR: [a-z];
CONST: '"' [a-zA-Z0-9]+ '"';
TERMS: '(' | ')' | ',' | '.' | ':-';
ATOMNAME: [a-zA-Z0-9]+;
由此,我扩展了生成的侦听器类以覆盖
我的主要功能如下:
public static void main(String[] args) {
String query = "Answer(x,y,z):-R(x,y),U(y,z).";
org.parsing.CQgrammarLexer lexer = new org.parsing.CQgrammarLexer(CharStreams.fromString(query));
org.parsing.CQgrammarParser parser = new org.parsing.CQgrammarParser(new CommonTokenStream(lexer));
CQparser listener = new CQparser();
parser.addParseListener(listener);
parser.query();
}
从覆盖中的打印行,我可以看到结构是正确的,如 查询的每个部分都按正确的顺序输入,没有错误。
但是,当我尝试使用 ctx.getText() 访问每个覆盖中的文本时, 它是空的。甚至 ctx 参数上的其他 getter,例如 EnterAtom 中的 ctx.Atom() 是空的。
我认为词法分析器部分有问题,但文档对此我不是很清楚。 有谁知道我可以做什么来解决这个问题?
提前谢谢您!
您通常使用
ParseTreeWalker
来遍历解析树。快速演示:
public class CQgrammarDemo {
public static void main(String[] args) {
String query = "Answer(x,y,z):-R(x,y),U(y,z).";
CQgrammarLexer lexer = new CQgrammarLexer(CharStreams.fromString(query));
CQgrammarParser parser = new CQgrammarParser(new CommonTokenStream(lexer));
ParseTreeWalker.DEFAULT.walk(new DemoListener(), parser.query());
}
}
class DemoListener extends CQgrammarBaseListener {
@Override
public void enterTerm(CQgrammarParser.TermContext ctx) {
System.out.println("const: " + ctx.CONST() + ", var: " + ctx.VAR());
}
}
打印:
const: null, var: x
const: null, var: y
const: null, var: z
const: null, var: x
const: null, var: y
const: null, var: y
const: null, var: z