More work

This commit is contained in:
Johan B.W. de Vries 2026-01-18 15:05:21 +01:00
parent c9029b1216
commit 449a89d6b3

View File

@ -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