0

试图创建 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))
4

1 回答 1

1

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

expr由于括号,外部级别必须是一个。因为expr你有 arepeat_token和 another expr。我没有看到任何地方可以让您拥有包含repeat_tokens 和exprs 的元素序列。因此,您的输入无法用您的语法进行解析。

事实上,aexpr只能单独存在于另一个中expr,这通常看起来不是很有用。我认为这只会导致额外的括号。我认为您需要做的是允许expr将 a 包含在tokens.

那么也许:

?start : expr

    token : WORD                        
    repeat_token : token ":" INT        
    tokens : (token | repeat_token | expr)+    
    repeat : ":" INT
    expr  : "(" tokens ")" repeat?
于 2022-03-05T04:56:29.563 回答