"return" is the only "retstat" and thus the only statement that
is syntactically only allowed at the end of the block:
Why is this not extended to "break", which is a normal statement
and thus allowed to precede arbitrary other statements?
"return" statement may have or have no parameters.
The Lua parser has to decide whether the lexemes following "return" are its parameters or beginning of the next statement;
this implies a non-trivial look-ahead.
To keep Lua parser simple, "return" was declared as the last statement in a block by the language syntax.
I personally consider this as a dirty hack :-)
The Lua team initially had plans about improving the "break" statement in the future:
"break" may be given an optional parameter for exiting multiple nested loops,
similar to the labeled break statement in Java.
That's why "break" in Lua 5.1 also was declared as the last statement in a block:
improved "break" will have the same parsing problem as the "return" statement.
But after introducing "goto" in Lua 5.2 the plan of improving "break" was cancelled,
because now you can break multiple nested loops with "goto".
Since "break" is now parameter-less now and forever, it was removed from "retstat".
Currently, Lua 5.2 to Lua 5.4 happily allow abominations such as
while true do break break break end
while true do break a = 1 end
Do you want to complicate the language syntax to guarantee that every statement is reachable?
It's not worth it.