diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java index 8b3a03ea114ad98b6f1854bd59dea84f2d81c5d4..da55693ade5c7ff705f8ef32907ecdb3b8528b16 100644 --- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java +++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java @@ -85,6 +85,7 @@ public class ParserGeneration { "remove deprecated calls to SourceSection functions", "remove deprecated calls to Source functions", "remove restricion on fixed number of digits in UTF codes", - "support ? for help" + "support ? for help", + "support for hex float literals" }; } diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g index 96a9d90de458ee62c5ab7350cae8aaaf0d8ca742..67d55e42b902b7ddfda8426e2fb97a87511624ce 100644 --- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g +++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g @@ -575,13 +575,13 @@ INTEGER COMPLEX : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? 'i' { setText(getText().substring(0, getText().length()-1)); } | '.'? ('0'..'9')+ EXPONENT? 'i' { setText(getText().substring(0, getText().length()-1)); } - | '0x' HEX_DIGIT 'i' { setText(getText().substring(0, getText().length()-1)); } + | '0x' HEX_DIGIT+ ('.' HEX_DIGIT* HEX_EXPONENT)? 'i' { setText(getText().substring(0, getText().length()-1)); } ; DOUBLE : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? | '.'? ('0'..'9')+ EXPONENT? - | '0x' HEX_DIGIT+ + | '0x' HEX_DIGIT+ ('.' HEX_DIGIT* HEX_EXPONENT)? ; DD : '..' ('0'..'9')+ ; @@ -660,6 +660,7 @@ fragment LINE_BREAK ; fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; +fragment HEX_EXPONENT : ('p'|'P') ('+'|'-')? ('0'..'9')+ ; fragment OP_NAME : ID_NAME diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 668e82d1fcb8a049d1283a1dde111151d82c68e9..56aeec68c5e413f79a0639c2016ec05c90038fcf 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -114917,6 +114917,22 @@ see '?methods' for accessing help and source code "","double","bool","raw" "1",1231231234.5,TRUE,2a +##com.oracle.truffle.r.test.parser.TestParser.testDoubleLiterals# +#0x1.1p2 +[1] 4.25 + +##com.oracle.truffle.r.test.parser.TestParser.testDoubleLiterals# +#0x1.aP2 +[1] 6.5 + +##com.oracle.truffle.r.test.parser.TestParser.testDoubleLiterals# +#0xa.bp1i +[1] 0+21.375i + +##com.oracle.truffle.r.test.parser.TestParser.testDoubleLiterals# +#0xa.p2 +[1] 40 + ##com.oracle.truffle.r.test.parser.TestParser.testLexerError#Output.IgnoreErrorMessage# #%0 Error: unexpected input in "%0" diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java index 521c51ec2b9d97d79ec160760dd8afa129ef6348..70c0576471b398ce18e964abbe6d7cdc45759257 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java @@ -51,6 +51,14 @@ public class TestParser extends TestBase { assertEval("10^2^2"); } + @Test + public void testDoubleLiterals() { + assertEval("0x1.1p2"); + assertEval("0x1.aP2"); + assertEval("0xa.p2"); + assertEval("0xa.bp1i"); + } + @Test public void testSpaceEscapeSequence() { assertEval("\"\\ \" == \" \"");