语法,Scala解析组合器和无序集

Bef*_*rem 7 grammar scala bnf ebnf

我正在编写一个将采用各种"命令"字符串的应用程序.我一直在看Scala组合器库来标记命令.我发现在很多情况下我想说:"这些令牌是无序的,所以它们可以按任何顺序出现,有些可能不会出现".

根据我目前对语法的了解,我必须定义所有序列组合(伪语法):

command = action~content
action = alphanum
content  = (tokenA~tokenB~tokenC | tokenB~tokenC~tokenA | tokenC~tokenB~tokenA ....... )
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,考虑到tokenA-C是唯一的,是否有更短的方法来使用语法定义任何订单的集合?

Dan*_*ral 3

有办法解决这个问题。例如,看看这里的解析器。它接受 4 个预定义的数字,这些数字可以出现在任何其他数字中,但必须出现一次,并且只能出现一次。

OTOH,如果这种模式经常发生,你可以编写一个组合器:

def comb3[A](a: Parser[A], b: Parser[A], c: Parser[A]) =
  a ~ b ~ c | a ~ c ~ b | b ~ a ~ c | b ~ c ~ a | c ~ a ~ b | c ~ b ~ a
Run Code Online (Sandbox Code Playgroud)