我正在使用 JParsec3 创建一个 DSL。解析/链接分两个阶段完成:
- 将语言解析为中间对象
- 链接对象并将其转换为可执行对象
在第 1 阶段创建的对象可以引用其他尚未解析的对象,因此需要 2 次。现在,对于链接错误消息,我需要将用户发送到文件中他们引用不存在的项目的位置。为此,我需要将位置附加到中间对象。
我怎么做?
谢谢!
这似乎是一个非常受欢迎的话题,因为有几个 PR 和与此相关的问题。这是最新的https://github.com/abailly/jparsec/pull/16,它发布了 2.1(在 maven Central 中可用)。进行了长时间的讨论(https://github.com/abailly/jparsec/issues/5),设想了各种解决方案,但我们决定不包括该Locatable
功能(还没有?)。
所以基本上,从 2.1 开始,您可以使用withSource()
组合器或返回流中已解析位置的“老式”INDEX 解析器。这是来自@fluentfuture 的建议:
Mapper.curry(LocationAnnotated.class).sequence(Parsers.INDEX, parser, Parsers.INDEX);
public class LocationAnnotated<T> {
public LocationAnnotated(int begin, T value, int end) {...}
}