java - 关于在 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并且没有“ !”),有人可以告诉我该怎么做吗?
解决方案
推荐阅读
- java - 我可以按顺序使用许多 listIterators 从 Java 中的 ArrayList 中改变或删除列表元素吗?
- python - Python - 绘制多个数据框列
- python - 工作流程:指向 Python 数组的 C 指针?
- sql - 更新客户记录
- applescript - 笔记全部导出为PDF
- tensorflow - 跨多个 GPU 镜像多 GPU 模型
- powershell - 有没有办法在 powershell 中使用相当于 touch 来更新文件的时间戳?
- node.js - 未处理的“错误”事件如何找出它正在发生的代码行?
- javascript - 如何发出两个 axios 请求并将两个响应保存在一个钩子中?
- docker-compose - Docker-compose .env 文件内部变量替换