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是唯一的,是否有更短的方法来使用语法定义任何订单的集合?
有办法解决这个问题。例如,看看这里的解析器。它接受 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)
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |