Parsing 是否可以使用多个解析器并保留行号?

Parsing 是否可以使用多个解析器并保留行号?,parsing,language-agnostic,context-free-grammar,peg,Parsing,Language Agnostic,Context Free Grammar,Peg,大约一个月前,我问了一个半相关的问题: 我试图弄清楚写几个语法来逐步解析过程中某些文本的输入是否合适。对于我最喜欢的项目,音乐编程语言(MPL)解析器,我编写了3个独立的语法: 获取源文件的全部内容并去掉注释 获取源文件(删除注释)并用仪器将其分开。这将产生成对的乐器名称/定义以及由所述乐器“播放”的“音乐代码” 实际解析音乐代码(每个乐器一个文本字符串),并返回每个乐器的音乐“事件”解析树 回答我上一个问题的一个人表示,这是一种合理的方法,如果您的解析器生成器工具无法自动/简单地执行此操作,则

大约一个月前,我问了一个半相关的问题: 我试图弄清楚写几个语法来逐步解析过程中某些文本的输入是否合适。对于我最喜欢的项目,音乐编程语言(MPL)解析器,我编写了3个独立的语法:

  • 获取源文件的全部内容并去掉注释

  • 获取源文件(删除注释)并用仪器将其分开。这将产生成对的乐器名称/定义以及由所述乐器“播放”的“音乐代码”

  • 实际解析音乐代码(每个乐器一个文本字符串),并返回每个乐器的音乐“事件”解析树

  • 回答我上一个问题的一个人表示,这是一种合理的方法,如果您的解析器生成器工具无法自动/简单地执行此操作,则可以通过注释删除。他所能看到的统一语法的唯一潜在原因是如果有性能要求,但在我的案例中没有

    不过,再仔细考虑一下,我想知道异常处理的后果。理想情况下,当解析器抛出异常时,我希望它在原始源文件中识别正确的行号,并显示一条识别解析错误的错误消息。我选择的解析器生成工具具有很好的错误消息,可以识别行号和列号,如下所示:

    Parse error at line 1, column 1:
    bbaaaab
    ^
    Expected:
    "ab"
    

    问题是这些错误是在每次传递的基础上抛出的。如果我有一个用于从源文件中删除注释的初始语法,那么原始行号就不会保留,继续下一步。我真的希望不是这样,但在我看来,保存正确行号的唯一方法是将所有内容统一到一个非常复杂的语法中。有办法解决这个问题吗?是否有某种模式可以编写多个连续的语法,并且仍然保留原始输入的行号?

    黑客建议:在步骤1中,不剥离组成注释的字节,而是将这些字节替换为相同大小的空白。这应该保持行号和位置不变。这是一个有趣的想法。。。不过,我不知道该如何保留这些新词。我的“长注释”定义需要有一些计算行数的方法,然后用适当数量的换行符替换,以保留行数。但如果没有其他选择的话,这可能会奏效……删除评论有什么意义?把它们当作空白忽略。哇。。。我不敢相信我从来没有想到过。我想我甚至在学习写CFG的时候读过这篇文章。如果你能详细说明这一点作为回答,我会接受的。