1

我正在尝试使用 OMetaJS 解析 DSL 并生成一个包含令牌值及其在原始流中的索引的 AST。

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

例如对于语法:

export ometa Test {
  start = @<identifier>,
  identifier = (letter | digit)+
}

解析“鲍勃”给出:

{ fromIdx : 0, toIdx : 3 }

如果我从“标识符”中删除“@”,那么解析会给出“Bob”作为结果。我最想得到的是两者的结合:

{ fromIdx : 0, toIdx : 3, value: 'Bob' }

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

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

4

2 回答 2

1

我认为您所要求的内容非常有用,并且可能值得拥有自己的语法糖。我一定会考虑的。同时,您可以执行以下操作:

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

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

希望有帮助!

于 2013-09-03T21:09:35.263 回答
0

鉴于您想要事物和跨度,那么使用 peek 运算符&怎么样?这将返回令牌,但不会消耗输入。所以也许像

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

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

于 2013-09-03T12:14:00.910 回答