(Arne Babenhauserheide)
2013-08-25: wisp-guele.w can now parse some examples but still fails at itself wisp-guele.w can now parse some examples but still fails at itself and reorders empty line sand code
diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -141,7 +141,9 @@ define : line-comment line define : line-continues? line . "Check whether the line is a continuation of a previous line (should not start with a bracket)." - string-prefix? ". " : line-content line + if : equal? #f : line-content line + . #f ; this is the EOF line. It does not continue (to ensure that the last brackets get closed) + string-prefix? ". " : line-content line define : line-empty-code? line . "Check whether the code-part of the line is empty: contains only whitespace and/or comment." @@ -355,9 +357,6 @@ define : line-add-starting-bracket line define : line-add-closing-brackets line number . "Add a closing bracket to the line." - display number - display line - newline list line-indent line string-append @@ -367,31 +366,49 @@ define : line-add-closing-brackets line define : line-indent-brackets-to-close line-indent levels line-continues prev-continues . "Find the number of brackets to close to reduce the levels to the line-indent." + ; adjust the levels until the highest indentation level is equal + ; to the indentation of the next line. Then check for + ; continuation. let closer : (bracketstoclose 0) (rest levels) - if : < line-indent : list-ref rest 0 - closer (+ bracketstoclose 1) (list-tail rest 1) - ; TODO: if next-indent is not equal to list-ref levels 0, that’s a syntax error - . bracketstoclose + let : : highest-level : list-ref rest 0 + ; finish-condition + if : = line-indent highest-level + if prev-continues + . bracketstoclose + + 1 bracketstoclose + if : > line-indent highest-level + closer (- bracketstoclose 1) : append (list line-indent) rest + closer (+ bracketstoclose 1) : list-tail rest 1 + define : line-indent-brackets-to-open line-indent levels line-continues prev-continues - . "Find the number of brackets to close to reduce the levels to the line-indent." - ; TODO: implement - throw 'not-implemented-error + . "Find the number of brackets to open to fit the line-indent and continuation marker." + if line-continues + . 0 + . 1 +define : line-indent-levels-adjust levels next-indent + . "Add or remove levels so the highest remaining level matches next-indent." + let adjuster : (lev levels) + let : : highest-level : list-ref lev 0 + if : = next-indent highest-level + . lev + if : > next-indent highest-level + append (list next-indent) lev + adjuster : list-tail lev 1 define : wisp2lisp-parse lisp prev lines . "Parse the body of the wisp-code." + set! prev : wisp2lisp-add-inline-colon-brackets prev ; prev already is a code-line. + if : not : line-continues? prev + set! prev : line-add-starting-bracket prev set! lines : map-in-order wisp2lisp-add-inline-colon-brackets lines let bracketizer : (levels '(0)) (pre prev) (unprocessed lines) (processed lisp) ; levels is the list of levels, with the lowest to the right. i.e: '(12 8 4 0) ; once we processed everything, we pass the bracketizer pre as f one last time if : equal? #f : line-content pre . processed - let* - : next - if : equal? unprocessed '() - list 0 #f #f ; this is the break condition for the next loop! - list-ref unprocessed 0 + let : : next : if (equal? unprocessed '()) (list 0 #f #f) : list-ref unprocessed 0 ; this is the break condition for the next loop! if : line-empty-code? next ; empty lines get silently added, but otherwise ignored bracketizer levels pre list-tail unprocessed 1 @@ -403,70 +420,24 @@ define : wisp2lisp-parse lisp prev lines pre-indent : line-indent pre pre-continues : line-continues? pre next-continues : line-continues? next - bracketstocloseprev : line-indent-brackets-to-close next-indent levels line-continues prev-continues - bracketstoopennext : line-indent-brackets-to-open next-indent levels line-continues prev-continues - newnext : if bracketstoopennext (line-add-starting-bracket next) next + final-line : equal? #f : line-content next + bracketstocloseprev : line-indent-brackets-to-close next-indent levels next-continues pre-continues + bracketstoopennext : line-indent-brackets-to-open next-indent levels next-continues pre-continues + newnext : if final-line next : if (> bracketstoopennext 0) (line-add-starting-bracket next) next newpre : line-add-closing-brackets pre bracketstocloseprev - reducedlevels : list-tail levels 1 - newlevels : if next-continues reducedlevels levels + newlevels : line-indent-levels-adjust levels next-indent bracketizer newlevels newnext - list-tail unprocessed 1 + if final-line unprocessed : list-tail unprocessed 1 append processed : list newpre - -; let : : reallevels : if (not (line-continues? pre)) levels : list-tail levels 1 -; cond -; : > next-indent pre-indent ; I do not need to add brackets to pre, but next a starting bracket, except if it continues -; let : : newlevels : append (list next-indent) reallevels -; bracketizer newlevels -; if : line-continues? next -; . next -; line-add-starting-bracket next -; list-tail unprocessed 1 -; append processed : list pre -; : = next-indent pre-indent ; pre needs a closing bracket, next needs an opening bracket, except if they continue -; bracketizer -; if : and (line-continues? next) (line-continues? pre) -; append (list next-indent) reallevels -; . reallevels -; if : line-continues? next -; . next -; line-add-starting-bracket next -; list-tail unprocessed 1 -; append processed -; list -; if : line-continues? pre -; . pre -; line-add-closing-brackets pre 1 -; : < next-indent pre-indent ; we need to add the correct number of closing brackets to pre and possibly one to next -; let : : bracketstoclose : line-indent-bracketstoclose next-indent reallevels -; newline -; format #t "to close: ~a , prev-indent: ~a, next-indent: ~a , reallevels: ~a , pre: ~a, next: ~a" -; . bracketstoclose pre-indent next-indent reallevels pre next -; newline -; newline -; bracketizer -; list-tail levels bracketstoclose -; if : or (equal? #f (line-content next)) : line-continues? next -; . next -; line-add-starting-bracket next -; if : equal? unprocessed '() -; . unprocessed -; list-tail unprocessed 1 -; append processed -; list -; if : line-continues? pre -; line-add-closing-brackets pre : - bracketstoclose 1 -; line-add-closing-brackets pre bracketstoclose -; + define : wisp2lisp-initial-comments lisp prev lines . "Keep all starting comments: do not start them with a bracket." - ; TODO: currently this adds the first comment twice - let initial-comments : (lisp lisp) (prev prev) (lines lines) - if : equal? lines '() ; file only contained comments, maybe including the hashbang + let skip-initial-comments : (lisp lisp) (prev prev) (lines lines) + if : = 0 : length lines ; file only contained comments, maybe including the hashbang . lisp if : line-empty-code? prev - initial-comments : append lisp : list prev + skip-initial-comments : append lisp : list prev . (list-ref lines 0) (list-tail lines 1) list lisp prev lines @@ -505,12 +476,6 @@ let* textlines : split-wisp-lines text lines : linestoindented textlines lisp : wisp2lisp lines - display : length textlines - newline - display : length lines - newline - ; display : length lisp - newline ; display : list-ref lines 100 ; seems good let show : (processed '()) (unprocessed lisp) when : not : equal? unprocessed '()