首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Menhir-得到区间间的值

Menhir-得到区间间的值
EN

Stack Overflow用户
提问于 2019-12-15 21:39:11
回答 1查看 68关注 0票数 0

我在parser.mly中有这样的规则:

代码语言:javascript
复制
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的内容,但不需要穷尽地去做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 17:46:06

据我所见,separated_list没有反映您想要的语法。但是,对于区间的限制,也不使用intervalue

separated_list是不正确的,因为它用于由分隔符分隔的任何正数元素的列表。特别是,separated_list(TWOPoints, intervalue)不仅将与1..4相匹配,还将与11..4..7等其他方面相匹配。这些其他的东西包括嵌套的intervalue,例如2..[4..7],它似乎不太可能是一个理想的构造(虽然我不知道您的语言是什么样子,也许它是)。

您似乎错误地认为使用separated_list是将简化为OCanl列表的唯一方法。这不是真的,因为您可以使用OCaml的全部功能;您可以将该产品编写为

代码语言:javascript
复制
| LSQ low = CST TWOPoints high = CST RSQ     { [ low high] }

甚至

代码语言:javascript
复制
| LSQ low = CST TWOPoints high = CST RSQ     { [ low .. high] }

尽管这并不适用于所有可能的CST令牌(如[1 .. "a"])。而且,它也不允许使用非常量限制,如[1 .. limit].

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

代码语言:javascript
复制
| LSQ low = Value TWOPoints high = Value RSQ     { Einterval low high }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59348277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档