Java 关于在ANTLR中查找布尔变量的问题

Java 关于在ANTLR中查找布尔变量的问题,java,antlr4,Java,Antlr4,给定一个完整的Java程序Test.Java,其中包含各种语句。我们感兴趣的是一种特殊的语句:那些用作if语句条件的布尔变量。例如,在下面的代码片段中,quiet diag bail SLL就是这样的布尔变量 259: if ( !quiet ) System.err.println(f); 271: if ( diag ) parser.addErrorListener(new DiagnosticErrorListener()); 272: if

给定一个完整的Java程序Test.Java,其中包含各种语句。我们感兴趣的是一种特殊的语句:那些用作if语句条件的布尔变量。例如,在下面的代码片段中,quiet diag bail SLL就是这样的布尔变量

259:    if ( !quiet ) System.err.println(f);
            
271:    if ( diag ) parser.addErrorListener(new DiagnosticErrorListener());
272:    if ( bail ) parser.setErrorHandler(new BailErrorStrategy());
273:    if ( SLL ) parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
您的任务是编写代码来查找长度大于3的布尔变量,这些变量只在不带!的情况下使用!。在代码中,您需要打印出它们的名称和行号。例如,上述代码段的输出应类似于以下内容:

diag 271
bail 272
我们向您提供了一个示例代码JavaParserTest.java,它实现了使用生成的解析器的基本功能。例如:

CharStream input = new ANTLRFileStream(inputFile); // inputFile is "Test.java"
JavaLexer lexer = new JavaLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens); //create parser
ParseTree tree = parser.compilationUnit();
ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
JavaListener listener = new JavaParserTest(); // create a parse tree listener
walker.walk(listener, tree); // traverse parse tree with listener
JavaParserTest被声明为JavaListener的子类,并重写方法enterStatement:

@Override
public void enterStatement(Java7Parser.StatementContext ctx)
{
    System.out.println("enterStatement");
    //your code starts here
}
在遍历解析树期间访问Java语句时,将调用上述方法。您的整个代码都将使用此方法编写

提示: 检查在第792行定义了
if
语句的Java8语法:
'if'('expression')'语句
。因此,我们感兴趣的布尔变量必须位于
表达式中。
要确定当前语句context
ctx
中的第一个标记是否为
'if'
,请使用以下代码:

if(ctx.getStart().getText().equals("if")) {
    //first token is 'if'
}

现在,我可以使用
ctx.getStart().getLine()
来获取行号,并使用
ctx.getParent().getText()
来获取开始为“if”的整个句子,但我不知道如何在括号表达式中找到布尔变量(同样是条件>3且不带“!”),有人能告诉我怎么做吗?

有人能帮我解决这个问题吗?要解决此问题,请打印解析树。查看各种语句节点,并解释如何将“if statement”节点与其他类型的语句分离。然后,处理测试表达式。嘿@kaby76,我可以找到“if语句”,因为getStart()可以返回这个上下文的第一个标记,但是我想知道如何在这个上下文中找到布尔变量?似乎无法通过索引检索上下文标记?如果重写enterStatement()方法,请添加测试表达式子节点的代码,效果是“ctx.parExpression().expression().getText().length()==3”,但可能需要额外的检查。Antlr为JavaParser.StatementContext生成类似“parExpression()”的方法,以便沿着解析树向下导航到您感兴趣的子节点。类似地,您可以使用“parent”查找树。看看该工具生成的.java文件。