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