java - 如何将 ANTLR 语法构建输出到屏幕(例如像 ANTLRworks CTRL-r 一样输出到 JOptionPane)

标签 java reflection build antlr grammar

我可以将语法文件加载到我的 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.ErrorManagersetErrorListener方法:

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.errSystem.out 进行操作。如果您想处理来自 Tool一切,您必须调用 System.setErrSystem.setOut 也是如此。

关于java - 如何将 ANTLR 语法构建输出到屏幕(例如像 ANTLRworks CTRL-r 一样输出到 JOptionPane),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886961/

相关文章:

java - 如何计算矩阵中每个正方形(较小矩阵)的长度

java - jsonschema2pojo maven插件不生成Java类

java - 获取javax swing计时器值

c# - 加载程序集、查找类和调用 Run() 方法的正确方法

iphone - 如何向 UILabel 添加反射。 IOS

javaFX mediaPlayer 淡出当前正在播放的音频

java - 如何使用 getClass() 判断对象是否为数字?

linux - 构建 caffe 时出错 - 找不到 -lhdf5_hl

c++ - 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

ios - 新建的WebRTC.framwork(iOS)缺少RTCAudioSession.h等文件