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("\"\\ \" == \" \"");