是否有可能用语法表达存在?

时间:2013-12-07 14:46:36

标签: scala parsing f# context-free-grammar parser-combinators

我目前的语法如下:

COMPONENT = HEADER BODY
BODY = ELEMENT+
ELEMENT = EXPRESSION | DECLARATION | DESCRIPTION | NAME

我想声明身体必须以任何顺序拥有每个ELEMENT中的一个。目前我在解析之后检查这个,但我很好奇是否可以使用Parser Combinators在语法中表达这一点,特别是guard s

我尝试对此进行进一步的研究,但似乎没有出现。

2 个答案:

答案 0 :(得分:3)

是的,有可能。您只需记下所有有效的排列。这很快失控。

在语法中表达是不值得的,因为从本质上讲,你试图在语法中建立一个约束,而语法最擅长表达无上下文的约束。

最好用语法规则解析,只需将所有可能的子句作为选项,然后构建语义传递(无论如何都会有一个)来检查其他约束。

答案 1 :(得分:2)

在编写语法时,您应该尽可能多地将约束移动到语义传递而不是句法传递。这极大地提高了解析器在解析过程中从错误中恢复的能力,并允许您完全控制向用户报告错误时使用的方式和措辞。对于排列的情况,解析器的灵活性增加也可能会减小解析表的大小。