More work
This commit is contained in:
parent
c9029b1216
commit
449a89d6b3
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user