From 449a89d6b33ddb01813273ed758fe2edf8b20e1e Mon Sep 17 00:00:00 2001 From: "Johan B.W. de Vries" Date: Sun, 18 Jan 2026 15:05:21 +0100 Subject: [PATCH] More work --- 3-lang0ll/lang0ll.lang0 | 103 +++++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/3-lang0ll/lang0ll.lang0 b/3-lang0ll/lang0ll.lang0 index 6d50f3d..c7ee590 100644 --- a/3-lang0ll/lang0ll.lang0 +++ b/3-lang0ll/lang0ll.lang0 @@ -18,6 +18,28 @@ emitln data: return "" / +makelocalvar: + declare prevvar + declare newvar + declare result + calc prevvar mapgetkey "localvarused" "" "" + calc newvar add prevvar "1" + mapsetkey "localvarused" "" newvar + calc result add "%tmp" newvar + return result +/ + +makelocallabel: + declare prevlabel + declare newlabel + declare result + calc prevlabel mapgetkey "locallabelused" "" "" + calc newlabel add prevlabel "1" + mapsetkey "locallabelused" "" newlabel + calc result add "lbl" newlabel + return result +/ + lexident: declare char declare isbeforea @@ -199,62 +221,45 @@ parsestatcalc indent: parseblock indent/ parsestatif indent: + declare labelempty + declare labelnotempty + declare strlenvar + declare strnotemptyvar + + calc strlenvar makelocalvar + calc strnotemptyvar makelocalvar + + calc labelempty makelocallabel + calc labelnotempty makelocallabel + skipchar " " - declare strlenvar - calc strlenvar mapgetkey "localvarused" "" "" - calc strlenvar add strlenvar "1" - mapsetkey "localvarused" "" strlenvar - trace strlenvar emit indent - emit "%tmp" emit strlenvar emit " = call i64 @__strlen(" parseexprvarref skipchar eol emitln ")" - - declare strnotemptyvar - calc strnotemptyvar mapgetkey "localvarused" "" "" - calc strnotemptyvar add strnotemptyvar "1" - mapsetkey "localvarused" "" strnotemptyvar - trace strnotemptyvar - emit indent - emit "%tmp" emit strnotemptyvar - emit " = icmp ne i64 %tmp" + emit " = icmp ne i64 " emit strlenvar emitln ", 0" - declare labelnotempty - calc labelnotempty mapgetkey "locallabelused" "" "" - calc labelnotempty add labelnotempty "1" - mapsetkey "locallabelused" "" labelnotempty - trace labelnotempty - - declare labelempty - calc labelempty mapgetkey "locallabelused" "" "" - calc labelempty add labelempty "1" - mapsetkey "locallabelused" "" labelempty - trace labelempty - emit indent - emit "br i1 %tmp" + emit "br i1 " emit strnotemptyvar - emit ", label %lbl" + emit ", label %" emit labelnotempty - emit ", label %lbl" + emit ", label %" emitln labelempty - emit "lbl" emit labelnotempty emitln ":" declare indentt calc indentt increaseindent indent parseblock indentt - emit "lbl" emit labelempty emitln ":" @@ -262,22 +267,39 @@ parsestatif indent: / parsestatforever indent: + declare endlabel declare indentt - emit indent - emitln "while (1)" - emit indent - emitln "{" - skipchar eol + declare startlabel + + calc endlabel makelocallabel + calc startlabel makelocallabel calc indentt increaseindent indent + + mapsetkey "foreverstatendlabel" "" endlabel + + emit indent + emit "br label %" + emitln startlabel + emit startlabel + emitln ":" + skipchar eol parseblock indentt emit indent - emitln "}" + emit "br label %" + emitln startlabel + emit endlabel + emitln ":" + return / parsestatbreak indent: + declare endlabel + calc endlabel mapgetkey "foreverstatendlabel" "" "?" + emit indent - emitln "break;" + emit "br label %" + emitln endlabel skipchar eol return / @@ -569,6 +591,9 @@ parseblock indent: / parsefunc: + mapsetkey "localvarused" "" "0" + mapsetkey "locallabelused" "" "0" + declare char declare first declare funcid