summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-28 16:18:04 +0200
committerPaul Buetow <paul@buetow.org>2026-02-28 16:18:04 +0200
commit6bcaef138f13f9894abe3790aca52591a3d2d1f6 (patch)
treefd57d227e69784d18da8004feaf11e91c178a53e /src/core
parent2a2227d529f3788b8e08752d37deb1a449f3b9bc (diff)
Remove vestigial double-retry loop in _statement() [POLA]
_statement() wrapped its six parse rules in `for (int i = 0; i < 2; ++i)` with no explanation. Investigation shows every rule is atomic: it either consumes tokens and returns 1, or leaves the stream untouched and returns 0. A second pass would see identical parser state, so the retry was a no-op. Replace the loop with a flat priority-ordered try sequence and add a comment explaining the invariant so future readers are not confused. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/interpret.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/core/interpret.c b/src/core/interpret.c
index ba0eade..7fc9334 100644
--- a/src/core/interpret.c
+++ b/src/core/interpret.c
@@ -467,18 +467,20 @@ _func_decl(Interpret *p_interpret) {
return (0);
}
+/* Try each parse rule in priority order; the first that matches
+ * returns 1. Every rule either consumes tokens and returns 1,
+ * or leaves the token stream untouched and returns 0, so a single
+ * pass suffices — the former double-retry loop was vestigial. */
int
_statement(Interpret *p_interpret) {
_CHECK TRACK
- for (int i = 0; i < 2; ++i) {
- if (_proc_decl(p_interpret)) return (1);
- if (_func_decl(p_interpret)) return (1);
- if (_var_decl(p_interpret)) return (1);
- if (_control(p_interpret)) return (1);
- if (_expression(p_interpret)) return (1);
- if (_block(p_interpret)) return (1);
- }
+ if (_proc_decl(p_interpret)) return (1);
+ if (_func_decl(p_interpret)) return (1);
+ if (_var_decl(p_interpret)) return (1);
+ if (_control(p_interpret)) return (1);
+ if (_expression(p_interpret)) return (1);
+ if (_block(p_interpret)) return (1);
return (0);
}