Actually, the JavaScript semicolon insertion algorithm [0] seems more complex than I had remembered. I had thought of them as variations on the semicolon insertion in BCPL, but it seems like that's an oversimplification.
For reference, these are the BCPL rules:
The canonical symbol SEMICOLON is inserted between pairs of items if they appeared on different lines and if the first was from the set of items which may end a command or definition, namely:
BREAK RETURN FINISH REPEAT SKET RKET
SECTKET NAME STRINGCONST NUMBER TRUE FALSE
and the second is from the set of items which may start: a command, namely:
TEST FOR IF UNLESS UNTIL WHILE GOTO RESULTIS
CASE DEFAULT BREAK RETURN FINISH SECTBRA
RBRA VALOF LV RV NAME
...
( ) [ ] § § are used to denote RBRA RKET SBRA SKET SECTBRA and SECTKET.
Actually, the JavaScript semicolon insertion algorithm [0] seems more complex than I had remembered. I had thought of them as variations on the semicolon insertion in BCPL, but it seems like that's an oversimplification.
For reference, these are the BCPL rules:
The canonical symbol SEMICOLON is inserted between pairs of items if they appeared on different lines and if the first was from the set of items which may end a command or definition, namely:
and the second is from the set of items which may start: a command, namely: ...( ) [ ] § § are used to denote RBRA RKET SBRA SKET SECTBRA and SECTKET.
[0]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...