Skip to content

Commit 863d208

Browse files
committed
support underscores in literal numbers
1 parent d8de478 commit 863d208

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_parser.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,10 @@ def newhook(value):
114114
assert got_value == 6
115115
finally:
116116
sys.displayhook = oldhook
117+
118+
119+
def test_underscore_in_numbers():
120+
assert eval('1_0') == 10
121+
assert eval('0b1_1') == 0b11
122+
assert eval('0o1_7') == 0o17
123+
assert eval('0x1_f') == 0x1f

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/PythonTreeTranslator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,8 @@ public static String unescapeJavaString(String st) {
791791
return sb.toString();
792792
}
793793

794-
private Object parseNumber(String text) {
794+
private Object parseNumber(String inputText) {
795+
String text = inputText.replace("_", "");
795796
if (text.endsWith("j") || text.endsWith("J") || text.contains(".")) {
796797
return parseDottedNumber(text);
797798
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/antlr/Python3.g4

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ BYTES_LITERAL
411411

412412
/// decimalinteger ::= nonzerodigit digit* | "0"+
413413
DECIMAL_INTEGER
414-
: NON_ZERO_DIGIT DIGIT*
414+
: NON_ZERO_DIGIT DECIMAL_DIGIT*
415415
| '0'+
416416
;
417417

@@ -541,19 +541,24 @@ fragment DIGIT
541541
: [0-9]
542542
;
543543

544+
/// decimal integer digit ::= "0"..."9"
545+
fragment DECIMAL_DIGIT
546+
: [0-9_]
547+
;
548+
544549
/// octdigit ::= "0"..."7"
545550
fragment OCT_DIGIT
546-
: [0-7]
551+
: [0-7_]
547552
;
548553

549554
/// hexdigit ::= digit | "a"..."f" | "A"..."F"
550555
fragment HEX_DIGIT
551-
: [0-9a-fA-F]
556+
: [0-9a-fA-F_]
552557
;
553558

554559
/// bindigit ::= "0" | "1"
555560
fragment BIN_DIGIT
556-
: [01]
561+
: [01_]
557562
;
558563

559564
/// pointfloat ::= [intpart] fraction | intpart "."

0 commit comments

Comments
 (0)