如何解决有关在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 举报,一经查实,本站将立刻删除。