I'm extending Coral to support Gnu Smalltalk syntax, and ran into something strange.
I asked Lukas and he said that since others would be interested, I should repost the question here. So: Gnu Smalltalk's class variable declarations take the form of [<identifier> := <expression>.]* at the end of an object definition. To that end I wrote a #classVars production like so: classVars ^ (assignment , expression , $. asParser) star "Possibly I need to support the lack of a dot on the last expression. Not relevant at the moment" This didn't work as expected. Looking further, I found this oddity: p := PPSmalltalkParser new. p number end parse: '1.' "=> #(#(nil #($1) nil) 1.0)" I would expect this to fail, because "1." isn't a number (but see below). Indeed, ripping out the parser of #number: n := ($- asParser optional , #digit asParser plus , ($. asParser , #digit asParser plus) optional) end. n parse: '1.' "=> end of input expected at 1" So I experimented a bit, and it seems like#number is being overly eager in consuming that $. character, and Number >> #readFrom:'s reading '1.': Number readFrom: '1.' readStream "=> 1.0" p := PPSmalltalkParser new. p number end parse: '1' "=> #(#(nil #($1) nil) 1)" p := PPSmalltalkParser new. p number end parse: '1.0' "=> #(#(nil #($1) #($. #($0))) 1.0)" p := PPSmalltalkParser new. p number end parse: '1. ' "=> end of input expected at 2" Or am I being silly? frank
