1

我正在设计一种音乐编程语言并将其语法实现为 PEG 语法。解析过程最终变得相当复杂,所以看起来最简单的方法是定义几个单独的语法,并按顺序应用它们。到目前为止,我有三个语法:

  1. 获取源文件的全部内容并去掉注释。
  2. 获取源文件(已删除注释)并按仪器分隔。这导致成对的乐器名称/定义和由所述乐器“播放”的“音乐代码”。
  3. 实际解析音乐代码并返回音乐“事件”的解析树。

在三个解析器中,#3 是迄今为止最复杂的。#1 和 #2 比较简单,每个只占用大约 10 行。另一方面,#3 变得越来越复杂,我实现的语法越多,目前是 33 行并且还在增加。

我突然想到,也许我可以将 3 个语法浓缩为一个?这可能会消除语法中的一点重复,甚至可能减少程序本身的代码行数,但我不确定它是否会使事情过于复杂。我粗略地尝试将它们组合起来,但很快发现它很困难,因为我似乎必须解决在每条规则中出现评论的可能性(如果我错了,请纠正我!)。事实上,我已经有一个可选空格的规则,我已将其包含在大多数音乐“事件”的定义中,以便在语法中允许空格的一些灵活性。我无法决定坚持多次解析并拥有多个单独的解析器是否更有意义,每个任务一个,

我的问题是:对于那些有构建 PEG 语法经验的人,您是否经常发现自己将大型语法分解为较小的子语法并多次传递您的输入?将所有内容都保存在一个语法中是否有任何优势(性能或其他方面)?

4

1 回答 1

2

你的方法是合理的。一些解析器生成工具可以轻松忽略注释和空格。如果您使用的工具不是这种情况,那么执行注释删除传递是合理的,因为它大大简化了其他传递的语法。

我能想到的尝试统一语法的唯一原因是您有性能要求,但似乎并非如此。

“实用胜于纯洁”(来自import this)。

于 2014-07-14T17:37:02.200 回答