我目前的语法如下:
COMPONENT = HEADER BODY
BODY = ELEMENT+
ELEMENT = EXPRESSION | DECLARATION | DESCRIPTION | NAME
我想声明身体必须以任何顺序拥有每个ELEMENT中的一个。目前我在解析之后检查这个,但我很好奇是否可以使用Parser Combinators
在语法中表达这一点,特别是guard
s
我尝试对此进行进一步的研究,但似乎没有出现。
答案 0 :(得分:3)
是的,有可能。您只需记下所有有效的排列。这很快失控。
在语法中表达是不值得的,因为从本质上讲,你试图在语法中建立一个约束,而语法最擅长表达无上下文的约束。
最好用语法规则解析,只需将所有可能的子句作为选项,然后构建语义传递(无论如何都会有一个)来检查其他约束。
答案 1 :(得分:2)
在编写语法时,您应该尽可能多地将约束移动到语义传递而不是句法传递。这极大地提高了解析器在解析过程中从错误中恢复的能力,并允许您完全控制向用户报告错误时使用的方式和措辞。对于排列的情况,解析器的灵活性增加也可能会减小解析表的大小。