Phase 4a: machine states auto-number by declaration order

state KnightMenu = 0 { }  ->  state KnightMenu { }. Machine states now take their
value from declaration order (0,1,2,...); an explicit 'state Name = expr' still
works for the rare non-ordinal case. Removes the magic constants from state
machines (finding #13). Migrated combat.ludic's battle machine; chronorift golden
byte-identical (the ordinals match the old explicit 0-4). Reseeded, fixpoint
holds, test.sh 14/14.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-08-27 16:20:34 +03:00
parent 9a558d6b58
commit fd0b890acc
4 changed files with 427 additions and 394 deletions

View file

@ -379,15 +379,18 @@ state (no more `if phase == N` chains). See the co-op battle in
```ludic
# doc-check: skip — illustrative: elided bodies
machine R_PHASE {
state KnightMenu = 0 { … if is_confirm(k) { …attack… become KnightResolve } }
state KnightResolve = 1 { … become MageMenu }
state EnemyTurn = 4 { … become KnightMenu }
state KnightMenu { … if is_confirm(k) { …attack… become KnightResolve } }
state KnightResolve { … become MageMenu }
state EnemyTurn { … become KnightMenu }
}
```
A `machine <reg>` reads `reg(<reg>)` to pick the state; `become Name` compiles to
`setreg(<reg>, <Name's value>)`. Both lower to plain branches (and `match` runs
on the native LLVM backend too).
States **number themselves by declaration order** (`KnightMenu` is `0`,
`KnightResolve` is `1`, …) — no magic constants. (An explicit `state Name = expr`
is still accepted when a state needs a specific value.) A `machine <reg>` reads
`reg(<reg>)` to pick the state; `become Name` compiles to `setreg(<reg>, <Name's
value>)`. Both lower to plain branches (and `match` runs on the native LLVM
backend too).
## Expressions

View file

@ -9,7 +9,7 @@ system Battle phase Update {
for (e) in query [Stats, {Enemy}] {
machine R_PHASE {
state KnightMenu = 0 {
state KnightMenu {
for (st, pt) in query [Stats, Party] {
if pt.slot == 0 {
if st.hp <= 0 {
@ -46,7 +46,7 @@ system Battle phase Update {
}
}
state KnightResolve = 1 {
state KnightResolve {
if k != 0 {
if e.hp <= 0 {
grant_xp(e.xp)
@ -61,7 +61,7 @@ system Battle phase Update {
}
}
state MageMenu = 2 {
state MageMenu {
for (st, pt) in query [Stats, Party] {
if pt.slot == 1 {
if st.hp <= 0 {
@ -95,7 +95,7 @@ system Battle phase Update {
}
}
state MageResolve = 3 {
state MageResolve {
if k != 0 {
if e.hp <= 0 {
grant_xp(e.xp)
@ -109,7 +109,7 @@ system Battle phase Update {
}
}
state EnemyTurn = 4 {
state EnemyTurn {
if k != 0 {
let done = 0
for (t3) in query [Stats, {Party}] {

View file

@ -4876,21 +4876,23 @@ entry:
%t147 = alloca ptr
%t152 = alloca ptr
%t177 = alloca ptr
%t185 = alloca ptr
%t187 = alloca ptr
%t228 = alloca ptr
%t241 = alloca ptr
%t181 = alloca i32
%t186 = alloca ptr
%t188 = alloca ptr
%t200 = alloca ptr
%t243 = alloca ptr
%t256 = alloca ptr
%t285 = alloca ptr
%t293 = alloca ptr
%t327 = alloca ptr
%t377 = alloca ptr
%t378 = alloca i32
%t379 = alloca i32
%t380 = alloca i32
%t381 = alloca i32
%t409 = alloca ptr
%t430 = alloca ptr
%t271 = alloca ptr
%t300 = alloca ptr
%t308 = alloca ptr
%t342 = alloca ptr
%t392 = alloca ptr
%t393 = alloca i32
%t394 = alloca i32
%t395 = alloca i32
%t396 = alloca i32
%t424 = alloca ptr
%t445 = alloca ptr
%t0 = load ptr, ptr @g_toks
%t1 = getelementptr inbounds %LSlice, ptr %t0, i32 0, i32 0
%t2 = load ptr, ptr %t1
@ -5178,426 +5180,450 @@ then44:
store ptr %t180, ptr %t179
call void @fn_skipnl()
call void @fn_eat_op(ptr @.str66)
store i32 0, ptr %t181
br label %wcond47
wcond47:
%t181 = icmp ne i32 1, 0
br i1 %t181, label %wbody48, label %wend49
%t182 = icmp ne i32 1, 0
br i1 %t182, label %wbody48, label %wend49
wbody48:
call void @fn_skipnl()
%t182 = call i32 @fn_is_op(ptr @.str67)
%t183 = icmp ne i32 %t182, 0
br i1 %t183, label %then50, label %ifend52
%t183 = call i32 @fn_is_op(ptr @.str67)
%t184 = icmp ne i32 %t183, 0
br i1 %t184, label %then50, label %ifend52
then50:
br label %wend49
ifend52:
%t184 = call ptr @fn_eat_id()
store ptr %t184, ptr %t185
%t186 = call ptr @fn_node(i32 25)
store ptr %t186, ptr %t187
%t188 = load ptr, ptr %t187
%t189 = getelementptr inbounds %Str_Node, ptr %t188, i32 0, i32 1
%t190 = call ptr @fn_eat_id()
store ptr %t190, ptr %t189
call void @fn_eat_op(ptr @.str68)
%t191 = load ptr, ptr %t187
%t192 = getelementptr inbounds %Str_Node, ptr %t191, i32 0, i32 5
%t193 = call ptr @fn_expr()
store ptr %t193, ptr %t192
%t185 = call ptr @fn_eat_id()
store ptr %t185, ptr %t186
%t187 = call ptr @fn_node(i32 25)
store ptr %t187, ptr %t188
%t189 = load ptr, ptr %t188
%t190 = getelementptr inbounds %Str_Node, ptr %t189, i32 0, i32 1
%t191 = call ptr @fn_eat_id()
store ptr %t191, ptr %t190
%t192 = call i32 @fn_is_op(ptr @.str68)
%t193 = icmp ne i32 %t192, 0
br i1 %t193, label %then53, label %else54
then53:
%t194 = load i32, ptr @g_pi
%t195 = add i32 %t194, 1
store i32 %t195, ptr @g_pi
%t196 = load ptr, ptr %t188
%t197 = getelementptr inbounds %Str_Node, ptr %t196, i32 0, i32 5
%t198 = call ptr @fn_expr()
store ptr %t198, ptr %t197
br label %ifend55
else54:
%t199 = call ptr @fn_node(i32 30)
store ptr %t199, ptr %t200
%t201 = load ptr, ptr %t200
%t202 = getelementptr inbounds %Str_Node, ptr %t201, i32 0, i32 2
%t203 = load i32, ptr %t181
store i32 %t203, ptr %t202
%t204 = load ptr, ptr %t188
%t205 = getelementptr inbounds %Str_Node, ptr %t204, i32 0, i32 5
%t206 = load ptr, ptr %t200
store ptr %t206, ptr %t205
br label %ifend55
ifend55:
call void @fn_skipnl()
%t194 = load ptr, ptr %t187
%t195 = getelementptr inbounds %Str_Node, ptr %t194, i32 0, i32 4
%t196 = call ptr @fn_block()
store ptr %t196, ptr %t195
%t197 = load ptr, ptr %t177
%t198 = getelementptr inbounds %Str_Node, ptr %t197, i32 0, i32 7
%t199 = load ptr, ptr %t198
%t200 = getelementptr inbounds %LSlice, ptr %t199, i32 0, i32 1
%t201 = getelementptr inbounds %LSlice, ptr %t199, i32 0, i32 2
%t202 = getelementptr inbounds %LSlice, ptr %t199, i32 0, i32 0
%t203 = load i32, ptr %t200
%t204 = load i32, ptr %t201
%t205 = icmp sge i32 %t203, %t204
br i1 %t205, label %grow53, label %put54
grow53:
%t206 = mul i32 %t204, 2
%t207 = icmp eq i32 %t204, 0
%t208 = select i1 %t207, i32 8, i32 %t206
%t209 = getelementptr ptr, ptr null, i32 1
%t210 = ptrtoint ptr %t209 to i64
%t211 = zext i32 %t208 to i64
%t212 = mul i64 %t211, %t210
%t213 = load ptr, ptr %t202
%t214 = call ptr @realloc(ptr %t213, i64 %t212)
store ptr %t214, ptr %t202
store i32 %t208, ptr %t201
br label %put54
put54:
%t215 = load ptr, ptr %t187
%t216 = load ptr, ptr %t202
%t217 = getelementptr inbounds ptr, ptr %t216, i32 %t203
store ptr %t215, ptr %t217
%t218 = add i32 %t203, 1
store i32 %t218, ptr %t200
%t207 = load ptr, ptr %t188
%t208 = getelementptr inbounds %Str_Node, ptr %t207, i32 0, i32 4
%t209 = call ptr @fn_block()
store ptr %t209, ptr %t208
%t210 = load ptr, ptr %t177
%t211 = getelementptr inbounds %Str_Node, ptr %t210, i32 0, i32 7
%t212 = load ptr, ptr %t211
%t213 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 1
%t214 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 2
%t215 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 0
%t216 = load i32, ptr %t213
%t217 = load i32, ptr %t214
%t218 = icmp sge i32 %t216, %t217
br i1 %t218, label %grow56, label %put57
grow56:
%t219 = mul i32 %t217, 2
%t220 = icmp eq i32 %t217, 0
%t221 = select i1 %t220, i32 8, i32 %t219
%t222 = getelementptr ptr, ptr null, i32 1
%t223 = ptrtoint ptr %t222 to i64
%t224 = zext i32 %t221 to i64
%t225 = mul i64 %t224, %t223
%t226 = load ptr, ptr %t215
%t227 = call ptr @realloc(ptr %t226, i64 %t225)
store ptr %t227, ptr %t215
store i32 %t221, ptr %t214
br label %put57
put57:
%t228 = load ptr, ptr %t188
%t229 = load ptr, ptr %t215
%t230 = getelementptr inbounds ptr, ptr %t229, i32 %t216
store ptr %t228, ptr %t230
%t231 = add i32 %t216, 1
store i32 %t231, ptr %t213
%t232 = load i32, ptr %t181
%t233 = add i32 %t232, 1
store i32 %t233, ptr %t181
br label %wcond47
wend49:
call void @fn_eat_op(ptr @.str69)
%t219 = load ptr, ptr %t177
store ptr %t219, ptr %retval
%t234 = load ptr, ptr %t177
store ptr %t234, ptr %retval
br label %ret
ifend46:
%t220 = load ptr, ptr %t6
%t221 = getelementptr inbounds %Str_Tok, ptr %t220, i32 0, i32 1
%t222 = load ptr, ptr %t221
%t223 = call i32 @fn_streq(ptr %t222, ptr @.str70)
%t224 = icmp ne i32 %t223, 0
br i1 %t224, label %then55, label %ifend57
then55:
%t225 = load i32, ptr @g_pi
%t226 = add i32 %t225, 1
store i32 %t226, ptr @g_pi
%t227 = call ptr @fn_node(i32 26)
store ptr %t227, ptr %t228
%t229 = load ptr, ptr %t228
%t230 = getelementptr inbounds %Str_Node, ptr %t229, i32 0, i32 1
%t231 = call ptr @fn_eat_id()
store ptr %t231, ptr %t230
%t232 = load ptr, ptr %t228
store ptr %t232, ptr %retval
br label %ret
ifend57:
%t233 = load ptr, ptr %t6
%t234 = getelementptr inbounds %Str_Tok, ptr %t233, i32 0, i32 1
%t235 = load ptr, ptr %t234
%t236 = call i32 @fn_streq(ptr %t235, ptr @.str71)
%t237 = icmp ne i32 %t236, 0
br i1 %t237, label %then58, label %ifend60
%t235 = load ptr, ptr %t6
%t236 = getelementptr inbounds %Str_Tok, ptr %t235, i32 0, i32 1
%t237 = load ptr, ptr %t236
%t238 = call i32 @fn_streq(ptr %t237, ptr @.str70)
%t239 = icmp ne i32 %t238, 0
br i1 %t239, label %then58, label %ifend60
then58:
%t238 = load i32, ptr @g_pi
%t239 = add i32 %t238, 1
store i32 %t239, ptr @g_pi
%t240 = call ptr @fn_node(i32 26)
store ptr %t240, ptr %t241
%t242 = load ptr, ptr %t241
%t243 = getelementptr inbounds %Str_Node, ptr %t242, i32 0, i32 1
%t244 = call ptr @fn_eat_id()
store ptr %t244, ptr %t243
%t245 = load ptr, ptr %t241
%t246 = getelementptr inbounds %Str_Node, ptr %t245, i32 0, i32 2
store i32 1, ptr %t246
%t247 = load ptr, ptr %t241
%t240 = load i32, ptr @g_pi
%t241 = add i32 %t240, 1
store i32 %t241, ptr @g_pi
%t242 = call ptr @fn_node(i32 26)
store ptr %t242, ptr %t243
%t244 = load ptr, ptr %t243
%t245 = getelementptr inbounds %Str_Node, ptr %t244, i32 0, i32 1
%t246 = call ptr @fn_eat_id()
store ptr %t246, ptr %t245
%t247 = load ptr, ptr %t243
store ptr %t247, ptr %retval
br label %ret
ifend60:
%t248 = load ptr, ptr %t6
%t249 = getelementptr inbounds %Str_Tok, ptr %t248, i32 0, i32 1
%t250 = load ptr, ptr %t249
%t251 = call i32 @fn_streq(ptr %t250, ptr @.str72)
%t251 = call i32 @fn_streq(ptr %t250, ptr @.str71)
%t252 = icmp ne i32 %t251, 0
br i1 %t252, label %then61, label %ifend63
then61:
%t253 = load i32, ptr @g_pi
%t254 = add i32 %t253, 1
store i32 %t254, ptr @g_pi
%t255 = call ptr @fn_node(i32 23)
%t255 = call ptr @fn_node(i32 26)
store ptr %t255, ptr %t256
%t257 = load ptr, ptr %t256
%t258 = getelementptr inbounds %Str_Node, ptr %t257, i32 0, i32 4
%t259 = call ptr @fn_expr()
%t258 = getelementptr inbounds %Str_Node, ptr %t257, i32 0, i32 1
%t259 = call ptr @fn_eat_id()
store ptr %t259, ptr %t258
%t260 = load ptr, ptr %t256
store ptr %t260, ptr %retval
%t261 = getelementptr inbounds %Str_Node, ptr %t260, i32 0, i32 2
store i32 1, ptr %t261
%t262 = load ptr, ptr %t256
store ptr %t262, ptr %retval
br label %ret
ifend63:
%t261 = load ptr, ptr %t6
%t262 = getelementptr inbounds %Str_Tok, ptr %t261, i32 0, i32 1
%t263 = load ptr, ptr %t262
%t264 = call i32 @fn_streq(ptr %t263, ptr @.str73)
%t265 = icmp ne i32 %t264, 0
br i1 %t265, label %then64, label %ifend66
%t263 = load ptr, ptr %t6
%t264 = getelementptr inbounds %Str_Tok, ptr %t263, i32 0, i32 1
%t265 = load ptr, ptr %t264
%t266 = call i32 @fn_streq(ptr %t265, ptr @.str72)
%t267 = icmp ne i32 %t266, 0
br i1 %t267, label %then64, label %ifend66
then64:
%t266 = load i32, ptr @g_pi
%t267 = add i32 %t266, 1
store i32 %t267, ptr @g_pi
%t268 = call ptr @fn_node(i32 17)
store ptr %t268, ptr %retval
%t268 = load i32, ptr @g_pi
%t269 = add i32 %t268, 1
store i32 %t269, ptr @g_pi
%t270 = call ptr @fn_node(i32 23)
store ptr %t270, ptr %t271
%t272 = load ptr, ptr %t271
%t273 = getelementptr inbounds %Str_Node, ptr %t272, i32 0, i32 4
%t274 = call ptr @fn_expr()
store ptr %t274, ptr %t273
%t275 = load ptr, ptr %t271
store ptr %t275, ptr %retval
br label %ret
ifend66:
%t269 = load ptr, ptr %t6
%t270 = getelementptr inbounds %Str_Tok, ptr %t269, i32 0, i32 1
%t271 = load ptr, ptr %t270
%t272 = call i32 @fn_streq(ptr %t271, ptr @.str74)
%t273 = icmp ne i32 %t272, 0
br i1 %t273, label %then67, label %ifend69
%t276 = load ptr, ptr %t6
%t277 = getelementptr inbounds %Str_Tok, ptr %t276, i32 0, i32 1
%t278 = load ptr, ptr %t277
%t279 = call i32 @fn_streq(ptr %t278, ptr @.str73)
%t280 = icmp ne i32 %t279, 0
br i1 %t280, label %then67, label %ifend69
then67:
%t274 = load i32, ptr @g_pi
%t275 = add i32 %t274, 1
store i32 %t275, ptr @g_pi
%t276 = call ptr @fn_node(i32 18)
store ptr %t276, ptr %retval
%t281 = load i32, ptr @g_pi
%t282 = add i32 %t281, 1
store i32 %t282, ptr @g_pi
%t283 = call ptr @fn_node(i32 17)
store ptr %t283, ptr %retval
br label %ret
ifend69:
%t277 = load ptr, ptr %t6
%t278 = getelementptr inbounds %Str_Tok, ptr %t277, i32 0, i32 1
%t279 = load ptr, ptr %t278
%t280 = call i32 @fn_streq(ptr %t279, ptr @.str75)
%t281 = icmp ne i32 %t280, 0
br i1 %t281, label %then70, label %ifend72
then70:
%t282 = load i32, ptr @g_pi
%t283 = add i32 %t282, 1
store i32 %t283, ptr @g_pi
%t284 = call ptr @fn_node(i32 19)
store ptr %t284, ptr %t285
%t284 = load ptr, ptr %t6
%t285 = getelementptr inbounds %Str_Tok, ptr %t284, i32 0, i32 1
%t286 = load ptr, ptr %t285
%t287 = getelementptr inbounds %Str_Node, ptr %t286, i32 0, i32 4
%t288 = call ptr @fn_expr()
store ptr %t288, ptr %t287
call void @fn_skipnl()
call void @fn_eat_op(ptr @.str76)
br label %wcond73
wcond73:
%t289 = icmp ne i32 1, 0
br i1 %t289, label %wbody74, label %wend75
wbody74:
call void @fn_skipnl()
%t290 = call i32 @fn_is_op(ptr @.str77)
%t291 = icmp ne i32 %t290, 0
br i1 %t291, label %then76, label %ifend78
then76:
br label %wend75
ifend78:
%t292 = call ptr @fn_node(i32 20)
store ptr %t292, ptr %t293
br label %wcond79
wcond79:
%t294 = icmp ne i32 1, 0
br i1 %t294, label %wbody80, label %wend81
wbody80:
%t295 = load ptr, ptr %t293
%t296 = getelementptr inbounds %Str_Node, ptr %t295, i32 0, i32 7
%t297 = load ptr, ptr %t296
%t298 = getelementptr inbounds %LSlice, ptr %t297, i32 0, i32 1
%t299 = getelementptr inbounds %LSlice, ptr %t297, i32 0, i32 2
%t300 = getelementptr inbounds %LSlice, ptr %t297, i32 0, i32 0
%t301 = load i32, ptr %t298
%t302 = load i32, ptr %t299
%t303 = icmp sge i32 %t301, %t302
br i1 %t303, label %grow82, label %put83
grow82:
%t304 = mul i32 %t302, 2
%t305 = icmp eq i32 %t302, 0
%t306 = select i1 %t305, i32 8, i32 %t304
%t307 = getelementptr ptr, ptr null, i32 1
%t308 = ptrtoint ptr %t307 to i64
%t309 = zext i32 %t306 to i64
%t310 = mul i64 %t309, %t308
%t311 = load ptr, ptr %t300
%t312 = call ptr @realloc(ptr %t311, i64 %t310)
store ptr %t312, ptr %t300
store i32 %t306, ptr %t299
br label %put83
put83:
%t313 = call ptr @fn_expr()
%t314 = load ptr, ptr %t300
%t315 = getelementptr inbounds ptr, ptr %t314, i32 %t301
store ptr %t313, ptr %t315
%t316 = add i32 %t301, 1
store i32 %t316, ptr %t298
%t317 = call i32 @fn_is_op(ptr @.str78)
%t318 = icmp ne i32 %t317, 0
br i1 %t318, label %then84, label %ifend86
then84:
%t319 = load i32, ptr @g_pi
%t320 = add i32 %t319, 1
store i32 %t320, ptr @g_pi
call void @fn_skipnl()
br label %wcond79
ifend86:
br label %wend81
wend81:
call void @fn_eat_op(ptr @.str79)
call void @fn_skipnl()
%t321 = call i32 @fn_is_op(ptr @.str80)
%t322 = icmp ne i32 %t321, 0
br i1 %t322, label %then87, label %else88
then87:
%t323 = load ptr, ptr %t293
%t324 = getelementptr inbounds %Str_Node, ptr %t323, i32 0, i32 4
%t325 = call ptr @fn_block()
store ptr %t325, ptr %t324
br label %ifend89
else88:
%t326 = call ptr @fn_node(i32 7)
store ptr %t326, ptr %t327
%t328 = load ptr, ptr %t327
%t329 = getelementptr inbounds %Str_Node, ptr %t328, i32 0, i32 7
%t330 = load ptr, ptr %t329
%t331 = getelementptr inbounds %LSlice, ptr %t330, i32 0, i32 1
%t332 = getelementptr inbounds %LSlice, ptr %t330, i32 0, i32 2
%t333 = getelementptr inbounds %LSlice, ptr %t330, i32 0, i32 0
%t334 = load i32, ptr %t331
%t335 = load i32, ptr %t332
%t336 = icmp sge i32 %t334, %t335
br i1 %t336, label %grow90, label %put91
grow90:
%t337 = mul i32 %t335, 2
%t338 = icmp eq i32 %t335, 0
%t339 = select i1 %t338, i32 8, i32 %t337
%t340 = getelementptr ptr, ptr null, i32 1
%t341 = ptrtoint ptr %t340 to i64
%t342 = zext i32 %t339 to i64
%t343 = mul i64 %t342, %t341
%t344 = load ptr, ptr %t333
%t345 = call ptr @realloc(ptr %t344, i64 %t343)
store ptr %t345, ptr %t333
store i32 %t339, ptr %t332
br label %put91
put91:
%t346 = call ptr @fn_stmt()
%t347 = load ptr, ptr %t333
%t348 = getelementptr inbounds ptr, ptr %t347, i32 %t334
store ptr %t346, ptr %t348
%t349 = add i32 %t334, 1
store i32 %t349, ptr %t331
%t350 = load ptr, ptr %t293
%t351 = getelementptr inbounds %Str_Node, ptr %t350, i32 0, i32 4
%t352 = load ptr, ptr %t327
store ptr %t352, ptr %t351
br label %ifend89
ifend89:
%t353 = load ptr, ptr %t285
%t354 = getelementptr inbounds %Str_Node, ptr %t353, i32 0, i32 7
%t355 = load ptr, ptr %t354
%t356 = getelementptr inbounds %LSlice, ptr %t355, i32 0, i32 1
%t357 = getelementptr inbounds %LSlice, ptr %t355, i32 0, i32 2
%t358 = getelementptr inbounds %LSlice, ptr %t355, i32 0, i32 0
%t359 = load i32, ptr %t356
%t360 = load i32, ptr %t357
%t361 = icmp sge i32 %t359, %t360
br i1 %t361, label %grow92, label %put93
grow92:
%t362 = mul i32 %t360, 2
%t363 = icmp eq i32 %t360, 0
%t364 = select i1 %t363, i32 8, i32 %t362
%t365 = getelementptr ptr, ptr null, i32 1
%t366 = ptrtoint ptr %t365 to i64
%t367 = zext i32 %t364 to i64
%t368 = mul i64 %t367, %t366
%t369 = load ptr, ptr %t358
%t370 = call ptr @realloc(ptr %t369, i64 %t368)
store ptr %t370, ptr %t358
store i32 %t364, ptr %t357
br label %put93
put93:
%t371 = load ptr, ptr %t293
%t372 = load ptr, ptr %t358
%t373 = getelementptr inbounds ptr, ptr %t372, i32 %t359
store ptr %t371, ptr %t373
%t374 = add i32 %t359, 1
store i32 %t374, ptr %t356
br label %wcond73
wend75:
call void @fn_eat_op(ptr @.str81)
%t375 = load ptr, ptr %t285
store ptr %t375, ptr %retval
%t287 = call i32 @fn_streq(ptr %t286, ptr @.str74)
%t288 = icmp ne i32 %t287, 0
br i1 %t288, label %then70, label %ifend72
then70:
%t289 = load i32, ptr @g_pi
%t290 = add i32 %t289, 1
store i32 %t290, ptr @g_pi
%t291 = call ptr @fn_node(i32 18)
store ptr %t291, ptr %retval
br label %ret
ifend72:
%t292 = load ptr, ptr %t6
%t293 = getelementptr inbounds %Str_Tok, ptr %t292, i32 0, i32 1
%t294 = load ptr, ptr %t293
%t295 = call i32 @fn_streq(ptr %t294, ptr @.str75)
%t296 = icmp ne i32 %t295, 0
br i1 %t296, label %then73, label %ifend75
then73:
%t297 = load i32, ptr @g_pi
%t298 = add i32 %t297, 1
store i32 %t298, ptr @g_pi
%t299 = call ptr @fn_node(i32 19)
store ptr %t299, ptr %t300
%t301 = load ptr, ptr %t300
%t302 = getelementptr inbounds %Str_Node, ptr %t301, i32 0, i32 4
%t303 = call ptr @fn_expr()
store ptr %t303, ptr %t302
call void @fn_skipnl()
call void @fn_eat_op(ptr @.str76)
br label %wcond76
wcond76:
%t304 = icmp ne i32 1, 0
br i1 %t304, label %wbody77, label %wend78
wbody77:
call void @fn_skipnl()
%t305 = call i32 @fn_is_op(ptr @.str77)
%t306 = icmp ne i32 %t305, 0
br i1 %t306, label %then79, label %ifend81
then79:
br label %wend78
ifend81:
%t307 = call ptr @fn_node(i32 20)
store ptr %t307, ptr %t308
br label %wcond82
wcond82:
%t309 = icmp ne i32 1, 0
br i1 %t309, label %wbody83, label %wend84
wbody83:
%t310 = load ptr, ptr %t308
%t311 = getelementptr inbounds %Str_Node, ptr %t310, i32 0, i32 7
%t312 = load ptr, ptr %t311
%t313 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 1
%t314 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 2
%t315 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 0
%t316 = load i32, ptr %t313
%t317 = load i32, ptr %t314
%t318 = icmp sge i32 %t316, %t317
br i1 %t318, label %grow85, label %put86
grow85:
%t319 = mul i32 %t317, 2
%t320 = icmp eq i32 %t317, 0
%t321 = select i1 %t320, i32 8, i32 %t319
%t322 = getelementptr ptr, ptr null, i32 1
%t323 = ptrtoint ptr %t322 to i64
%t324 = zext i32 %t321 to i64
%t325 = mul i64 %t324, %t323
%t326 = load ptr, ptr %t315
%t327 = call ptr @realloc(ptr %t326, i64 %t325)
store ptr %t327, ptr %t315
store i32 %t321, ptr %t314
br label %put86
put86:
%t328 = call ptr @fn_expr()
%t329 = load ptr, ptr %t315
%t330 = getelementptr inbounds ptr, ptr %t329, i32 %t316
store ptr %t328, ptr %t330
%t331 = add i32 %t316, 1
store i32 %t331, ptr %t313
%t332 = call i32 @fn_is_op(ptr @.str78)
%t333 = icmp ne i32 %t332, 0
br i1 %t333, label %then87, label %ifend89
then87:
%t334 = load i32, ptr @g_pi
%t335 = add i32 %t334, 1
store i32 %t335, ptr @g_pi
call void @fn_skipnl()
br label %wcond82
ifend89:
br label %wend84
wend84:
call void @fn_eat_op(ptr @.str79)
call void @fn_skipnl()
%t336 = call i32 @fn_is_op(ptr @.str80)
%t337 = icmp ne i32 %t336, 0
br i1 %t337, label %then90, label %else91
then90:
%t338 = load ptr, ptr %t308
%t339 = getelementptr inbounds %Str_Node, ptr %t338, i32 0, i32 4
%t340 = call ptr @fn_block()
store ptr %t340, ptr %t339
br label %ifend92
else91:
%t341 = call ptr @fn_node(i32 7)
store ptr %t341, ptr %t342
%t343 = load ptr, ptr %t342
%t344 = getelementptr inbounds %Str_Node, ptr %t343, i32 0, i32 7
%t345 = load ptr, ptr %t344
%t346 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 1
%t347 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 2
%t348 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 0
%t349 = load i32, ptr %t346
%t350 = load i32, ptr %t347
%t351 = icmp sge i32 %t349, %t350
br i1 %t351, label %grow93, label %put94
grow93:
%t352 = mul i32 %t350, 2
%t353 = icmp eq i32 %t350, 0
%t354 = select i1 %t353, i32 8, i32 %t352
%t355 = getelementptr ptr, ptr null, i32 1
%t356 = ptrtoint ptr %t355 to i64
%t357 = zext i32 %t354 to i64
%t358 = mul i64 %t357, %t356
%t359 = load ptr, ptr %t348
%t360 = call ptr @realloc(ptr %t359, i64 %t358)
store ptr %t360, ptr %t348
store i32 %t354, ptr %t347
br label %put94
put94:
%t361 = call ptr @fn_stmt()
%t362 = load ptr, ptr %t348
%t363 = getelementptr inbounds ptr, ptr %t362, i32 %t349
store ptr %t361, ptr %t363
%t364 = add i32 %t349, 1
store i32 %t364, ptr %t346
%t365 = load ptr, ptr %t308
%t366 = getelementptr inbounds %Str_Node, ptr %t365, i32 0, i32 4
%t367 = load ptr, ptr %t342
store ptr %t367, ptr %t366
br label %ifend92
ifend92:
%t368 = load ptr, ptr %t300
%t369 = getelementptr inbounds %Str_Node, ptr %t368, i32 0, i32 7
%t370 = load ptr, ptr %t369
%t371 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 1
%t372 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 2
%t373 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 0
%t374 = load i32, ptr %t371
%t375 = load i32, ptr %t372
%t376 = icmp sge i32 %t374, %t375
br i1 %t376, label %grow95, label %put96
grow95:
%t377 = mul i32 %t375, 2
%t378 = icmp eq i32 %t375, 0
%t379 = select i1 %t378, i32 8, i32 %t377
%t380 = getelementptr ptr, ptr null, i32 1
%t381 = ptrtoint ptr %t380 to i64
%t382 = zext i32 %t379 to i64
%t383 = mul i64 %t382, %t381
%t384 = load ptr, ptr %t373
%t385 = call ptr @realloc(ptr %t384, i64 %t383)
store ptr %t385, ptr %t373
store i32 %t379, ptr %t372
br label %put96
put96:
%t386 = load ptr, ptr %t308
%t387 = load ptr, ptr %t373
%t388 = getelementptr inbounds ptr, ptr %t387, i32 %t374
store ptr %t386, ptr %t388
%t389 = add i32 %t374, 1
store i32 %t389, ptr %t371
br label %wcond76
wend78:
call void @fn_eat_op(ptr @.str81)
%t390 = load ptr, ptr %t300
store ptr %t390, ptr %retval
br label %ret
ifend75:
br label %ifend2
ifend2:
%t376 = call ptr @fn_expr()
store ptr %t376, ptr %t377
%t382 = call i32 @fn_is_op(ptr @.str82)
%t383 = icmp ne i32 %t382, 0
%t384 = zext i1 %t383 to i32
store i32 %t384, ptr %t381
br i1 %t383, label %scend95, label %sc94
sc94:
%t385 = call i32 @fn_is_op(ptr @.str83)
%t386 = icmp ne i32 %t385, 0
%t387 = zext i1 %t386 to i32
store i32 %t387, ptr %t381
br label %scend95
scend95:
%t388 = load i32, ptr %t381
%t389 = icmp ne i32 %t388, 0
%t390 = zext i1 %t389 to i32
store i32 %t390, ptr %t380
br i1 %t389, label %scend97, label %sc96
sc96:
%t391 = call i32 @fn_is_op(ptr @.str84)
%t392 = icmp ne i32 %t391, 0
%t393 = zext i1 %t392 to i32
store i32 %t393, ptr %t380
br label %scend97
scend97:
%t394 = load i32, ptr %t380
%t395 = icmp ne i32 %t394, 0
%t396 = zext i1 %t395 to i32
store i32 %t396, ptr %t379
br i1 %t395, label %scend99, label %sc98
sc98:
%t397 = call i32 @fn_is_op(ptr @.str85)
%t391 = call ptr @fn_expr()
store ptr %t391, ptr %t392
%t397 = call i32 @fn_is_op(ptr @.str82)
%t398 = icmp ne i32 %t397, 0
%t399 = zext i1 %t398 to i32
store i32 %t399, ptr %t379
br label %scend99
scend99:
%t400 = load i32, ptr %t379
store i32 %t399, ptr %t396
br i1 %t398, label %scend98, label %sc97
sc97:
%t400 = call i32 @fn_is_op(ptr @.str83)
%t401 = icmp ne i32 %t400, 0
%t402 = zext i1 %t401 to i32
store i32 %t402, ptr %t378
br i1 %t401, label %scend101, label %sc100
sc100:
%t403 = call i32 @fn_is_op(ptr @.str86)
store i32 %t402, ptr %t396
br label %scend98
scend98:
%t403 = load i32, ptr %t396
%t404 = icmp ne i32 %t403, 0
%t405 = zext i1 %t404 to i32
store i32 %t405, ptr %t378
br label %scend101
scend101:
%t406 = load i32, ptr %t378
store i32 %t405, ptr %t395
br i1 %t404, label %scend100, label %sc99
sc99:
%t406 = call i32 @fn_is_op(ptr @.str84)
%t407 = icmp ne i32 %t406, 0
br i1 %t407, label %then102, label %ifend104
then102:
%t408 = call ptr @fn_node(i32 11)
store ptr %t408, ptr %t409
%t410 = load ptr, ptr %t409
%t411 = getelementptr inbounds %Str_Node, ptr %t410, i32 0, i32 1
%t412 = load ptr, ptr @g_toks
%t413 = getelementptr inbounds %LSlice, ptr %t412, i32 0, i32 0
%t414 = load ptr, ptr %t413
%t415 = load i32, ptr @g_pi
%t416 = getelementptr inbounds ptr, ptr %t414, i32 %t415
%t417 = load ptr, ptr %t416
%t418 = getelementptr inbounds %Str_Tok, ptr %t417, i32 0, i32 1
%t419 = load ptr, ptr %t418
store ptr %t419, ptr %t411
%t420 = load i32, ptr @g_pi
%t421 = add i32 %t420, 1
store i32 %t421, ptr @g_pi
%t422 = load ptr, ptr %t409
%t423 = getelementptr inbounds %Str_Node, ptr %t422, i32 0, i32 4
%t424 = load ptr, ptr %t377
store ptr %t424, ptr %t423
%t425 = load ptr, ptr %t409
%t426 = getelementptr inbounds %Str_Node, ptr %t425, i32 0, i32 5
%t427 = call ptr @fn_expr()
store ptr %t427, ptr %t426
%t428 = load ptr, ptr %t409
store ptr %t428, ptr %retval
%t408 = zext i1 %t407 to i32
store i32 %t408, ptr %t395
br label %scend100
scend100:
%t409 = load i32, ptr %t395
%t410 = icmp ne i32 %t409, 0
%t411 = zext i1 %t410 to i32
store i32 %t411, ptr %t394
br i1 %t410, label %scend102, label %sc101
sc101:
%t412 = call i32 @fn_is_op(ptr @.str85)
%t413 = icmp ne i32 %t412, 0
%t414 = zext i1 %t413 to i32
store i32 %t414, ptr %t394
br label %scend102
scend102:
%t415 = load i32, ptr %t394
%t416 = icmp ne i32 %t415, 0
%t417 = zext i1 %t416 to i32
store i32 %t417, ptr %t393
br i1 %t416, label %scend104, label %sc103
sc103:
%t418 = call i32 @fn_is_op(ptr @.str86)
%t419 = icmp ne i32 %t418, 0
%t420 = zext i1 %t419 to i32
store i32 %t420, ptr %t393
br label %scend104
scend104:
%t421 = load i32, ptr %t393
%t422 = icmp ne i32 %t421, 0
br i1 %t422, label %then105, label %ifend107
then105:
%t423 = call ptr @fn_node(i32 11)
store ptr %t423, ptr %t424
%t425 = load ptr, ptr %t424
%t426 = getelementptr inbounds %Str_Node, ptr %t425, i32 0, i32 1
%t427 = load ptr, ptr @g_toks
%t428 = getelementptr inbounds %LSlice, ptr %t427, i32 0, i32 0
%t429 = load ptr, ptr %t428
%t430 = load i32, ptr @g_pi
%t431 = getelementptr inbounds ptr, ptr %t429, i32 %t430
%t432 = load ptr, ptr %t431
%t433 = getelementptr inbounds %Str_Tok, ptr %t432, i32 0, i32 1
%t434 = load ptr, ptr %t433
store ptr %t434, ptr %t426
%t435 = load i32, ptr @g_pi
%t436 = add i32 %t435, 1
store i32 %t436, ptr @g_pi
%t437 = load ptr, ptr %t424
%t438 = getelementptr inbounds %Str_Node, ptr %t437, i32 0, i32 4
%t439 = load ptr, ptr %t392
store ptr %t439, ptr %t438
%t440 = load ptr, ptr %t424
%t441 = getelementptr inbounds %Str_Node, ptr %t440, i32 0, i32 5
%t442 = call ptr @fn_expr()
store ptr %t442, ptr %t441
%t443 = load ptr, ptr %t424
store ptr %t443, ptr %retval
br label %ret
ifend104:
%t429 = call ptr @fn_node(i32 16)
store ptr %t429, ptr %t430
%t431 = load ptr, ptr %t430
%t432 = getelementptr inbounds %Str_Node, ptr %t431, i32 0, i32 4
%t433 = load ptr, ptr %t377
store ptr %t433, ptr %t432
%t434 = load ptr, ptr %t430
store ptr %t434, ptr %retval
ifend107:
%t444 = call ptr @fn_node(i32 16)
store ptr %t444, ptr %t445
%t446 = load ptr, ptr %t445
%t447 = getelementptr inbounds %Str_Node, ptr %t446, i32 0, i32 4
%t448 = load ptr, ptr %t392
store ptr %t448, ptr %t447
%t449 = load ptr, ptr %t445
store ptr %t449, ptr %retval
br label %ret
ret:
%t435 = load ptr, ptr %retval
ret ptr %t435
%t450 = load ptr, ptr %retval
ret ptr %t450
}
define ptr @fn_parse_struct() {

View file

@ -187,10 +187,14 @@ fn stmt() -> Node {
if streq(t.text, "spawn") { return parse_spawn() }
if streq(t.text, "machine") {
pi = pi + 1; let n = node(S_MACHINE); n.a = expr(); skipnl(); eat_op("{")
let sidx = 0 # states auto-number by declaration order
while true { skipnl(); if is_op("}") { break }
let stkw = eat_id() # 'state'
let s = node(S_STATE); s.s = eat_id(); eat_op("="); s.b = expr(); skipnl(); s.a = block()
push(n.kids, s) }
let s = node(S_STATE); s.s = eat_id()
if is_op("=") { pi = pi + 1; s.b = expr() } # explicit value (still allowed)
else { let iv = node(E_INT); iv.ival = sidx; s.b = iv } # else its ordinal
skipnl(); s.a = block()
push(n.kids, s); sidx = sidx + 1 }
eat_op("}"); return n
}
if streq(t.text, "become") { pi = pi + 1; let n = node(S_BECOME); n.s = eat_id(); return n }