我正在设计一种音乐编程语言并将其语法实现为PEG语法。解析过程最终变得相当复杂,因此看起来最简单的方法是定义几个单独的语法,并按顺序应用它们。到目前为止,我有三个语法:
在三个解析器中,#3是迄今为止最复杂的解析器。相比之下,#1和#2很简单,每个只占用大约10行。另一方面,#3越来越复杂,我实现的语法越多,目前处于33行并计数。
我想到了这个想法,也许我可以将3个语法压缩成一个?这可能会消除语法中的一点点重复,甚至可能会减少程序本身的代码行数,但我不确定它是否会过多地复杂化。我粗略地结合了它们,但很快发现它很难,因为我似乎必须解决在每一条规则中发生评论的可能性(如果我错了,请纠正我!)。实际上,我已经有了一个可选空白规则,我已将其包含在大多数音乐“事件”的定义中,以便在语法中允许一些空白。我无法决定在多个传递中坚持解析是否更有意义,并且有多个单独的解析器,每个任务一个,或者是否值得尝试将它们组合成一个超级语法。
我的问题是:对于那些有建立PEG语法经验的人,您是否经常发现自己将大文法分解为较小的子语法并对您的输入进行多次传递?将所有内容保存在一个语法中是否有任何优点(性能或其他方面)?
答案 0 :(得分:2)
你的方法很健全。一些解析器生成工具可以轻松忽略注释和空格。如果您使用的工具不是这种情况,那么执行注释删除传递是合理的,因为它大大简化了其他传递的语法。
我想要尝试统一语法的唯一原因是你有性能要求,但似乎并非如此。
"实用性超越纯度" (来自import this)。