Skip to content

Commit db72b65

Browse files
committed
improved curly block processing added tests
1 parent dd78e02 commit db72b65

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ public PrologTerm convertToTermAndRelease() {
255255
}
256256

257257
if (this.leftBranch == null) {
258-
if (this.rightBranch.getType() == TermType.STRUCT && this.rightBranch.savedTerm.isBlock()) {
258+
if (this.rightBranch.getType() == TermType.STRUCT && this.rightBranch.savedTerm.isBlock() && !((PrologStruct)this.rightBranch.savedTerm).isEmpty()) {
259259
final PrologTerm rightTerm = this.rightBranch.convertToTermAndRelease();
260260
Op operator = (Op) wrapper.getWrappedTerm();
261261
final PrologTerm blockContent = ((PrologStruct) rightTerm).getTermAt(0);
@@ -272,12 +272,16 @@ public PrologTerm convertToTermAndRelease() {
272272
: new PrologStruct(operator, terms, wrapper.getLine(), wrapper.getPos());
273273
}
274274
} else {
275-
if (operator.getArity() == 1) {
276-
return new PrologStruct(operator, new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos());
275+
if (rightTerm.isCurlyBlock()) {
276+
return new PrologStruct(operator, new PrologTerm[] {rightTerm}, wrapper.getLine(), wrapper.getPos());
277277
} else {
278-
operator = this.parser.getContext().findOpForName(this.parser, operator.getTermText()).findForArity(1);
279-
return operator == null ? new PrologStruct(new PrologAtom(wrapper.getTermText(), Quotation.SINGLE, wrapper.getLine(), wrapper.getPos()), new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos())
280-
: new PrologStruct(operator, new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos());
278+
if (operator.getArity() == 1) {
279+
return new PrologStruct(operator, new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos());
280+
} else {
281+
operator = this.parser.getContext().findOpForName(this.parser, operator.getTermText()).findForArity(1);
282+
return operator == null ? new PrologStruct(new PrologAtom(wrapper.getTermText(), Quotation.SINGLE, wrapper.getLine(), wrapper.getPos()), new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos())
283+
: new PrologStruct(operator, new PrologTerm[] {blockContent}, wrapper.getLine(), wrapper.getPos());
284+
}
281285
}
282286
}
283287
}

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

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,37 @@
11
package com.igormaznitsa.prologparser;
22

3+
import static com.igormaznitsa.prologparser.DefaultParserContext.of;
4+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_BLOCK_COMMENTS;
5+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_CURLY_BRACKETS;
6+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_NONE;
7+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_VAR_AS_FUNCTOR;
8+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_ZERO_QUOTATION_CHARCODE;
9+
import static com.igormaznitsa.prologparser.ParserContext.FLAG_ZERO_STRUCT;
10+
import static com.igormaznitsa.prologparser.terms.OpContainer.make;
11+
import static com.igormaznitsa.prologparser.terms.Quotation.BACK_TICK;
12+
import static com.igormaznitsa.prologparser.terms.Quotation.DOUBLE;
13+
import static com.igormaznitsa.prologparser.terms.Quotation.NONE;
14+
import static com.igormaznitsa.prologparser.terms.Quotation.SINGLE;
15+
import static com.igormaznitsa.prologparser.terms.TermType.ATOM;
16+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.FX;
17+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.FY;
18+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.XF;
19+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.XFX;
20+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.XFY;
21+
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.YFX;
22+
import static java.util.stream.Collectors.joining;
23+
import static org.junit.jupiter.api.Assertions.assertEquals;
24+
import static org.junit.jupiter.api.Assertions.assertFalse;
25+
import static org.junit.jupiter.api.Assertions.assertNotNull;
26+
import static org.junit.jupiter.api.Assertions.assertNotSame;
27+
import static org.junit.jupiter.api.Assertions.assertSame;
28+
import static org.junit.jupiter.api.Assertions.assertThrows;
29+
import static org.junit.jupiter.api.Assertions.assertTrue;
30+
import static org.junit.jupiter.api.Assertions.fail;
31+
import static org.mockito.Mockito.clearInvocations;
32+
import static org.mockito.Mockito.mock;
33+
import static org.mockito.Mockito.when;
34+
335
import com.igormaznitsa.prologparser.exceptions.PrologParserException;
436
import com.igormaznitsa.prologparser.terms.OpContainer;
537
import com.igormaznitsa.prologparser.terms.PrologAtom;
@@ -34,16 +66,6 @@
3466
import java.util.Set;
3567
import java.util.concurrent.atomic.AtomicInteger;
3668

37-
import static com.igormaznitsa.prologparser.DefaultParserContext.of;
38-
import static com.igormaznitsa.prologparser.ParserContext.*;
39-
import static com.igormaznitsa.prologparser.terms.OpContainer.make;
40-
import static com.igormaznitsa.prologparser.terms.Quotation.*;
41-
import static com.igormaznitsa.prologparser.terms.TermType.ATOM;
42-
import static com.igormaznitsa.prologparser.tokenizer.OpAssoc.*;
43-
import static java.util.stream.Collectors.joining;
44-
import static org.junit.jupiter.api.Assertions.*;
45-
import static org.mockito.Mockito.*;
46-
4769
public class IntegrationTest {
4870

4971
private static PrologParser parseCpl(final String str) {
@@ -1197,6 +1219,18 @@ public void testStandardTermOrder() {
11971219
*/
11981220
@Test
11991221
public void testConformity() {
1222+
assertThrows(PrologParserException.class, () -> parseEd("{:- :- c} = {:-(:-,c)}.").next());
1223+
assertThrows(PrologParserException.class, () -> parseEd("{1} = {}(1).").next());
1224+
1225+
assertEquals("writeq({- = xf1})", parseEd("writeq({- =xf1}).").next().toString());
1226+
assertEquals("X = {,}", parseEd("X ={,}.").next().toString());
1227+
assertEquals("{- = -1} = {(- =) - 1}", parseEd("{- = - 1}={(-(=)) - 1}.").next().toString());
1228+
assertEquals("{- - c} = {- - c}", parseEd("{- - c}={-(-(c))}.").next().toString());
1229+
1230+
assertEquals("writeq([+ {a}, + []])", parseEd("writeq([+{a},+[]]).").next().toString());
1231+
assertEquals("writeq(- {a})", parseEd("writeq(-{a}).").next().toString());
1232+
assertEquals("writeq(- {})", parseEd("writeq(-{}).").next().toString());
1233+
12001234
assertEquals("writeq([a, b|','])", parseEd("writeq([a,b|',']).").next().toString());
12011235
assertEquals("X = 1", parseEd("X = 2'1.").next().toString());
12021236
assertEquals("writeq(- - 1)", parseEd("writeq(-(-(1))).").next().toString());

0 commit comments

Comments
 (0)