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
,还会匹配 1
和 1..4..7
等。那些其他的东西包括嵌套的 intervalue
s,例如 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 }
我在 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
,还会匹配 1
和 1..4..7
等。那些其他的东西包括嵌套的 intervalue
s,例如 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 }