Skip to content

Commit ad7edfc

Browse files
committed
v0.9.0 Parser without PreMain, but it works
1 parent 3c441c4 commit ad7edfc

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

pkg/parser/parser.go

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package parser
33
import (
44
"fmt"
55
"regexp"
6-
"strconv"
76
"strings"
87

98
"github.com/charmbracelet/log"
@@ -57,28 +56,9 @@ func parseMainBlock(s string) []string {
5756
return o
5857
}
5958

60-
func parseVarBlock(s string) []string {
61-
o := []string{}
62-
s = strings.TrimSpace(s)
63-
rx := regexp.MustCompile(`var +(((.+) *: *(.+) *; *)+) +begin`)
64-
s = rx.FindStringSubmatch(s)[1]
65-
log.Debug("VAR_BLOCK", "s", s)
66-
vars := strings.Split(s, ";")
67-
vars = vars[:len(vars)-1]
68-
for i := 0; i < len(vars); i++ {
69-
rx1 := regexp.MustCompile(`.* *:`)
70-
rx2 := regexp.MustCompile(`: *.*`)
71-
name := strings.Trim(rx1.FindString(vars[i]), " :")
72-
typ := strings.Trim(rx2.FindString(vars[i]), " :")
73-
id := "var" + strconv.Itoa(i)
74-
if i < len(vars)-1 {
75-
idnext := "var" + strconv.Itoa(i+1)
76-
o = append(o, fmt.Sprintf("%s-->%s", id, idnext))
77-
}
78-
log.Debug("VAR", "name", name, "type", typ)
79-
o = append(o, fmt.Sprintf("%s[Объявить %s типа %s]", id, name, typ))
80-
}
81-
return o
59+
func parsePreMain(string) []string {
60+
log.Debug("PreMain is not supported in this version")
61+
return []string{""}
8262
}
8363

8464
func ParseFile(lines []string) []string {
@@ -89,19 +69,37 @@ func ParseFile(lines []string) []string {
8969
return parseCode(strings.Join(lines, " "))
9070
}
9171

72+
func findMainBlock(s string) (int, int) {
73+
end := strings.Index(s, "end.") + 3
74+
scope := 0
75+
for i := end; i >= 0; i-- {
76+
l := s[i:]
77+
if strings.HasPrefix(l, "end ") || strings.HasPrefix(l, "end;") {
78+
scope++
79+
} else if strings.HasPrefix(l, "begin ") || strings.HasPrefix(l, "begin;") {
80+
if scope == 0 {
81+
return i, end
82+
}
83+
scope--
84+
}
85+
}
86+
return 0, end
87+
}
88+
9289
func parseCode(s string) []string {
9390
o := []string{"flowchart TB"}
9491
s = strings.ToLower(s)
9592
s = strings.TrimSpace(s)
9693
s = strings.Trim(s, "\r")
9794
log.Debug("CODE", "s", s)
98-
var_rx := regexp.MustCompile(`var +(((.+) *: *(.+) *; *)+) +begin`)
99-
if var_rx.MatchString(s) {
100-
o = append(o, parseVarBlock(s)...)
95+
premain_rx := regexp.MustCompile(`(.*?) +begin`)
96+
if premain_rx.MatchString(s) {
97+
o = append(o, parsePreMain(premain_rx.FindStringSubmatch(s)[1])...)
10198
}
99+
beg, end := findMainBlock(s)
100+
mb_s := s[beg:(end + 1)]
102101
mb_rx := regexp.MustCompile(`begin(.*)end\.`)
103-
log.Debug("MAINBLOCK", "len", len(mb_rx.FindStringSubmatch(s)))
104-
o = append(o, parseMainBlock(mb_rx.FindStringSubmatch(s)[1])...)
102+
o = append(o, parseMainBlock(mb_rx.FindStringSubmatch(mb_s)[1])...)
105103

106104
return o
107105
}

0 commit comments

Comments
 (0)