2

我可以将语法文件加载到我的 java 项目(在 netbeans 中)并生成/构建我的词法分析器和解析器类,通过反射加载它们,然后解析我需要解析的内容。

我想要的是一个简单的例子,它将来自词法分析器和解析器的生成/构建的结果重定向到一个字符串,这样我就可以将错误放到像 JOptionPane 这样的弹出窗口中。就像 ANTLRworks 在您执行 CTRL-R(至少在 Windows 中)显示 Error(123) 语法时所做的那样。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");
            }

谢谢

4

1 回答 1

2

调用方法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.err和进行操作System.out。如果您想处理来自 的所有内容Tool,则还必须调用System.setErrand System.setOut

于 2012-12-14T22:48:30.717 回答