首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新线路的政府保留

新线路的政府保留
EN

Stack Overflow用户
提问于 2017-08-11 09:27:33
回答 3查看 1.5K关注 0票数 0

当用gofmt格式化go源代码时,它保留换行符,以便将项目分组。我感兴趣的是这是如何实现的。我试着查看github golang/go中的源代码,但没有立即找到它。如果你看看https://github.com/golang/go/blob/master/src/go/printer/printer.go#L979

代码语言:javascript
复制
// intersperse extra newlines if present in the source

打印机如何知道源中存在额外的换行符?有人能把我引向正确的方向吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-27 13:34:55

gofmt处理AST。当您查看https://golang.org/pkg/go/ast时,您将看到每个节点都有函数Pos()和End(),它们分别返回起始和结束的token.Pos。这些基本上是源文件中的偏移量,因此对行号/中断一无所知。

但是,当与token.Fileset组合时,这样的token.Pos可以转换为包含行号的token.Position。gofmt在函数printer.go:lineFor()中这样做。

实际插入行符是在nodes.go:linebreak()中完成的。换行器()的第一个参数是通过在相应的lineFor()上调用前面提到的token.Pos ()获得的行号。该函数计算此行号与最后打印的标记的行号之间的差异(在struct打印机的pos字段中跟踪)。这将告诉它,现在要打印的令牌是否与前一个令牌位于输入文件中的同一行。如果不是,这意味着程序员在原始源中包含了一个或多个换行,而linebreak()最多将输出1行空行。虽然它可以保留所有的输入行中断,但是gofmt的策略是将一系列空行压缩到只有一个空行。

如果您问这个问题的原因是您想要自定义gofmt,请看一下https://github.com/mbenkmann/goformat

票数 1
EN

Stack Overflow用户

发布于 2017-08-12 16:13:01

与大多数词汇者不同的是,go lexer包含的标记通常被编译器的lexer删除或删除。lexer发出的令牌流包括注释的标记、隐含的分号、换行符、formfeeds (FF)和其他空格。这允许使用相同的令牌流重新生成源,并创建编译器所需的结构,如AST。

票数 2
EN

Stack Overflow用户

发布于 2017-08-11 09:44:05

internal.go 套餐 `第40-41行中有以下内容:

// Insert使用的是;,而不是换行符,以便psrc中的行号//与src中的行号匹配。

然后这个:

代码语言:javascript
复制
psrc := append([]byte("package p;"), src...)
file, err = parser.ParseFile(fset, filename, psrc, parserMode)

这就是你要找的吗?如果我没弄错你的问题。

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

https://stackoverflow.com/questions/45631563

复制
相关文章

相似问题

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