用于生成序列的 DSL

DSL for generating sequences

正在尝试创建 DSL 以生成序列...这是我目前所做的:

    ?start : expr

    token : WORD                        
    repeat_token : token ":" INT        
    tokens : (token | repeat_token)+    
    repeat : ":" INT
    expr  : "(" tokens | expr ")"   repeat?

这是 DSL 的样子:

   (a b:2 (c d:3):2 ):3

   [[a bb [[c ddd] [c ddd]] ] ... ]

我在 expr ... 中遇到 expr 问题?

这失败了:

 (a:2 (b))

您如何看待 (a:2 (b)) 适合您的语法?看来你做不到。这是我的逻辑:

由于括号的原因,外层必须是 expr。在那个 expr 中,你有一个 repeat_token 和另一个 expr。我看不到任何地方可以让您拥有包含 repeat_tokens 和 exprs 的元素序列。因此,您的输入无法用您的语法进行解析。

事实上,一个expr只能单独存在于另一个expr中,一般来说似乎没什么用。我认为这只会导致多套括号。我认为您需要做的是允许 expr 包含在 tokens.

那么也许:

?start : expr

    token : WORD                        
    repeat_token : token ":" INT        
    tokens : (token | repeat_token | expr)+    
    repeat : ":" INT
    expr  : "(" tokens ")" repeat?