我在一个月前问了一个与半相关的问题: Is parsing in multiple passes common for PEG grammars?我试图弄清楚编写几个语法是否一个好主意,以逐步解析传递中某些文本的输入。对于我的宠物项目,一个音乐编程语言(MPL)解析器,我已经编写了3个单独的语法:
获取源文件的全部内容并删除注释。
获取源文件(删除注释)并按仪器分隔。这导致成对的乐器名称/定义和音乐代码"被扮演"通过该仪器。
实际上解析音乐代码(每个乐器一串文字)并返回一个音乐解析树" events"对于每种乐器。
回答我之前问题的那个人表示这是一种合理的方法,如果你的解析器生成器工具没有办法做到这一点,那么删除注释是合理的。自动/简单。他可以看到统一语法的唯一潜在原因是,如果有性能要求,但在我的情况下没有。
尽管如此,我还是想知道异常处理的后果。理想情况下,当我的解析器抛出异常时,我希望它能够在原始源文件中识别正确的行号,并显示标识解析错误的错误消息。我选择的解析器生成工具Instaparse有很好的错误消息,用于标识行号和列号,如下所示:
Parse error at line 1, column 1:
bbaaaab
^
Expected:
"ab"
问题是这些错误是按次传递的。如果我有一个初始语法,我用来从源文件中删除注释,那么原始行号不会被保留,进入下一遍。我真的希望情况并非如此,但在我看来,保留正确行号的唯一方法是将所有内容统一为一个非常复杂的语法。有没有解决的办法?是否有一些模式用于编写多个连续的语法并仍然保留原始输入的行号?