Using #header in ANTLR - header

I'm having trouble getting the "#header" or any other # rule to work in ANTLR. With a very basic grammer, like this:
grammar test;
options {
language = CSharp2;
}
#header {
using System.Collections.Generic;
}
tokens {
TEST;
}
something : TEST*;
TEST : '0' .. '9';
This seems to adhere to the ANTLR documentation and various other examples online, but when I try to generate the output through either ANTLRWorks v1.4 or the ANTLR jar v3.2, I get the following error:
Cannot generate the grammar because:
error(100): [path]\test.g:11:1 syntax error: antlr: [path]\test.g:11:1
unexpected token: tokens {
Which I cannot seem to shake. I am able to generate the lexer and parser successfully without the #header included in the grammar. I have the latest version of Java on Windows:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)
I assume this is something stone simple and I'm just blind to it, so please bring on the obvious answers.

The error is because those blocks are required to appear in a certain order.
options
tokens
#header
#members
then your rules

Related

Eclipse-Kepler, Java 8 compilation issue "syntax errors on tokens"

I am using Eclipse Kepler with jdk1.8.0.
I do not face any compilation problems in import statements related to java8 or collect construct. However I get the compilation issue in:- Dish::getName...it says.. Syntax errors on tokens, delete the tokens.
Just trying to run the following code:
List<String> dishNames = menu.stream()
.map(Dish::getName)
.collect(toList());
System.out.println(dishNames);
Dish is a java object with String property name.
I have installed JDK8, added the latest JRE in eclipse Java Build Path.
Java compiler compliance.
Any hints what something silly I am missing?
I think you missed installing support of java8 in eclipse kepler.
You can follow this link for detailed instructions.
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler

ANTRL4: TestRig error

I am just trying to get ANTLR to run following those instructions: http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4
The grammar is translated into code, but when I want to call TestRig, I'm getting the error "Can't load Hello as lexer or parser".
TestRig is located in file C:\bin\grun.cmd and contains this command
java -cp .;C:\LIBS\Java\ANTLR\antlr-4.1-complete.jar
org.antlr.v4.runtime.misc.TestRig %1 %2
Is anything wrong with that?
When I try to start TestRig from the ANTLWorks IDE I'm receiving warnings like:
warning: Supported source version 'RELEASE_6' from annotation
processor
'org.netbeans.modules.openide.modules.PatchedPublicProcessor' less
than -source '1.7'
warning: Supported source version 'RELEASE_6' from
annotation processor
'org.netbeans.modules.openide.util.ServiceProviderProcessor' less than
-source '1.7'
warning: Supported source version 'RELEASE_6' from annotation processor
'org.netbeans.modules.openide.util.NamedServiceProcessor' less than
-source '1.7'
warning: Supported source version 'RELEASE_6' from annotation processor
'org.netbeans.modules.openide.util.NbBundleProcessor' less than
-source '1.7'
and errors like:
line 1:7 token recognition error at: ' '
...........
line 1:0 missing 'hello' at 'grammar'
On Linux I'm experiencing another problem with ANTLRWorks2:
For whatever reason the menu bar doesn't work so that it's impossible to select anything from there. Anyway, clicking on an icon below the menu bar works.
What might be wrong here? Thanks for any help.
Almost a year late on this but in case others have the issue...
I am guessing you named your grammar file 'hello' instead of 'Hello' or you didn't copy the contents correctly.
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4
The warnings about 'RELEASE_6' are supposedly harmless according to this bug report.
https://netbeans.org/bugzilla/show_bug.cgi?id=210286
I am still getting these warnings in ANTLRWorks2.1. According to the final post it may be fixed in the NetBeans plugin. However, as far as I can tell this plugin has been recently broken.
I can't help you with IDE issues on Linux.

I am facing Issues after migrating Antlr version 3.1.1 to Antlr 3.3 (getting NoSuchMethodError: CommonTreeNodeStream.getNodeIndex)

Currently im using ANTLR V3.1.1,now i have migrated to ANTLR V3.3. after that i'm getting the following error:
Unexpected exception occurred:
java.lang.NoSuchMethodError: org.antlr.runtime.tree.CommonTreeNodeStream.getNodeIndex(Ljava/lang/Object;)I
at
*.expression.antlr.FocusCommonTreeNodeStream.getNodeIndex(FocusCommonTreeNodeStream.java:16)
Please help me on this issue..
Thanks in advance..!!
Okay, by looking at the comments under your original post, I'll post the answer here for completeness sake, in case people find this Q&A after searching the web.
The reason you get this exception is because you simply replaced the ANTLR jar and did not regenerate a lexer and parser from your grammar. The compiled lexer and parser files that were generated by ANTLR v3.1.1 need the ANTLR v3.1.1 run-time classes. They won't (necessarily) work with other ANTLR run-time versions.
So, if you want to upgrade to ANTLR v3.3, you'll need to re-generate a (new) lexer and parser from your grammar file using the org.antlr.Tool from ANTLR v3.3.

Antlr question: cannot get Antlr tool to compile simple file from ANTLRWorks

Here is the grammar file:
grammar fred;
test : 'fred';
Here is the batch file to launch the tool:
SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_24
SET PATH=%PATH%;%JAVA_HOME%\bin
SET ANTLR_HOME=c:/users/don/workspace/antlrAssign/lib/
java -cp %ANTLR_HOME%/antlr-3.3-complete.jar antlr.Tool fred.g
Here's the result:
ANTLR Parser Generator Version 2.7.7 (20060906) 1989-2005
fred.g:1:1: unexpected token: grammar
error: Token stream error reading grammar(s):
fred.g:3:19: expecting ''', found 'r'
fred.g:1:1: rule grammar trapped:
fred.g:1:1: unexpected token: grammar
TokenStreamException: expecting ''', found 'r'
Prior postings refer to "org.antlr.Tool" but the 3.3 jar has it located as above. The idea was to create a debug version of a tree parser, and according to the documentation, you have to use the command line tool.
Has anyone seen this before? Am I nuts? It's two lines long and its dying on the first word in the file.
Of course this compiles in antlrworks.
Any help appreciated, I can't afford any more adjustments to my medications.
Follow up:
I found that if you use the Run --> Debug menu option in ANTLRWORKS it will produce a debug version of a tree parser, but in my hands the command line tool does not. The debug source produced lives in the output folder for generation. In ANTLRWORKS to get a non debug version use the Generate menu option. Using the debug version of the tree parser in eclipse, fire up the test harness and wait, then connect with ANTRWORKS via Run Remote Debug, on the treegrammar parser file. It walked through the parser for the tree and gave me a mismatched tree node error (not a parser error, which is good because I'm debugging the tree parser). So now I just need to find what other dumb thing I've done. HTH somebody besides me.
Prior postings refer to "org.antlr.Tool" but the 3.3 jar has it located as above.
The old ANTLR 2.x Tool class (antlr.Tool) is still included in the 3.x version(s) of ANTLR, but you need to use the ANTLR 3.x Tool (located: org.antlr.Tool) for your grammar since it is a 3.x grammar.

Problem generating code with ANTLR 1.3 / ANTLRWorks

I have downloaded ANTLR 1.3 and ANTLRWorks and can generate rules and syntax diagrams OK. When I try to generate code (e.g. by GenerateCode in ANTLRWorks or with java org.antlr.Tool Temp.g I get
error(100): C:\temp\Temp.g 0:0: syntax error: codegen: <AST>: 0:0: unexpected end of subtree
I'm on Windows 7 beta, Java 1.6. I have not specifically set up a classpath as the distro implied ANTLRWorks worked out of the box.
EDIT
This is a trivial grammar (generated by ANTLRWorks example) and yes, the file exists, with contents:
grammar Temp;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
I think this is because there were only lexical rules (of the type above). When I included:
prog: ID;
it worked