Menhir-获取间隔之间的值

Menhir- get values between interval

我在 parser.mly 中得到了这条规则:

intervalue:
| c = CST(* True False 1 7 89 "sfr" *)
    { Ecst c }
| id = ident (* a-z [a-z]* *)
    { Eident id }
| iv = LSQ l = separated_list(TWOPoints, intervalue) RSQ /* [1..4]*/
    { Elist l }
;

我需要将[start .. end]的值传递给list "l"。示例 ([1..4])。我在手册中搜索,separated_list(TWOPoints, intervalue) 只得到值 1 和 4。但我需要 1 到 4 之间的所有值,包括像这样的 [1..2..3..4],但不必这样做详尽无遗。

据我所知,

separated_list 没有反映您想要的 syntax。但是,也没有使用 intervalue 作为区间的限制。

separated_list 不正确,因为它用于由定界符分隔的任意正数元素的列表。特别是,separated_list(TWOPoints, intervalue) 不仅会匹配 1..4,还会匹配 11..4..7 等。那些其他的东西包括嵌套的 intervalues,例如 2..[4..7],这似乎不太可能是一个理想的结构(尽管因为我不知道你的语言是什么样的,也许它是)。

您似乎在错误地认为使用 separated_list 是将缩减转换为 OCanl 列表的唯一方法。事实并非如此,因为您可以使用 OCaml 的全部功能;你可以把制作写成

| LSQ low = CST TWOPoints high = CST RSQ     { [ low high] }

甚至

| LSQ low = CST TWOPoints high = CST RSQ     { [ low .. high] }

尽管这不适用于所有可能的 CST 标记(例如 [1 .. "a"])。此外,它不允许使用非常数限制,例如 [1 .. limit].

但是将语法与 运行-time 语义混合在一起几乎肯定不是您想要的。您将如何处理上面示例 ([1 .. limit]) 中的程序文​​本,其中 limit 是一个变量,将在程序执行期间分配一个值? (或者甚至是许多值,因为程序在循环中执行。)解析器应该限制自己生成要执行的程序的有用表示,并且最有可能的生产规则将是这样的(其中 Value 需要根据实际需要的语法定义):+

| LSQ low = Value TWOPoints high = Value RSQ     { Einterval low high }