我在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 }
;我需要传递给列表"l“开始的值..。结束。例(1.4)。我在手册中搜索,separated_list(TWOPoints, intervalue)只得到1和4的值,但我需要在1到4之间的所有值,其中包括类似1..2..3.4的内容,但不需要穷尽地去做。
发布于 2019-12-16 17:46:06
据我所见,separated_list没有反映您想要的语法。但是,对于区间的限制,也不使用intervalue。
separated_list是不正确的,因为它用于由分隔符分隔的任何正数元素的列表。特别是,separated_list(TWOPoints, intervalue)不仅将与1..4相匹配,还将与1和1..4..7等其他方面相匹配。这些其他的东西包括嵌套的intervalue,例如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].
但是,将语法与运行时语义相结合几乎肯定不是您想要的。您将如何处理程序文本,如上面的示例([1 .. limit]),其中limit是一个变量,在执行程序时将被分配一个值?(甚至是许多值,因为程序在循环中执行。)解析器应该限制自己生成要执行的程序的有用表示,最有可能的生成规则是这样的(需要根据实际需要的语法定义Value ):+。
| LSQ low = Value TWOPoints high = Value RSQ { Einterval low high }https://stackoverflow.com/questions/59348277
复制相似问题