首页 > 解决方案 > 关于在 ANTLR 中查找布尔变量的问题

问题描述

给定一个包含各种语句的完整 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 语句时,将调用上述方法。您的整个代码将使用此方法编写。

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

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

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

标签: javaantlr4

解决方案


推荐阅读