Files
2025-09-24 00:54:08 +08:00

59 lines
1.7 KiB
Go

package parser
import (
"regexp"
"strings"
)
// ErlangFunction 表示 Erlang 函数
type ErlangFunction struct {
Name string // 函数名
Arity int // 参数个数
Parameters []string // 参数列表
Comments []string // 函数注释
StartLine int // 函数起始行号
EndLine int // 函数结束行号
Export bool // 是否被导出
KeyMap map[string]map[string][]string // 注解
}
func (function *ErlangFunction) ParseComments() ErlangFunction {
var keyMap = make(map[string]map[string][]string)
//var parameters = make(map[string]string)
for _, comment := range function.Comments {
// 匹配注解格式: @keyword(param1=value1, param2=value2)
re := regexp.MustCompile(`@(\w+)(?:\s*\((.*)\))?`)
matches := re.FindStringSubmatch(comment)
if len(matches) < 2 {
continue
}
keyword := matches[1]
parameters, is := keyMap[keyword]
if !is {
parameters = make(map[string][]string)
}
// 解析参数
if len(matches) > 2 && matches[2] != "" {
paramsStr := matches[2]
paramRe := regexp.MustCompile(`(\w+)\s*=\s*('[^']*'|"[^"]*"|[^,]+)`)
paramMatches := paramRe.FindAllStringSubmatch(paramsStr, -1)
for _, match := range paramMatches {
if len(match) >= 3 {
value := strings.TrimSpace(match[2])
// 移除引号
value = strings.Trim(value, `'"`)
parameters[strings.TrimSpace(match[1])] = append(parameters[strings.TrimSpace(match[1])], value)
}
}
}
keyMap[keyword] = parameters
}
function.KeyMap = keyMap
return *function
}