From 450ec696ee46f79159395a89c9a97bc8354616ba Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Fri, 6 Dec 2019 11:53:44 -0800 Subject: [PATCH] hoc: don't nest calls to follow() when lexing ++/+= and --/-= (#287) The code had a nested use of the follow() function that could cause +=+ and -=- to register as ++ and --. The first follow() to execute could consume a character and match and then the second follow() could consume another character and match. For example i-=-10 would result in a syntax error and i-=- would decrement i. (imported from plan9port commit f1dd3f065a97f57bf59db2e3284868e181734159) --- sys/src/cmd/hoc/hoc.y | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/src/cmd/hoc/hoc.y b/sys/src/cmd/hoc/hoc.y index 673db5ae6..341202fe4 100644 --- a/sys/src/cmd/hoc/hoc.y +++ b/sys/src/cmd/hoc/hoc.y @@ -214,8 +214,8 @@ yylex(void) /* hoc6 */ return STRING; } switch (c) { - case '+': return follow('+', INC, follow('=', ADDEQ, '+')); - case '-': return follow('-', DEC, follow('=', SUBEQ, '-')); + case '+': return follow('+', INC, '+') == INC ? INC : follow('=', ADDEQ, '+'); + case '-': return follow('-', DEC, '-') == DEC ? DEC : follow('=', SUBEQ, '-'); case '*': return follow('=', MULEQ, '*'); case '/': return follow('=', DIVEQ, '/'); case '%': return follow('=', MODEQ, '%');