semicolon continuation

This commit is contained in:
Celestino Amoroso 2024-12-07 07:18:32 +01:00
parent f8d83ee5b7
commit e251d499d6
2 changed files with 40 additions and 8 deletions

View File

@ -1 +1 @@
1.12.0 15
1.12.0 51

46
main.go
View File

@ -85,11 +85,15 @@ func goInteractiveReadline(opt *Options, ctx expr.ExprContext, r io.Reader) {
fmt.Print(intro)
rl.SetPrompt(mainPrompt)
for line, err := rl.ReadLine(); err == nil; line, err = rl.ReadLine() {
if len(line) > 0 && line[len(line)-1] == '\\' {
sb.WriteString(line[0 : len(line)-1])
if continuation(&sb, line) {
rl.SetPrompt(contPrompt)
continue
}
// if len(line) > 0 && line[len(line)-1] == '\\' {
// sb.WriteString(line[0 : len(line)-1])
// rl.SetPrompt(contPrompt)
// continue
// }
rl.SetPrompt(mainPrompt)
sb.WriteString(line)
source := strings.TrimSpace(sb.String())
@ -116,11 +120,14 @@ func goInteractive(opt *Options, ctx expr.ExprContext, r io.Reader) {
fmt.Print(mainPrompt)
reader := bufio.NewReaderSize(r, 1024)
for line, err := reader.ReadString('\n'); err == nil && line != "exit\n"; line, err = reader.ReadString('\n') {
if strings.HasSuffix(line, "\\\n") {
sb.WriteString(line[0 : len(line)-2])
fmt.Print(contPrompt)
if continuation(&sb, line) {
continue
}
// if strings.HasSuffix(line, "\\\n") {
// sb.WriteString(line[0 : len(line)-2])
// fmt.Print(contPrompt)
// continue
// }
sb.WriteString(line)
source := strings.TrimSpace(sb.String())
// fmt.Printf("source=%q\n", source)
@ -140,12 +147,37 @@ func goInteractive(opt *Options, ctx expr.ExprContext, r io.Reader) {
fmt.Println()
}
func continuation(sb *strings.Builder, line string) (cont bool) {
line = strings.TrimSpace(line)
if strings.HasSuffix(line, "\\") {
sb.WriteString(line[0 : len(line)-1])
cont = true
} else if strings.HasSuffix(line, ";") {
sb.WriteString(line)
cont = true
} else if len(line) > 0 {
if expr.StringEndsWithOperator(line) {
sb.WriteString(line)
cont = true
} else {
fullInput := sb.String() + line
if strings.Count(fullInput, "(") > strings.Count(fullInput, ")") ||
strings.Count(fullInput, "[") > strings.Count(fullInput, "]") ||
strings.Count(fullInput, "{") > strings.Count(fullInput, "}") {
sb.WriteString(line)
cont = true
}
}
}
return
}
func goBatch(opt *Options, ctx expr.ExprContext, r io.Reader) {
var sb strings.Builder
reader := bufio.NewReaderSize(r, 1024)
for line, err := reader.ReadString('\n'); err == nil && line != "exit\n"; line, err = reader.ReadString('\n') {
if strings.HasSuffix(line, "\\\n") {
sb.WriteString(line[0 : len(line)-2])
if continuation(&sb, line) {
continue
}
sb.WriteString(line)