8

I'm new to ANTLR and trying to write grammar in ANTLR4 without any prior brush with the previous version. I'm following the book 'The Definitive ANTLR 4 Reference'. I use Eclipse and installed ANTLR4 IDE as given in here. I wrote the following grammar in Expr.g4:

grammar Expr;

import Common;

options{
language = Java;
}
prog: stat+;

stat: expr NEWLINE
    | ID '=' expr NEWLINE
    | NEWLINE;

expr: expr ('/'|'*') expr
    | expr ('+'|'-') expr
    | INT
    | ID
    | '('expr')';

The Common.g4 contains the following:

lexer grammar Common;

ID: [A-Za-z]+;
INT: [0-9]+;
NEWLINE: '\r'?'\n';
WS: [\t]+ -> skip;

The lexer.java was created but not parser.java and visitor.java and other base file. Please help me fix the problem. Thanks in advance.

Pacu
  • 163
  • 1
  • 2
  • 8
  • Not enough information. Are you sure the parser and visitor are supposed to be generated? Did you look in the correct directories? Perhaps you should review the documentation and/or issue tracker once more. – blackcompe Jan 19 '14 at 04:45
  • @blackcompe Yes, I have used other grammar and checked. When I saved the file all the files were created automatically. But not in the above case. – Pacu Jan 20 '14 at 16:37
  • I have same problem, have you found solution? – user902383 Dec 04 '15 at 09:29

5 Answers5

8

In fact I had the same problem once, I used to integrate two G4 files within the same project the first one generated Visitor but the second didn't.

Then I realized that each G4 file has its own configuration for code generation that you can change by:

  1. Right click on the G4 file then Run As
  2. Choose External tool configuration
  3. Change the no-visitor to visitor, you can do the same for listener.

Now the Visitor file is generated.

A.Thabet
  • 113
  • 3
  • 9
  • 1
    This did the trick for me! I was getting no visitor files. I am using just one G4 file, but knowing that each G4 file has its own tool configuration was the key... – skrilmps Sep 01 '17 at 20:39
6

For Maven it was not clear from the documentation how to set the visitor property. You have to do it in the element.

<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>${antlr.version}</version>
    <configuration>
        <visitor>true</visitor>
    </configuration>
    ...
</plugin>
aled
  • 21,330
  • 3
  • 27
  • 34
2

You should generate your grammars during the build process. Starting with ANTLR 4.2 (which is currently available through the Sonatype snapshot Maven repository as 4.2-SNAPSHOT), the Maven plugin supports Eclipse m2e. The documentation for the Maven plugin is available here:

http://www.antlr.org/api/maven-plugin/master/index.html

I would not trust any build which uses ANTLR grammars and does not automate the code generation steps into the build itself, and highly recommend you avoid using manual code generation steps or code generation as part of an IDE extension ever.

Sam Harwell
  • 97,721
  • 20
  • 209
  • 280
2

Check your JRE version (command line [windows]: java -version).
I was having the same problem with this example. because the JRE 8.

So, if you have JRE8, Posible solutions are:

  • adding -version:1.7 in eclipse.ini ; or
  • in the "Run As/External Tools Configurations...", adding -version:1.7 in Arguments; or
  • selecting JRE 1.7 in Windows/Java/Installed JREs

To generate XXXVisitor, in "Run As/External Tools Configurations..." change -no-visitor argument by -visitor.

  • Works for -version:1.6, too.
Rabamirezzan
  • 87
  • 1
  • 5
  • 1
    When you are using command line to generate the java class use `-visitor` as arg as mentioned above to generate the visitor class. –  Dec 13 '16 at 07:09
1

Preference -> ANTLR4 -> Tool -> Options -> Generate parse tree visitor

alvinchen
  • 33
  • 1
  • 6