Listing 20.15 Logical misleading in Parser

#1

f​u​n​c​ ​p​a​r​s​e​(​)​ ​t​h​r​o​w​s​ ​-​>​ ​I​n​t​ ​{​
​ ​ ​ ​ ​ ​ ​ ​/​/​ ​R​e​q​u​i​r​e​ ​a​ ​n​u​m​b​e​r​ ​f​i​r​s​t​
​ ​ ​ ​ ​ ​ ​ ​v​a​r​ ​v​a​l​u​e​ ​=​ ​t​r​y​ ​g​e​t​N​u​m​b​e​r​(​)​

​ ​ ​ ​ ​ ​ ​ ​w​h​i​l​e​ ​l​e​t​ ​t​o​k​e​n​ ​=​ ​g​e​t​N​e​x​t​T​o​k​e​n​(​)​ ​{​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​s​w​i​t​c​h​ ​t​o​k​e​n​ ​{​

​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​/​/​ ​G​e​t​t​i​n​g​ ​a​ ​P​l​u​s​ ​a​f​t​e​r​ ​a​ ​N​u​m​b​e​r​ ​i​s​ ​l​e​g​a​l​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​c​a​s​e​ ​.​P​l​u​s​:​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​/​/​ ​A​f​t​e​r​ ​a​ ​p​l​u​s​,​ ​w​e​ ​m​u​s​t​ ​g​e​t​ ​a​n​o​t​h​e​r​ ​n​u​m​b​e​r​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​l​e​t​ ​n​e​x​t​N​u​m​b​e​r​ ​=​ ​t​r​y​ ​g​e​t​N​u​m​b​e​r​(​)​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​v​a​l​u​e​ ​+​=​ ​n​e​x​t​N​u​m​b​e​r​

​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​/​/​ ​G​e​t​t​i​n​g​ ​a​ ​N​u​m​b​e​r​ ​a​f​t​e​r​ ​a​ ​N​u​m​b​e​r​ ​i​s​ ​n​o​t​ ​l​e​g​a​l​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​c​a​s​e​ ​.​N​u​m​b​e​r​:​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​t​h​r​o​w​ ​E​r​r​o​r​.​I​n​v​a​l​i​d​T​o​k​e​n​(​t​o​k​e​n​)​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​}​
​ ​ ​ ​ ​ ​ ​ ​}​

​ ​ ​ ​ ​ ​ ​ ​r​e​t​u​r​n​ ​v​a​l​u​e​
}​

Shouldn’t the comment be //Getting a number after a Number is legal? If not, then can someone explain why?

#2

That function is parsing an arithmetic expression with the following grammar:

Expression := Number
Expression := Expression '+' Number

Therefore, without a ‘+’ in between, two numbers in a row is not legal

#3

Yep, that’s right. By way of example: 3 4 (two Numbers in a row) is not legal, but 3 + 4 is.