我可以将语法文件加载到我的 java 项目(在 netbeans 中)并生成/构建我的词法分析器和解析器类,通过反射加载它们,然后解析我需要解析的内容。
我想要一个简单的示例,将词法分析器和解析器的生成/构建结果重定向到字符串,以便我可以将错误放入 JOptionPane 等弹出窗口中。 就像当您执行 CTRL-R(至少在 Windows 中)时 ANTLRworks 会显示 Error(123) Grammar.g:100:12: ...Warning...etc...
现在我已经在使用 DiagnosticCollector,但这并不总是像 ANTLRworks 中的 CTRL-r 那样提供足够的详细信息。这个想法是用户纠正语法以纠正错误。
这是我的代码片段
Tool tool = new Tool(new String[]{userDir + grammarPath + grammarName + ".g"});
//tool.setOutputDirectory(userDir + grammarPath );
tool.process();
if(tool.getNumErrors()>0) {
errors=true;
unableToLoadGrammar_AddLine("1. Detected "+tool.getNumErrors()+" Error(s)"+tool.toString()+"\n");
}
谢谢
最佳答案
调用org.antlr.tool.ErrorManager
的setErrorListener
方法:
public class ToolTest {
public static void main(String[] args) {
org.antlr.Tool tool = new org.antlr.Tool(new String[] { "GrammarWithErrors.g" });
final ArrayList<String> messages = new ArrayList<String>();
ErrorManager.setErrorListener(new ANTLRErrorListener() {
@Override
public void warning(Message msg) {
messages.add("Warning: " + msg.toString());
}
@Override
public void info(String msg) {
messages.add("Info: " + msg.toString());
}
@Override
public void error(ToolMessage msg) {
messages.add("Tool Error: " + msg.toString());
}
@Override
public void error(Message msg) {
messages.add("General Error: " + msg.toString());
}
});
tool.process();
System.out.println("Done processing...");
for (String msg : messages) {
System.out.println(msg);
}
}
}
将错误的语法传递给上面的代码会产生以下输出:
Done processing...
General Error: error(100): GrammarWithErrors.g:1:14: syntax error: antlr: MismatchedTokenException(74!=52)
Tool Error: error(150): grammar file GrammarWithErrors.g has no rules
General Error: error(100): GrammarWithErrors.g:82:7: syntax error: assign.types: NoViableAltException(0@[])
请注意,Tool
仍然直接对 System.err
和 System.out
进行操作。如果您想处理来自 Tool
的一切,您必须调用 System.setErr
和 System.setOut
也是如此。
关于java - 如何将 ANTLR 语法构建输出到屏幕(例如像 ANTLRworks CTRL-r 一样输出到 JOptionPane),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886961/