Skip to content

Commit e848257

Browse files
committed
implemented support for ISO radix
1 parent 9b2042c commit e848257

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

src/main/java/com/igormaznitsa/prologparser/tokenizer/Tokenizer.java

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,23 @@ public final TokenizerResult get() {
9191
this.tokenizerResultPool.fill();
9292
}
9393

94+
private static boolean isCharAllowedForRadix(final char chr, final int radix) {
95+
if (radix == 10) {
96+
return Character.isDigit(chr);
97+
} else if (radix < 10) {
98+
return chr >= '0' && chr < ('0' + radix);
99+
} else {
100+
if (chr >= '0' && chr <= '9') {
101+
return true;
102+
}
103+
final int diff = radix - 10;
104+
if (chr >= 'A' && chr < ('A' + diff)) {
105+
return true;
106+
}
107+
return chr >= 'a' && chr < ('a' + diff);
108+
}
109+
}
110+
94111
TokenizerResult getLastPushed() {
95112
return this.lastPushedTerm;
96113
}
@@ -542,12 +559,30 @@ TokenizerResult readNextToken() {
542559
strBuffer.clear();
543560
}
544561
} else {
545-
push(chr);
546-
return this.tokenizerResultPool.find().setData(
547-
makeTermFromString(strBuffer.toString(), radix, quoting, state),
548-
TokenizerState.INTEGER,
549-
getLastTokenLine(),
550-
getLastTokenPos());
562+
boolean radixCharFound = false;
563+
if (radix == 10 && strBuffer.isSingleChar('0')) {
564+
if (chr == 'x') {
565+
radixCharFound = true;
566+
radix = 16;
567+
strBuffer.clear();
568+
} else if (chr == 'o') {
569+
radixCharFound = true;
570+
radix = 8;
571+
strBuffer.clear();
572+
} else if (chr == 'b') {
573+
radixCharFound = true;
574+
radix = 2;
575+
strBuffer.clear();
576+
}
577+
}
578+
if (!radixCharFound) {
579+
push(chr);
580+
return this.tokenizerResultPool.find().setData(
581+
makeTermFromString(strBuffer.toString(), radix, quoting, state),
582+
TokenizerState.INTEGER,
583+
getLastTokenLine(),
584+
getLastTokenPos());
585+
}
551586
}
552587
}
553588
}
@@ -849,23 +884,6 @@ state, getLastTokenLine(),
849884
}
850885
}
851886

852-
private static boolean isCharAllowedForRadix(final char chr, final int radix) {
853-
if (radix == 10) {
854-
return Character.isDigit(chr);
855-
} else if (radix < 10) {
856-
return chr >= '0' && chr < ('0' + radix);
857-
} else {
858-
if (chr >= '0' && chr <= '9') {
859-
return true;
860-
}
861-
final int diff = radix - 10;
862-
if (chr >= 'A' && chr < ('A' + diff)) {
863-
return true;
864-
}
865-
return chr >= 'a' && chr < ('a' + diff);
866-
}
867-
}
868-
869887
PrologTerm makeTermFromString(final String str, final int radix, final PrologTerm.QuotingType quotingType, final TokenizerState state) {
870888
PrologTerm result;
871889

src/test/java/com/igormaznitsa/prologparser/IntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ private String parseSortAndJoin(final String text) {
896896

897897
@Test
898898
public void testStringWithIsoControl() {
899-
assertThrows(PrologParserException.class, ()-> parseEd("'hello\u0000world'.").next());
899+
assertThrows(PrologParserException.class, () -> parseEd("'hello\u0000world'.").next());
900900
assertEquals("'hello\\nworld'", parseEd("'hello\\\nworld'.").next().toString());
901901
assertEquals("'hello\\nworld'", parseEd("'hello\\\r\nworld'.").next().toString());
902902
}

src/test/java/com/igormaznitsa/prologparser/tokenizer/TokenizerTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,13 @@ public void testQuoting() {
247247
@Test
248248
public void testUnderscoreInNumbers_Normal() {
249249
assertEquals(6384, ((PrologInt) tokenizeOf("2'001_1000_1111_0000.").readNextToken().getResult()).getNumber().intValue());
250+
assertEquals(6384, ((PrologInt) tokenizeOf("0b001_1000_1111_0000.").readNextToken().getResult()).getNumber().intValue());
250251
assertEquals(255, ((PrologInt) tokenizeOf("16'F_F.").readNextToken().getResult()).getNumber().intValue());
252+
assertEquals(255, ((PrologInt) tokenizeOf("0xF_F.").readNextToken().getResult()).getNumber().intValue());
251253
assertEquals(255, ((PrologInt) tokenizeOf("16'f_f.").readNextToken().getResult()).getNumber().intValue());
254+
assertEquals(255, ((PrologInt) tokenizeOf("0xf_f.").readNextToken().getResult()).getNumber().intValue());
255+
assertEquals(511, ((PrologInt) tokenizeOf("8'77_7.").readNextToken().getResult()).getNumber().intValue());
256+
assertEquals(511, ((PrologInt) tokenizeOf("0o77_7.").readNextToken().getResult()).getNumber().intValue());
252257

253258
assertEquals(12345, ((PrologInt) tokenizeOf("12_345.").readNextToken().getResult()).getNumber().intValue());
254259
assertEquals(12345, ((PrologInt) tokenizeOf("12_34_5.").readNextToken().getResult()).getNumber().intValue());

0 commit comments

Comments
 (0)