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 "" 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: lexident:
declare char declare char
declare isbeforea declare isbeforea
@ -199,62 +221,45 @@ parsestatcalc indent:
parseblock indent/ parseblock indent/
parsestatif indent: parsestatif indent:
declare labelempty
declare labelnotempty
declare strlenvar
declare strnotemptyvar
calc strlenvar makelocalvar
calc strnotemptyvar makelocalvar
calc labelempty makelocallabel
calc labelnotempty makelocallabel
skipchar " " skipchar " "
declare strlenvar
calc strlenvar mapgetkey "localvarused" "" ""
calc strlenvar add strlenvar "1"
mapsetkey "localvarused" "" strlenvar
trace strlenvar
emit indent emit indent
emit "%tmp"
emit strlenvar emit strlenvar
emit " = call i64 @__strlen(" emit " = call i64 @__strlen("
parseexprvarref parseexprvarref
skipchar eol skipchar eol
emitln ")" emitln ")"
declare strnotemptyvar
calc strnotemptyvar mapgetkey "localvarused" "" ""
calc strnotemptyvar add strnotemptyvar "1"
mapsetkey "localvarused" "" strnotemptyvar
trace strnotemptyvar
emit indent emit indent
emit "%tmp"
emit strnotemptyvar emit strnotemptyvar
emit " = icmp ne i64 %tmp" emit " = icmp ne i64 "
emit strlenvar emit strlenvar
emitln ", 0" 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 indent
emit "br i1 %tmp" emit "br i1 "
emit strnotemptyvar emit strnotemptyvar
emit ", label %lbl" emit ", label %"
emit labelnotempty emit labelnotempty
emit ", label %lbl" emit ", label %"
emitln labelempty emitln labelempty
emit "lbl"
emit labelnotempty emit labelnotempty
emitln ":" emitln ":"
declare indentt declare indentt
calc indentt increaseindent indent calc indentt increaseindent indent
parseblock indentt parseblock indentt
emit "lbl"
emit labelempty emit labelempty
emitln ":" emitln ":"
@ -262,22 +267,39 @@ parsestatif indent:
/ /
parsestatforever indent: parsestatforever indent:
declare endlabel
declare indentt declare indentt
emit indent declare startlabel
emitln "while (1)"
emit indent calc endlabel makelocallabel
emitln "{" calc startlabel makelocallabel
skipchar eol
calc indentt increaseindent indent calc indentt increaseindent indent
mapsetkey "foreverstatendlabel" "" endlabel
emit indent
emit "br label %"
emitln startlabel
emit startlabel
emitln ":"
skipchar eol
parseblock indentt parseblock indentt
emit indent emit indent
emitln "}" emit "br label %"
emitln startlabel
emit endlabel
emitln ":"
return return
/ /
parsestatbreak indent: parsestatbreak indent:
declare endlabel
calc endlabel mapgetkey "foreverstatendlabel" "" "?"
emit indent emit indent
emitln "break;" emit "br label %"
emitln endlabel
skipchar eol skipchar eol
return return
/ /
@ -569,6 +591,9 @@ parseblock indent:
/ /
parsefunc: parsefunc:
mapsetkey "localvarused" "" "0"
mapsetkey "locallabelused" "" "0"
declare char declare char
declare first declare first
declare funcid declare funcid