From caa2b978e5a0a83b2615e1e703ce1ec07bf86f77 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 30 Dec 2024 14:16:36 -0800 Subject: Test for "arg--2" Parse as "arg - -2" and not "arg-- 2" which is a syntax error --- chapter17/src/main/java/com/seaofnodes/simple/Parser.java | 2 ++ chapter17/src/test/java/com/seaofnodes/simple/Chapter04Test.java | 6 ++++++ 2 files changed, 8 insertions(+) (limited to 'chapter17/src') diff --git a/chapter17/src/main/java/com/seaofnodes/simple/Parser.java b/chapter17/src/main/java/com/seaofnodes/simple/Parser.java index 1cdf27fb..570ae67e 100644 --- a/chapter17/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter17/src/main/java/com/seaofnodes/simple/Parser.java @@ -1412,6 +1412,7 @@ public class Parser { // Next oper= character, or 0. // As a convenience, mark "++" as a char 1 and "--" as char -1 (65535) + // Disallow e.g. "arg--1" which should parse as "arg - -1" public char matchOperAssign() { skipWhiteSpace(); if( _position+2 >= _input.length ) return 0; @@ -1419,6 +1420,7 @@ public class Parser { if( "+-/*&|^".indexOf(ch0) == -1 ) return 0; char ch1 = (char)_input[_position+1]; if( ch1 == '=' ) { _position += 2; return ch0; } + if( Character.isDigit(_input[_position+2]) ) return 0; if( ch0 == '+' && ch1 == '+' ) { _position += 2; return (char) 1; } if( ch0 == '-' && ch1 == '-' ) { _position += 2; return (char)-1; } return 0; diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter04Test.java index 24612fee..0db3afde 100644 --- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter04Test.java +++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter04Test.java @@ -125,4 +125,10 @@ public class Chapter04Test { assertEquals("return (-arg);", ret.print()); } + @Test + public void testBug5() { + Parser parser = new Parser("return arg--2;"); + StopNode ret = parser.parse(); + assertEquals("return (arg--2);", ret.print()); + } } -- cgit v1.2.3