From 7c0e4fbb1d1f0d19d11c7417c55a305654ab1c83 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Tue, 8 Apr 2025 23:26:38 +0300 Subject: tightened rules for specifying modifiers * Instead of separate stand-alone commands, they are now allowed only immediately in front of the commands that accept them. * The order is still insignificant if both `@` and `:` are accepted. * The number of colon modifiers is now also checked. We basically get this for free. * `@` has syntactic significance, so it could not be set conditionally anyway. Still, it was possible to provoke bugs were `@` was interpreted conditionally as in `@ 2`. * Even when not causing bugs, a mistyped `@` would often influence the __next__ command, causing unexpected behavior, for instance when typing `@(233C)W`. * While it was theoretically possible to set `:` conditionally, it could also be "passed through" accidentally to some command where it wasn't expected as in `:Ifoo$ C`. I do not know of any real useful application or idiom of a conditionally set `:`. If there would happen to be some kind of useful application, `:'` and `:|` could be re-allowed easily, though. * I was condidering introducing a common parser state for modified commands, but that would have been tricky and introduce a lot of redundant command lists. So instead, we now simply everywhere check for excess modifiers. To simplify this task, teco_machine_main_transition_t now contains flags signaling whether the transition is allowed with `@` or `:` modifiers set. It currently only has to be checked in the start state, after `E` and `F`. --- tests/testsuite.at | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'tests/testsuite.at') diff --git a/tests/testsuite.at b/tests/testsuite.at index 20869f4..20a76c5 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -59,6 +59,14 @@ AT_CHECK([$SCITECO -e "(1-6*5-1)+30\"N(0/0)'"], 0, ignore, ignore) AT_CHECK([$SCITECO -e "(1-6*5-1*2*2)+33\"N(0/0)'"], 0, ignore, ignore) AT_CLEANUP +AT_SETUP([Modifiers]) +AT_CHECK([$SCITECO -e '@:W$ :@W$'], 0, ignore, ignore) +# Detect invalid modifiers +AT_CHECK([$SCITECO -e '@J'], 1, ignore, ignore) +AT_CHECK([$SCITECO -e ': '], 1, ignore, ignore) +AT_CHECK([$SCITECO -e '::C$'], 1, ignore, ignore) +AT_CLEANUP + AT_SETUP([Closing loops at the correct macro level]) AT_CHECK([$SCITECO -e '@^Ua{>}