1

大约一个月前,我问了一个半相关的问题: PEG 语法中的多遍解析是否常见?我试图弄清楚编写几个语法以逐步解析某些文本的输入是否是一个好主意。对于我的宠物项目,一个音乐编程语言 (MPL) 解析器,我编写了 3 个单独的语法:

  1. 获取源文件的全部内容并去掉注释。

  2. 获取源文件(已删除注释)并按仪器分隔。这导致成对的乐器名称/定义和由所述乐器“播放”的“音乐代码”。

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

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

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

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

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

4

0 回答 0