首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用megaparsec获取AST节点的源码范围?

如何使用megaparsec获取AST节点的源码范围?
EN

Stack Overflow用户
提问于 2019-12-20 03:40:33
回答 1查看 236关注 0票数 3

我正在尝试为我正在解析的某个源文件生成一个源映射,并希望获得每个节点的范围。getSourcePos只给出一个节点的行(src:start position:列)。如何获得其最终位置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 05:14:34

如果你想为每个词位构造一个这样的源跨度:

代码语言:javascript
复制
data Span = Span SourcePos SourcePos

data Spanned a = Spanned Span a

您只需调用getSourcePos两次,一次在标记的开头,一次在标记的结尾,然后再使用任何空格,假设您处于词法分析阶段。我在过去使用过这样的结构,以使其更方便:

代码语言:javascript
复制
-- Augment a parser with a source span.
spanned :: Parser (a, SourcePos) -> Parser (Spanned a)
spanned parser = do
  start <- getSourcePos
  (x, end) <- parser
  pure (Spanned (Span start end) x)

-- Consume whitespace following a lexeme, but record
-- its endpoint as being before the whitespace.
lexeme :: Parser a -> Parser (a, SourcePos)
lexeme parser = (,) <$> parser <*> (getSourcePos <* whitespace)

请记住,根据文档,getSourcePos的成本有点高,如果我没记错的话,这取决于源文件的大小。

如果一个AST是用跨度标注的,你可以计算树的任何部分的跨度,方法是用一个包含它们的并集(或者更具体地说,它们的边界框)的Span的么半群实例在它上面折叠,即a <> b是从(beginRow a, beginCol a) `min` (beginRow b, beginCol b)(endRow a, endCol a) `max` (endRow b, endCol b)的跨度。

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

https://stackoverflow.com/questions/59415953

复制
相关文章

相似问题

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