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

Javascript 使用包含标记值和位置的OMetaJS创建AST,javascript,ometa,Javascript,Ometa,我试图用OMetaJS解析DSL,并生成一个AST,其中包括原始流中的令牌值及其索引 我知道我可以使用索引捕获规则语法(@)给我一个对象,该对象包含构成令牌的索引,但是否可以捕获该索引以及令牌值 例如语法: export ometa Test { start = @<identifier>, identifier = (letter | digit)+ } 如果我从“identifier”中删除“@”,那么解析结果就是“Bob”。理想情况下,我希望得到的是两者的结合: {

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

我知道我可以使用索引捕获规则语法(
@
)给我一个对象,该对象包含构成令牌的索引,但是否可以捕获该索引以及令牌值

例如语法:

export ometa Test {
  start = @<identifier>,
  identifier = (letter | digit)+
}
如果我从“identifier”中删除“@”,那么解析结果就是“Bob”。理想情况下,我希望得到的是两者的结合:

{ fromIdx : 0, toIdx : 3, value: 'Bob' }
我当然可以破解源代码,但是有更好的方法吗


我想同时拥有价值和地位,因为我正在尝试创建DSL的可视化表示,例如允许编辑标识符名称。在这种情况下,我需要知道标识符在原始源代码中的何处出现,以便我可以修改它。

如果您想要这个东西和跨度,那么使用peek操作符
&
怎么样?它将返回令牌,但不使用输入。所以可能是

spannedThing = (&identifier:token @identifier:span) -> combineThemSomehow(token, span)

你可以做你想做的吗?(警告:我的OMeta生锈了;上面可能没有使用正确的语法。)您可以将其转换为参数化规则。

如果您想要这个东西和跨度,那么使用peek操作符
&
怎么样?它将返回令牌,但不使用输入。所以可能是

spannedThing = (&identifier:token @identifier:span) -> combineThemSomehow(token, span)

你可以做你想做的吗?(警告:我的OMeta生锈了;上面可能没有使用正确的语法。)您可以将其转化为参数化规则。

我认为您所要求的非常有用,可能应该有自己的语法。我一定会考虑的。同时,您可以执行以下操作:

ometa Test {
  parse :r = @<apply(r):value>:node !(node.value = value) -> node,

  identifier = (letter | digit)+,
  start = parse("identifier")
}
ometa测试{
解析:r=@:node!(node.value=value)->node,
标识符=(字母|数字)+,
start=parse(“标识符”)
}

希望有帮助

我认为你所要求的是非常有用的,而且可能应该有自己的语法糖。我一定会考虑的。同时,您可以执行以下操作:

ometa Test {
  parse :r = @<apply(r):value>:node !(node.value = value) -> node,

  identifier = (letter | digit)+,
  start = parse("identifier")
}
ometa测试{
解析:r=@:node!(node.value=value)->node,
标识符=(字母|数字)+,
start=parse(“标识符”)
}

希望有帮助

从未想过使用前瞻操作符。好主意。当然这意味着你要对所有东西进行两次解析,对吗?无论如何,我没有找到更好的方法来回答这个问题。但是对于记录,我最终只使用了
@
操作符,并将其索引到原始源文本中。嗯,解析应该被记录下来,所以它不应该像2倍的性能一样糟糕。我不知道OMeta/JS,但这就是它在OMeta/Squeak中的工作方式。@Frank:我最近一直在看OMeta,发现一些上面有你名字的旧东西和很多断开的链接。皮提亚还存在吗?(很抱歉发表了离题评论,但这似乎是联系你最简单的方式。)@MasonWheeler噢,天哪,我可能在什么地方找到了它。如果你给我发了封邮件,请把我的名字和姓氏加上一个字母。并将其发送到gmail.com域-我会在可能的时候查看(最快将在一周左右)。从未想过使用lookahead操作符。好主意。当然这意味着你要对所有东西进行两次解析,对吗?无论如何,我没有找到更好的方法来回答这个问题。但是对于记录,我最终只使用了
@
操作符,并将其索引到原始源文本中。嗯,解析应该被记录下来,所以它不应该像2倍的性能一样糟糕。我不知道OMeta/JS,但这就是它在OMeta/Squeak中的工作方式。@Frank:我最近一直在看OMeta,发现一些上面有你名字的旧东西和很多断开的链接。皮提亚还存在吗?(很抱歉发表了离题评论,但这似乎是联系你最简单的方式。)@MasonWheeler噢,天哪,我可能在什么地方找到了它。如果你给我发了封邮件,请把我的名字和姓氏加上一个字母。并将其发送到gmail.com域-我会在可能的时候查看(最快将在一周左右)。