在 Antlr 4 中,这样的代码在一个通用的 main 函数中工作。
public static void main(String[] args) {
.....
SicstusPrologParser parser = new SicstusPrologParser(tokens);
ParserRuleContext tree =(ParserRuleContext)parser.program();
tree.inspect(parser);
}
最后一条语句弹出一个模型 JDialog,它显示了解析器树结构。但我将代码复制到一个junit测试用例中,如下所示:
@Test
public void testParserClause() { //clause
.....
SicstusPrologParser parser = new SicstusPrologParser(tokens);
ParserRuleContext tree =(ParserRuleContext)parser.program();
tree.inspect(parser);
}
在我单击“确定”按钮之前,由“tree.inpect(parser)”创建的 JDialog 刚刚被 junt 关闭。我深入研究了“检查”功能,其主要逻辑流程如下:
.....
Callable<JDialog> callable = new Callable<JDialog>() {
JDialog result;
@Override
public JDialog call() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
//fill the tree nodes and show the dialog.
result = showInDialog(viewer);
}
});
return result;
}
};
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
return executor.submit(callable);
}
finally {
executor.shutdown();
}
为什么模型 JDialog 在我做某事之前就关闭了?我使用了“inspect”的返回值,但它仍然有效。
Future<JDialog> fu = tree.inpect(parser);
fu.get();
有什么帮助吗?