posFlag需要什么类型的编码?

huangapple go评论73阅读模式
英文:

What kind of encoding does posFlag requires?

问题

你可以使用正则表达式来提取 /pathto/file.go:40:32 中的行号和列号,然后将其拼接到 posFlag 参数中。以下是一个示例代码:

import (
    "fmt"
    "regexp"
)

func main() {
    position := "/pathto/file.go:40:32"
    re := regexp.MustCompile(`:(\d+):(\d+)`)
    matches := re.FindStringSubmatch(position)
    if len(matches) == 3 {
        line := matches[1]
        column := matches[2]
        posFlag := fmt.Sprintf("%s:#%s", position[:len(position)-len(matches[0])], line)
        fmt.Println(posFlag)
    }
}

这段代码使用正则表达式 :(\d+):(\d+) 来匹配行号和列号。然后,通过 fmt.Sprintf 将路径和行号拼接成 posFlag 参数的格式 /pathto/file.go:#40。你可以根据自己的需求进行修改和调整。

英文:

How can I encode the position of the form /pathto/file.go:40:32 which is returned by token.Position.String() to a posFlag param required by ParseQueryPos which looks like /pathto/file.go:#550.

Why?

I'm using the Oracle tool to do some static analysis. I need to run Oracle.Query which requires a param of type *QueryPos. The only way to get *QueryPos is using ParseQueryPos.

答案1

得分: 1

tools/pos.go中的代码被ParseQueryPos调用,代码注释如下:

// parsePosFlag解析形如"file:pos"或"file:start,end"的字符串,
// 其中pos、start、end匹配#%d并表示字节偏移量,返回其组成部分。

如果你真的需要将line:column字符串转换为字节偏移量,你需要查看文件内容并计算到达该行列的字节数(包括换行符)。但由于你正在使用token.Position,看起来你可以从token.Position.Offset中获取所需的信息。

英文:

The source to tools/pos.go called by ParseQueryPos says

// parsePosFlag parses a string of the form "file:pos" or
// file:start,end" where pos, start, end match #%d and represent byte
// offsets, and returns its components.

If you really had to convert from line:column strings, you'd look at the file contents and count up bytes (including newlines) leading to that line:column. But since you're working with a token.Position, it looks like you can get what you need from token.Position.Offset.

huangapple
  • 本文由 发表于 2015年1月18日 15:51:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/28008164.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定