59 lines
1.7 KiB
Go
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
|
|
}
|