我试图用OMetaJS解析一个DSL,并生成一个AST,它包括一个令牌值以及原始流中的索引。
我知道我可以使用索引捕获规则语法( @<rule> )为我提供一个对象,该对象包含构建令牌的索引,但是否有可能捕获该对象以及令牌值?
用于语法的:
export ometa Test {
start = @<identifier>,
identifier = (letter | digit)+
}解析"Bob“会给出:
{ fromIdx : 0, toIdx : 3 }如果我从‘标识符’中删除'@‘,那么解析结果就是"Bob“。理想情况下,我想得到的是两者的结合:
{ fromIdx : 0, toIdx : 3, value: 'Bob' }我当然可以破解来源,但是有更好的方法吗?
我希望同时具有值和位置,因为我试图创建DSL的可视化表示形式,例如,它允许编辑标识符名。在这种情况下,我需要知道标识符在原始源中的位置,这样我就可以修改它了。
发布于 2013-09-03 12:14:00
假设您想要这个东西和跨度,那么使用peek操作符&怎么样?它将返回令牌,但不使用输入。所以也许就像
spannedThing = (&identifier:token @identifier:span) -> combineThemSomehow(token, span)可能会做你想做的事?(警告:我的OMeta生锈了,上面可能没有使用正确的语法。)你可以把它变成一个参数化的规则。
发布于 2013-09-03 21:09:35
我认为你所要求的是非常有用的,并且应该有它自己的语法糖。我一定会考虑的。同时,你也可以这样做:
ometa Test {
parse :r = @<apply(r):value>:node !(node.value = value) -> node,
identifier = (letter | digit)+,
start = parse("identifier")
}希望这能帮上忙!
https://stackoverflow.com/questions/18290812
复制相似问题