ANTLR4 上下文为空且解析顺序正确

问题描述 投票:0回答:1

我正在尝试解析以下形式的连接查询: “答案(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]+;

由此,我扩展了生成的侦听器类以覆盖

  1. 输入查询
  2. 输入头部
  3. 进入正文
  4. 输入原子
  5. 输入术语 目前,我在这些覆盖中有简单的 println,但目标是从中构造一个联合查询类。

我的主要功能如下:

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() 是空的。

我认为词法分析器部分有问题,但文档对此我不是很清楚。 有谁知道我可以做什么来解决这个问题?

提前谢谢您!

java maven parsing antlr antlr4
1个回答
0
投票

您通常使用

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
© www.soinside.com 2019 - 2024. All rights reserved.