diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Eo.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Eo.g4 index 5d4199b4ac..e2414119e3 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Eo.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Eo.g4 @@ -47,7 +47,7 @@ metas // Objects // Ends on the next line objects - : (object EOL?)* object + : (object EOL?)+ ; comment diff --git a/eo-parser/src/main/java/org/eolang/parser/XeEoListener.java b/eo-parser/src/main/java/org/eolang/parser/XeEoListener.java index 8e9a7369da..c267cf62da 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeEoListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeEoListener.java @@ -28,8 +28,10 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; +import javax.swing.text.html.Option; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.ErrorNode; @@ -280,11 +282,16 @@ public void exitJustNamed(final EoParser.JustNamedContext ctx) { } @Override - @SuppressWarnings("PMD.ConfusingTernary") public void enterAtom(final EoParser.AtomContext ctx) { - this.startObject(ctx) - .prop("atom", ctx.type().typeFqn().getText()) - .leave(); + final EoParser.TypeFqnContext fqn = ctx.type().typeFqn(); + if (fqn == null) { + this.errors.add(XeEoListener.error(ctx, "Atom must have a type")); + this.startObject(ctx).leave(); + } else { + this.startObject(ctx) + .prop("atom", fqn.getText()) + .leave(); + } } @Override diff --git a/eo-parser/src/test/java/org/eolang/parser/EoSyntaxTest.java b/eo-parser/src/test/java/org/eolang/parser/EoSyntaxTest.java index 7d082ca64e..5df6d00e83 100644 --- a/eo-parser/src/test/java/org/eolang/parser/EoSyntaxTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/EoSyntaxTest.java @@ -89,7 +89,7 @@ void printsProperListingEvenWhenSyntaxIsBroken() throws Exception { "[] > x-н, 1\n" ); MatcherAssert.assertThat( - EoIndentLexerTest.TO_ADD_MESSAGE, + "EO syntax is broken, but listing should be printed", XhtmlMatchers.xhtml( new String( new EoSyntax( @@ -100,7 +100,7 @@ void printsProperListingEvenWhenSyntaxIsBroken() throws Exception { ) ), XhtmlMatchers.hasXPaths( - "/program/errors[count(error)=2]", + "/program/errors[count(error)=3]", String.format("/program[listing='%s']", src) ) );