Skip to content

Commit f9b8382

Browse files
committed
added processing of multi-element error case in list tail
1 parent 9d7175f commit f9b8382

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050

5151
import static com.igormaznitsa.prologparser.DefaultParserContext.of;
5252
import static com.igormaznitsa.prologparser.ParserContext.*;
53+
import static com.igormaznitsa.prologparser.tokenizer.Op.METAOPERATOR_COMMA;
54+
import static com.igormaznitsa.prologparser.tokenizer.Op.METAOPERATOR_VERTICAL_BAR;
5355
import static com.igormaznitsa.prologparser.utils.Koi7CharOpMap.ofOps;
5456
import static java.util.Objects.requireNonNull;
5557

@@ -88,7 +90,7 @@ public abstract class PrologParser implements Iterable<PrologTerm>, Closeable {
8890
META_OP_MAP.add(Op.METAOPERATOR_LEFT_SQUARE_BRACKET);
8991
OPERATOR_RIGHTSQUAREBRACKET = META_OP_MAP.add(Op.METAOPERATOR_RIGHT_SQUARE_BRACKET);
9092
OPERATOR_VERTICALBAR = META_OP_MAP.add(Op.METAOPERATOR_VERTICAL_BAR);
91-
OPERATOR_COMMA = META_OP_MAP.add(Op.METAOPERATOR_COMMA);
93+
OPERATOR_COMMA = META_OP_MAP.add(METAOPERATOR_COMMA);
9294

9395
OPERATORS_PHRASE = ofOps(OPERATOR_DOT);
9496
OPERATORS_INSIDE_LIST = ofOps(OPERATOR_COMMA, OPERATOR_RIGHTSQUAREBRACKET, OPERATOR_VERTICALBAR);
@@ -108,7 +110,7 @@ public PrologParser(final Reader source, final ParserContext context) {
108110
this.parserFlags = context == null ? FLAG_NONE : context.getFlags();
109111
}
110112

111-
public PrologParser autoCloseReader(){
113+
public PrologParser autoCloseReader() {
112114
this.autoCloseReaderFlag = true;
113115
return this;
114116
}
@@ -302,9 +304,21 @@ private PrologTerm readList(final TokenizerResult openingBracket) {
302304
if (rightPart == null) {
303305
throw new PrologParserException("There is not any term as the tail at the list", this.tokenizer.getLastTokenLine(), this.tokenizer.getLastTokenPos());
304306
}
305-
if (rightPart.getType() == TermType.ATOM && rightPart.getQuotation() == Quotation.NONE && ",".equals(rightPart.getText())) {
307+
308+
if (rightPart.getType() == TermType.STRUCT
309+
&& (rightPart.getFunctor() == METAOPERATOR_COMMA
310+
|| rightPart.getFunctor() == METAOPERATOR_VERTICAL_BAR)
311+
) {
312+
throw new PrologParserException("Unexpected comma or bar in rest of list", this.tokenizer.getLastTokenLine(), this.tokenizer.getLastTokenPos());
313+
}
314+
315+
if (rightPart.getType() == TermType.ATOM
316+
&& rightPart.getQuotation() == Quotation.NONE
317+
&& ",".equals(rightPart.getText())
318+
) {
306319
throw new PrologParserException("Comma operator in list tail", this.tokenizer.getLastTokenLine(), this.tokenizer.getLastTokenPos());
307320
}
321+
308322
leftPartFirst.replaceEndListElement(rightPart);
309323
}
310324
return leftPartFirst;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ public void testParseStructure() {
352352

353353
@Test
354354
public void testParseList() {
355+
assertThrows(PrologParserException.class, ()->parseEd("[1,2|3,4].").next());
356+
assertThrows(PrologParserException.class, ()->parseEd("[1,2|3,4,5].").next());
357+
assertThrows(PrologParserException.class, ()->parseEd("[1,2|3|4].").next());
358+
assertThrows(PrologParserException.class, ()->parseEd("[1,2||4].").next());
359+
assertThrows(PrologParserException.class, ()->parseEd("[|4].").next());
360+
355361
PrologList list = (PrologList) parseEd("[].").next();
356362
assertEquals(TermType.LIST, list.getType());
357363
assertEquals(PrologList.class, list.getClass());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ private String generateList(final int recusionLevel) {
181181
for (int i = 0; i < len; i++) {
182182
if (i != 0) {
183183
if (i < len - 1 && !tailAdded && this.rnd.nextInt(10) > 8) {
184-
builder.append('|');
184+
builder.append("|(");
185185
tailAdded = true;
186186
} else {
187187
builder.append(',');
@@ -192,7 +192,7 @@ private String generateList(final int recusionLevel) {
192192
}
193193

194194

195-
builder.append(']');
195+
builder.append(tailAdded ? ")]" : "]");
196196
return builder.toString();
197197
}
198198

0 commit comments

Comments
 (0)