Harbour permits keywords (CASE, DO, WHILE, etc.) to be used as variable/array names. In most expression contexts Five already handles this via expr.go:362 which whitelists keywords when used as bare identifiers. But parseStmtBlock was stopping on any stop token unconditionally, so a line like case[ n ] := x -- 'case' is a LOCAL array terminated the enclosing stmt block at `case` and left `[ n ] := x` unparsable. Add isIdentSuffix(): peeks one ahead and reports whether the next token is something that can only follow an identifier ([, :=, +=, -=, *=, /=, %=, ^=, ++, --, :, .). parseStmtBlock now treats the stop token as a statement-start when its suffix matches, so the block keeps going. Verified with /tmp/test_kwident.prg (`case[...]` outside DO CASE, `arr[...]` inside DO CASE body), /tmp/test_kwident2.prg (both the `case case[n] == "two"` arm and `case[1] := "updated"` assignment after ENDCASE). Pathological harbour-core/tests/keywords.prg still fails — it places `case[...]` in the arm-expected position of a DO CASE block with no leading arm, which no sane parser can disambiguate. FiveSql2 43/43, Harbour compat 56/56, Go test ALL PASS. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
66 KiB
66 KiB