aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/hoc
diff options
context:
space:
mode:
authordeepcube <evan.gates@gmail.com>2019-09-19 10:10:28 -0700
committerDan Cross <crossd@gmail.com>2019-09-19 13:10:28 -0400
commitf1dd3f065a97f57bf59db2e3284868e181734159 (patch)
tree586d803067e31f72d30aeafff1aa9fd52e2e017e /src/cmd/hoc
parent9389de63d7b0dab99773511f48b2d303e3f957d7 (diff)
downloadplan9port-f1dd3f065a97f57bf59db2e3284868e181734159.tar.gz
plan9port-f1dd3f065a97f57bf59db2e3284868e181734159.tar.bz2
plan9port-f1dd3f065a97f57bf59db2e3284868e181734159.zip
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.
Diffstat (limited to 'src/cmd/hoc')
-rw-r--r--src/cmd/hoc/hoc.y4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/cmd/hoc/hoc.y b/src/cmd/hoc/hoc.y
index 9c5a02f1..f634e82d 100644
--- a/src/cmd/hoc/hoc.y
+++ b/src/cmd/hoc/hoc.y
@@ -215,8 +215,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, '%');