Skip to content

Commit dd78e02

Browse files
committed
added support empty curly block
1 parent 66f8b5d commit dd78e02

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

src/main/java/com/igormaznitsa/prologparser/PrologParser.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -475,15 +475,22 @@ private PrologTerm readBlock(final Koi7CharOpMap endOperators) {
475475
}
476476

477477
if (processReadAtom) {
478+
boolean emptyCurly = false;
478479
if (readAtom == null) {
480+
if (onlyCharCode == '{') {
481+
emptyCurly = true;
482+
} else
479483
throw new PrologParserException("Illegal start of term",
480484
readAtomContainer.getLine(), readAtomContainer.getPos());
481485
}
482486

483-
readAtom.setLine(readAtomContainer.getLine());
484-
readAtom.setPos(readAtomContainer.getPos());
485-
486-
readAtom = new PrologStruct(onlyCharCode == '{' ? Op.VIRTUAL_OPERATOR_CURLY_BLOCK : Op.VIRTUAL_OPERATOR_BLOCK, new PrologTerm[] {readAtom}, readAtomContainer.getLine(), readAtomContainer.getPos());
487+
if (emptyCurly) {
488+
readAtom = new PrologStruct(Op.VIRTUAL_OPERATOR_CURLY_BLOCK, EMPTY_TERM_ARRAY, readAtomContainer.getLine(), readAtomContainer.getPos());
489+
}else {
490+
readAtom.setLine(readAtomContainer.getLine());
491+
readAtom.setPos(readAtomContainer.getPos());
492+
readAtom = new PrologStruct(onlyCharCode == '{' ? Op.VIRTUAL_OPERATOR_CURLY_BLOCK : Op.VIRTUAL_OPERATOR_BLOCK, new PrologTerm[] {readAtom}, readAtomContainer.getLine(), readAtomContainer.getPos());
493+
}
487494

488495
final TokenizerResult token = this.tokenizer.readNextToken();
489496

src/main/java/com/igormaznitsa/prologparser/terms/PrologStruct.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,17 @@ public String toString() {
187187
if (this.functor.getTermType() == TermType.OPERATOR) {
188188
if (this.isBlock()) {
189189
if (this.isCurlyBlock()) {
190-
builder.append('{').append(this.elements[0].toString()).append('}');
190+
if (this.isEmpty()) {
191+
builder.append("{}");
192+
} else {
193+
builder.append('{').append(this.elements[0].toString()).append('}');
194+
}
191195
} else {
192-
builder.append('(').append(this.elements[0].toString()).append(')');
196+
if (this.isEmpty()) {
197+
builder.append("()");
198+
} else {
199+
builder.append('(').append(this.elements[0].toString()).append(')');
200+
}
193201
}
194202
} else {
195203
final Op operatorFunctor = (Op) functor;
@@ -321,6 +329,10 @@ public String toString() {
321329
return builder.toString();
322330
}
323331

332+
public boolean isEmpty() {
333+
return this.elements.length == 0;
334+
}
335+
324336
@Override
325337
public Stream<PrologTerm> stream() {
326338
return StreamSupport.stream(

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,9 @@ private void assertReadSictusTerms(final int expected, final String resource, fi
588588
public void testCurlyBracket() {
589589
assertEquals("{1 , 2 , 3 , 4 , 5}", new GenericPrologParser(new StringReader("{1,2,3,4,5}."), of(FLAG_CURLY_BRACKETS)).next().toString());
590590
assertEquals("{1 , {2 , {3 , {4} , 5}}}", new GenericPrologParser(new StringReader("{1,{2,{3,{4},5}}}."), of(FLAG_CURLY_BRACKETS)).next().toString());
591+
assertEquals("[1, {2 , 3}|X]", new GenericPrologParser(new StringReader("[1,{2,3}|X]."), of(FLAG_CURLY_BRACKETS)).next().toString());
592+
assertEquals("{}", new GenericPrologParser(new StringReader("{}."), of(FLAG_CURLY_BRACKETS)).next().toString());
593+
591594
assertThrows(PrologParserException.class, () -> new GenericPrologParser(new StringReader("test{1,2,3,4,5}."), of(FLAG_CURLY_BRACKETS)).next());
592595
}
593596

0 commit comments

Comments
 (0)