scanner := bufio.NewScanner(text)
rule := ""
var lineno int
+ var ruleLineno int // line number of "->"
for scanner.Scan() {
lineno++
line := scanner.Text()
if !strings.Contains(rule, "->") {
continue
}
+ if ruleLineno == 0 {
+ ruleLineno = lineno
+ }
if strings.HasSuffix(rule, "->") {
continue
}
if op[len(op)-1] == ')' {
op = op[:len(op)-1] // rule has only opcode, e.g. (ConstNil) -> ...
}
- loc := fmt.Sprintf("%s.rules:%d", arch.name, lineno)
+ loc := fmt.Sprintf("%s.rules:%d", arch.name, ruleLineno)
if isBlock(op, arch) {
blockrules[op] = append(blockrules[op], Rule{rule: rule, loc: loc})
} else {
oprules[op] = append(oprules[op], Rule{rule: rule, loc: loc})
}
rule = ""
+ ruleLineno = 0
}
if err := scanner.Err(); err != nil {
log.Fatalf("scanner failed: %v\n", err)