【问题标题】:Format ParseException with JavaCC使用 JavaCC 格式化 ParseException
【发布时间】:2009-10-14 05:43:13
【问题描述】:

我想知道如何将 JavaCC 抛出的 ParseException 格式化为人类可读的格式:实际上它在令牌中包含诸如beginLinebeginColumnendColumnendLine 等字段异常的引用,但不是对已解析源的引用。

谢谢! :)

【问题讨论】:

    标签: java parsing text-parsing javacc


    【解决方案1】:

    问题在于,默认情况下,JavaCC 不保留原始源数据。因此,除非您以某种方式保留对令牌的引用,否则它们不会保存在内存中。即使您确实使用了所有常规标记,您也需要为您定义的任何 SKIP 标记添加特殊处理 - 例如,用于丢弃空格和 cmets。 JavaCC 不保留所有这些内容的原因是它会使用很多更多的内存。

    保留所有令牌图像绝对是可行的...只需要一些半人工干预。

    【讨论】:

    • 汤姆!我们好久没聊天了! :D (我们也是 FB 上的朋友,我们甚至不在那里谈论这些事情...... :D)无论如何,想象一下我放置了一个 StringBuffer 来保留所有已解析的有效令牌,那么问题就是得到正确的列和行开始:想象我要通过在错误点之前和之后提供一些字符来构建错误字符串......你有什么解决方案吗? :)
    【解决方案2】:

    我不知道够不够,但你可以使用捕获的 ParseException 对象的属性 currentToken

    try {
    parser.Start();
        }
        catch(ParseException e){
            System.out.println("Problem with code!");
            System.out.println("Unknown symbol >> " 
                + e.currentToken.image 
                + " << Line:" + e.currentToken.beginLine 
                + ", column:" + e.currentToken.beginColumn);
            //e.printStackTrace();
        }
    

    【讨论】:

      【解决方案3】:

      在调用解析器之前保留文件名。然后,当您捕获 ParseException 时,重新读取文件并使用 beginLine 跳到正确的行。或者,您自己保留原始源文本,而不是文件名。

      我最近使用了 javacc 并做到了这一点。还必须递归处理类似包含的文件,所以我让解析器构建了一堆包含的源文件。捕获 ParseException 后,遍历堆栈是一件简单的事情,这样用户就可以看到包含每个文件的上下文(即父级中的行号)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多