diff --git a/doc/site/values.markdown b/doc/site/values.markdown index 847dd3aa..e09de6b9 100644 --- a/doc/site/values.markdown +++ b/doc/site/values.markdown @@ -19,6 +19,7 @@ Like other scripting languages, Wren has a single numeric type: double-precision floating point. Number literals look like you expect coming from other languages: +
 0
 1234
@@ -26,6 +27,9 @@ from other languages:
 3.14159
 1.0
 -12.34
+0.0314159e02
+0.0314159e+02
+314.159e-02
 
Numbers are instances of the [Num][] class. diff --git a/src/vm/wren_compiler.c b/src/vm/wren_compiler.c index 3d2fcba5..86f2c03c 100644 --- a/src/vm/wren_compiler.c +++ b/src/vm/wren_compiler.c @@ -758,18 +758,21 @@ static void readNumber(Parser* parser) nextChar(parser); while (isDigit(peekChar(parser))) nextChar(parser); } - + // See if the number is in scientific notation. if (matchChar(parser, 'e') || matchChar(parser, 'E')) { - // Allow a negative exponent. - matchChar(parser, '-'); - + // Allow a single positive/negative exponent symbol. + if(!matchChar(parser, '+')) + { + matchChar(parser, '-'); + } + if (!isDigit(peekChar(parser))) { lexError(parser, "Unterminated scientific notation."); } - + while (isDigit(peekChar(parser))) nextChar(parser); } diff --git a/test/language/number/scientific_literals.wren b/test/language/number/scientific_literals.wren index 52695068..21aa9de4 100644 --- a/test/language/number/scientific_literals.wren +++ b/test/language/number/scientific_literals.wren @@ -7,3 +7,4 @@ System.print(2.55e-2 is Num) // expect: true System.print(x is Num) // expect: true System.print(-2.55e2) // expect: -255 System.print(-25500e-2) // expect: -255 +System.print(2.55e+2) // expect: 255 diff --git a/test/language/number/scientific_multiple_exponent_signs.wren b/test/language/number/scientific_multiple_exponent_signs.wren new file mode 100644 index 00000000..b61bde34 --- /dev/null +++ b/test/language/number/scientific_multiple_exponent_signs.wren @@ -0,0 +1 @@ +var x = 1e+-01 // expect error