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

问题描述

给出了完整的Java程序Test.java,其中包含各种语句。我们感兴趣的是一种特殊的语句:这些布尔变量用作if语句的条件。例如,在以下代码段中,静diag bail sll就是此类布尔变量。

for byte in range(100,110):
    for bw in range(0,2):
        for nss in range(0,2):
            for mcs in range(0,10):
                pass

您的任务是编写代码,以找出长度大于3的此类布尔变量,并且仅在不使用!的情况下使用。在您的代码中,您需要打印出它们的名称和行号。例如,上面的代码片段的输出应与此类似:

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);

为您提供了示例代码JavaParserTest.java,该示例代码已实现使用生成的解析器的基本功能。例如:

diag 271
bail 272

JavaParserTest被声明为JavaListener的子类,并覆盖方法enterStatement:

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

在遍历解析树期间访问Java语句时,将调用上述方法。您的整个代码将用这种方法编写。

提示: 检查在第792行@Override public void enterStatement(Java7Parser.StatementContext ctx) { System.out.println("enterStatement"); //your code starts here } 处定义的if语句的Java8语法。因此,我们感兴趣的布尔变量必须位于'if' '(' expression ')' statement中。 要确定当前StatementContext expression中的第一个标记是否为ctx,请使用以下代码

'if'

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)