尝试创建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_token
s和expr
s的元素序列。因此,你的输入无法用语法进行解析。
事实上,一个expr
只能单独存在于另一个expr
中,这在一般情况下似乎不是很有用。我认为这只会导致额外的括号。我认为您需要做的是允许expr
包含在tokens
中。
那么也许:
?start : expr
token : WORD
repeat_token : token ":" INT
tokens : (token | repeat_token | expr)+
repeat : ":" INT
expr : "(" tokens ")" repeat?