【发布时间】:2014-07-14 14:39:57
【问题描述】:
我正在设计一种音乐编程语言并将其语法实现为 PEG 语法。解析过程最终变得相当复杂,所以看起来最简单的方法是定义几个单独的语法,并按顺序应用它们。到目前为止,我已经掌握了三种语法:
- 获取源文件的全部内容并去除 cmets。
- 获取源文件(已删除 cmets)并通过仪器将其分开。这导致成对的乐器名称/定义和“音乐代码”被所述乐器“演奏”。
- 实际解析音乐代码并返回音乐“事件”的解析树。
在三个解析器中,#3 是迄今为止最复杂的。 #1 和 #2 比较简单,每个只占用大约 10 行。另一方面,#3 变得越来越复杂,我实现的语法越多,目前是 33 行并且还在增加。
我突然想到,也许我可以将这 3 个语法浓缩为一个?这可能会消除语法中的一点重复,甚至可能减少程序本身的代码行数,但我不确定它是否会使事情过于复杂。我粗略地尝试将它们组合起来,但很快发现它很困难,因为我似乎必须解决每条规则中出现 cmets 的可能性(如果我错了,请纠正我!)。事实上,我已经有一个可选空格的规则,我已将其包含在大多数音乐“事件”的定义中,以便在语法中允许空格的一些灵活性。我无法决定是否坚持多次解析并拥有多个单独的解析器,每个任务一个解析器是否更有意义,或者是否值得尝试将它们组合成一个超语法。
我的问题是:对于那些有构建 PEG 语法经验的人,您是否经常发现自己将大型语法分解为较小的子语法并多次传递您的输入?将所有内容保存在一个语法中是否有任何优势(性能或其他方面)?
【问题讨论】: