DSL,用于生成序列



尝试创建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))融入语法?你似乎做不到。这是我的逻辑:

由于parens,外部级别必须是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?

最新更新