首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用包含标记值和位置的OMetaJS创建AST

用包含标记值和位置的OMetaJS创建AST
EN

Stack Overflow用户
提问于 2013-08-17 16:09:07
回答 2查看 129关注 0票数 1

我试图用OMetaJS解析一个DSL,并生成一个AST,它包括一个令牌值以及原始流中的索引。

我知道我可以使用索引捕获规则语法( @<rule> )为我提供一个对象,该对象包含构建令牌的索引,但是否有可能捕获该对象以及令牌值?

用于语法的:

代码语言:javascript
复制
export ometa Test {
  start = @<identifier>,
  identifier = (letter | digit)+
}

解析"Bob“会给出:

代码语言:javascript
复制
{ fromIdx : 0, toIdx : 3 }

如果我从‘标识符’中删除'@‘,那么解析结果就是"Bob“。理想情况下,我想得到的是两者的结合:

代码语言:javascript
复制
{ fromIdx : 0, toIdx : 3, value: 'Bob' }

我当然可以破解来源,但是有更好的方法吗?

我希望同时具有值和位置,因为我试图创建DSL的可视化表示形式,例如,它允许编辑标识符名。在这种情况下,我需要知道标识符在原始源中的位置,这样我就可以修改它了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-03 12:14:00

假设您想要这个东西和跨度,那么使用peek操作符&怎么样?它将返回令牌,但不使用输入。所以也许就像

代码语言:javascript
复制
spannedThing = (&identifier:token @identifier:span) -> combineThemSomehow(token, span)

可能会做你想做的事?(警告:我的OMeta生锈了,上面可能没有使用正确的语法。)你可以把它变成一个参数化的规则。

票数 0
EN

Stack Overflow用户

发布于 2013-09-03 21:09:35

我认为你所要求的是非常有用的,并且应该有它自己的语法糖。我一定会考虑的。同时,你也可以这样做:

代码语言:javascript
复制
ometa Test {
  parse :r = @<apply(r):value>:node !(node.value = value) -> node,

  identifier = (letter | digit)+,
  start = parse("identifier")
}

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18290812

复制
相关文章

相似问题

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