Andrei
Andrei

Reputation: 312

Antlr4: Confusing error message (concatenates correct and incorrect lines) for Java grammar

I am trying to build my own parser based on the existing Java grammar.

Even if I use the Java7 grammar from the source repo, generate the parser and use the TestRig from antlr-4.9.3-complete.jar given the code:

1  public class Test {
2    public static void main() {
3      test
4      int b = 1;
5    }
6  }

I get the following error:

line 4:8 no viable alternative at input 'test\n int'

So for some reason it concatenates the incorrect "test" line with correct "int" line. Also it says "line 4:8" pointing at the "int" line when it should be pointing to "test" (line 3).

(In a regular Java editor I would see a correct error highlighting for the "test" word which would sound like):

"Syntax error, insert "VariableDeclarators" to complete LocalVariableDeclaration"

What do I do to arrive at a similar error with ANTLR so it only picks on the wrong "test" line? Most likely it's just my misunderstanding how antlr interprets the errors, then how would I get the listener to at least report correctly the starting line?

Upvotes: 1

Views: 221

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170178

You can't compare a sophisticated editor/IDE with a parser (generated by ANTLR). A text editor/IDE knows more about the input source and can look up if test is a valid type, and give a meaningful error message if the type cannot be found.

ANTLR's parser rule "sees" test int b as an Identifier, an INT and another Identifier token and cannot match any parser rule for these tokens, resulting in the error starting at the identifier test.

For example, if class test {} was in the classpath, then input without int would be valid:

public class Test {
  public static void main() {
    test
    /*int*/ a = 1;
  }
}

It wouldn't compile of course, but the syntax would be correct:

enter image description here

Upvotes: 2

Related Questions