Dear all, I apologise in advance for asking what might be an ignorant question, but it has been ages since I used Java for anything and so my Java troubleshooting skills are currently rusty/nonexistent.
On a box running Debian Stretch (oldstable), I am trying to compile an Antlr4 lexer & parser. The first step (generating the lexer & parser .java files from .g4 files) works fine, but the second step (compiling the the lexer & parser) does not. Here's the first step: $ mkdir /tmp/antlr-test $ cd $_ $ wget --page-requisites --recursive --level=inf --convert-links \ --no-parent \ https://www.cs.cornell.edu/courses/cs4120/2013fa/handouts/antlr.html $ cd www.cs.cornell.edu/courses/cs4120/2013fa/handouts/xi $ ls -1 hello.xi XiLexer.g4 XiParser.g4 $ antlr4 XiLexer.g4 XiParser.g4 -no-listener ; echo $? 0 $ ls -1 hello.xi XiLexer.g4 XiLexer.java XiLexer.tokens XiParser.g4 XiParser.java XiParser.tokens All fine so far, as you can see. Now the second step: $ javac Xi*.java XiLexer.java:2: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.Lexer; ^ [SNIP - for full output, see attached file.] 100 errors Oh dear. What to do? The [Antlr4 FAQ](https://github.com/antlr/antlr4/blob/master/doc/faq/installation.md_ says, "If you see these kinds of errors, it's because you don't have the runtime or complete ANTLR library in your CLASSPATH." I installed Antlr4 via `sudo apt install antlr4` and I installed javac via `sudo apt install default-jdk` so I would hope that Antlr4 is reachable by javac, but in case not, I tried manually populating the CLASSPATH environment variable with the same contents found in the antlr4 executable, before running javac again: $ cat /usr/bin/antlr4 #!/bin/sh CLASSPATH=/usr/share/java/stringtemplate4.jar:/usr/share/java/antlr4.jar:/usr/share/java/antlr4-runtime.jar:/usr/share/java/antlr3-runtime.jar/:/usr/share/java/treelayout.jar exec java -cp $CLASSPATH org.antlr.v4.Tool "$@" $ CLASSPATH='.' $ CLASSPATH+=':/usr/share/java/stringtemplate4.jar' $ CLASSPATH+=':/usr/share/java/antlr4.jar' $ CLASSPATH+=':/usr/share/java/antlr4-runtime.jar' $ CLASSPATH+=':/usr/share/java/antlr3-runtime.jar/' $ CLASSPATH+=':/usr/share/java/treelayout.jar"; javac Xi*.java XiLexer.java:2: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.Lexer; ^ [SNIP - for full output, see attached file.] 100 errors No improvement :( So my question is: how can I make the `javac Xi*.java` command succeed, *without* having to fall back on a non-Debian-provided Antlr4 installation? (Two examples of non-Debian-provided Antlr4 installation would be: a .jar produced by me cloning and building https://github.com/antlr/antlr4; or if I downloaded this .jar: https://www.antlr.org/download/antlr-4.7.1-complete.jar ). Thanks in advance for any help you can provide! Sam -- A: When it messes up the order in which people normally read text. Q: When is top-posting a bad thing? () ASCII ribbon campaign. Please avoid HTML emails & proprietary /\ file formats. (Why? See e.g. https://v.gd/jrmGbS ). Thank you.
XiLexer.java:2: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.Lexer; ^ XiLexer.java:3: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.CharStream; ^ XiLexer.java:4: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.Token; ^ XiLexer.java:5: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.TokenStream; ^ XiLexer.java:6: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.*; ^ XiLexer.java:7: error: package org.antlr.v4.runtime.atn does not exist import org.antlr.v4.runtime.atn.*; ^ XiLexer.java:8: error: package org.antlr.v4.runtime.dfa does not exist import org.antlr.v4.runtime.dfa.DFA; ^ XiLexer.java:9: error: package org.antlr.v4.runtime.misc does not exist import org.antlr.v4.runtime.misc.*; ^ XiLexer.java:12: error: cannot find symbol public class XiLexer extends Lexer { ^ symbol: class Lexer XiLexer.java:15: error: cannot find symbol protected static final DFA[] _decisionToDFA; ^ symbol: class DFA location: class XiLexer XiLexer.java:16: error: cannot find symbol protected static final PredictionContextCache _sharedContextCache = ^ symbol: class PredictionContextCache location: class XiLexer XiLexer.java:49: error: cannot find symbol public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); ^ symbol: class Vocabulary location: class XiLexer XiLexer.java:78: error: cannot find symbol public Vocabulary getVocabulary() { ^ symbol: class Vocabulary location: class XiLexer XiLexer.java:83: error: cannot find symbol public XiLexer(CharStream input) { ^ symbol: class CharStream location: class XiLexer XiLexer.java:101: error: cannot find symbol public ATN getATN() { return _ATN; } ^ symbol: class ATN location: class XiLexer XiLexer.java:166: error: cannot find symbol public static final ATN _ATN = ^ symbol: class ATN location: class XiLexer XiParser.java:2: error: package org.antlr.v4.runtime.atn does not exist import org.antlr.v4.runtime.atn.*; ^ XiParser.java:3: error: package org.antlr.v4.runtime.dfa does not exist import org.antlr.v4.runtime.dfa.DFA; ^ XiParser.java:4: error: package org.antlr.v4.runtime does not exist import org.antlr.v4.runtime.*; ^ XiParser.java:5: error: package org.antlr.v4.runtime.misc does not exist import org.antlr.v4.runtime.misc.*; ^ XiParser.java:6: error: package org.antlr.v4.runtime.tree does not exist import org.antlr.v4.runtime.tree.*; ^ XiParser.java:12: error: cannot find symbol public class XiParser extends Parser { ^ symbol: class Parser XiParser.java:15: error: cannot find symbol protected static final DFA[] _decisionToDFA; ^ symbol: class DFA location: class XiParser XiParser.java:16: error: cannot find symbol protected static final PredictionContextCache _sharedContextCache = ^ symbol: class PredictionContextCache location: class XiParser XiParser.java:43: error: cannot find symbol public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); ^ symbol: class Vocabulary location: class XiParser XiParser.java:72: error: cannot find symbol public Vocabulary getVocabulary() { ^ symbol: class Vocabulary location: class XiParser XiParser.java:86: error: cannot find symbol public ATN getATN() { return _ATN; } ^ symbol: class ATN location: class XiParser XiParser.java:88: error: cannot find symbol public XiParser(TokenStream input) { ^ symbol: class TokenStream location: class XiParser XiParser.java:92: error: cannot find symbol public static class FileContext extends ParserRuleContext { ^ symbol: class ParserRuleContext location: class XiParser XiParser.java:231: error: cannot find symbol public final FileContext file() throws RecognitionException { ^ symbol: class RecognitionException location: class XiParser XiParser.java:275: error: cannot find symbol public static final ATN _ATN = ^ symbol: class ATN location: class XiParser XiParser.java:93: error: cannot find symbol public List<TerminalNode> STRING() { return getTokens(XiParser.STRING); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:94: error: cannot find symbol public TerminalNode STRING(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:97: error: cannot find symbol public List<TerminalNode> BOOL() { return getTokens(XiParser.BOOL); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:98: error: cannot find symbol public TerminalNode BOOL(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:101: error: cannot find symbol public List<TerminalNode> INT() { return getTokens(XiParser.INT); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:102: error: cannot find symbol public TerminalNode INT(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:105: error: cannot find symbol public List<TerminalNode> RETURN() { return getTokens(XiParser.RETURN); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:106: error: cannot find symbol public TerminalNode RETURN(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:109: error: cannot find symbol public List<TerminalNode> WHILE() { return getTokens(XiParser.WHILE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:110: error: cannot find symbol public TerminalNode WHILE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:113: error: cannot find symbol public List<TerminalNode> IF() { return getTokens(XiParser.IF); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:114: error: cannot find symbol public TerminalNode IF(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:117: error: cannot find symbol public List<TerminalNode> ELSE() { return getTokens(XiParser.ELSE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:118: error: cannot find symbol public TerminalNode ELSE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:121: error: cannot find symbol public List<TerminalNode> LENGTH() { return getTokens(XiParser.LENGTH); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:122: error: cannot find symbol public TerminalNode LENGTH(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:125: error: cannot find symbol public List<TerminalNode> BREAK() { return getTokens(XiParser.BREAK); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:126: error: cannot find symbol public TerminalNode BREAK(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:129: error: cannot find symbol public List<TerminalNode> TRUE() { return getTokens(XiParser.TRUE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:130: error: cannot find symbol public TerminalNode TRUE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:133: error: cannot find symbol public List<TerminalNode> FALSE() { return getTokens(XiParser.FALSE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:134: error: cannot find symbol public TerminalNode FALSE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:137: error: cannot find symbol public List<TerminalNode> ID() { return getTokens(XiParser.ID); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:138: error: cannot find symbol public TerminalNode ID(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:141: error: cannot find symbol public List<TerminalNode> INTEGER() { return getTokens(XiParser.INTEGER); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:142: error: cannot find symbol public TerminalNode INTEGER(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:145: error: cannot find symbol public List<TerminalNode> LBRACKET() { return getTokens(XiParser.LBRACKET); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:146: error: cannot find symbol public TerminalNode LBRACKET(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:149: error: cannot find symbol public List<TerminalNode> RBRACKET() { return getTokens(XiParser.RBRACKET); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:150: error: cannot find symbol public TerminalNode RBRACKET(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:153: error: cannot find symbol public List<TerminalNode> COLON() { return getTokens(XiParser.COLON); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:154: error: cannot find symbol public TerminalNode COLON(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:157: error: cannot find symbol public List<TerminalNode> EQUAL() { return getTokens(XiParser.EQUAL); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:158: error: cannot find symbol public TerminalNode EQUAL(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:161: error: cannot find symbol public List<TerminalNode> LPAREN() { return getTokens(XiParser.LPAREN); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:162: error: cannot find symbol public TerminalNode LPAREN(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:165: error: cannot find symbol public List<TerminalNode> RPAREN() { return getTokens(XiParser.RPAREN); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:166: error: cannot find symbol public TerminalNode RPAREN(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:169: error: cannot find symbol public List<TerminalNode> COMMA() { return getTokens(XiParser.COMMA); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:170: error: cannot find symbol public TerminalNode COMMA(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:173: error: cannot find symbol public List<TerminalNode> SEMICOLON() { return getTokens(XiParser.SEMICOLON); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:174: error: cannot find symbol public TerminalNode SEMICOLON(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:177: error: cannot find symbol public List<TerminalNode> LBRACE() { return getTokens(XiParser.LBRACE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:178: error: cannot find symbol public TerminalNode LBRACE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:181: error: cannot find symbol public List<TerminalNode> RBRACE() { return getTokens(XiParser.RBRACE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:182: error: cannot find symbol public TerminalNode RBRACE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:185: error: cannot find symbol public List<TerminalNode> STAR() { return getTokens(XiParser.STAR); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:186: error: cannot find symbol public TerminalNode STAR(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:189: error: cannot find symbol public List<TerminalNode> SLASH() { return getTokens(XiParser.SLASH); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:190: error: cannot find symbol public TerminalNode SLASH(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:193: error: cannot find symbol public List<TerminalNode> PERCENT() { return getTokens(XiParser.PERCENT); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:194: error: cannot find symbol public TerminalNode PERCENT(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:197: error: cannot find symbol public List<TerminalNode> PLUS() { return getTokens(XiParser.PLUS); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:198: error: cannot find symbol public TerminalNode PLUS(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:201: error: cannot find symbol public List<TerminalNode> DASH() { return getTokens(XiParser.DASH); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:202: error: cannot find symbol public TerminalNode DASH(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:205: error: cannot find symbol public List<TerminalNode> LANGLE() { return getTokens(XiParser.LANGLE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:206: error: cannot find symbol public TerminalNode LANGLE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:209: error: cannot find symbol public List<TerminalNode> RANGLE() { return getTokens(XiParser.RANGLE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:210: error: cannot find symbol public TerminalNode RANGLE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:213: error: cannot find symbol public List<TerminalNode> BANG() { return getTokens(XiParser.BANG); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:214: error: cannot find symbol public TerminalNode BANG(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:217: error: cannot find symbol public List<TerminalNode> AMPERSAND() { return getTokens(XiParser.AMPERSAND); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:218: error: cannot find symbol public TerminalNode AMPERSAND(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:221: error: cannot find symbol public List<TerminalNode> PIPE() { return getTokens(XiParser.PIPE); } ^ symbol: class TerminalNode location: class FileContext XiParser.java:222: error: cannot find symbol public TerminalNode PIPE(int i) { ^ symbol: class TerminalNode location: class FileContext XiParser.java:225: error: cannot find symbol public FileContext(ParserRuleContext parent, int invokingState) { ^ symbol: class ParserRuleContext location: class FileContext XiLexer.java:13: error: cannot find symbol static { RuntimeMetaData.checkVersion("4.5.3", RuntimeMetaData.VERSION); } ^ symbol: variable RuntimeMetaData location: class XiLexer XiLexer.java:13: error: cannot find symbol static { RuntimeMetaData.checkVersion("4.5.3", RuntimeMetaData.VERSION); } ^ symbol: variable RuntimeMetaData location: class XiLexer 100 errors