@@ -3,7 +3,6 @@ package parser
33import (
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
8464func 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+
9289func 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