2012-10-17 55 views
2

我的确找到了我的问题的答案:Barts answer正是我需要的原因,但它不起作用(见下文)。如何在运行时(运行时)生成词法分析器和分析器?

请有人能给我一个工作的例子,或告诉我我要去哪里实施Barts answer

这是我得到对方的回答,我是从“第4部分”

Lexer lexer = (Lexer)Class.forName(grammarName + "Lexer").newInstance(); 

我有antlr3.4完整JDK库得到了下面的错误。我创建它为package createclass;但我发现答案奇怪,因为创建的类没有包? 所以我尝试添加到字符串:

"@lexer::header {\n" + 
" package createclass;\n" + 
"}  \n" + 
"@parser::header {\n" + 
" package createclass;\n" + 
"}\n" + 

但仍然没有改变。

下面是输出:

debug: 
Exception in thread "main" java.lang.ClassNotFoundException: TLexer 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at createclass.Createclass.main(Createclass.java:61) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 31 seconds) 

给出的示例代码:

import java.io.*; 
import javax.tools.*; 
import java.lang.reflect.*; 
import org.antlr.runtime.*; 
import org.antlr.Tool; 

public class Main { 

    public static void main(String[] args) throws Exception { 

     // The grammar which echos the parsed characters to theconsole, 
     // skipping any white space chars. 
     final String grammar = 
       "grammar T;             \n" + 
       "               \n" + 
       "parse              \n" + 
       " : (ANY {System.out.println(\"ANY=\" + $ANY.text);})* EOF \n" + 
       " ;               \n" + 
       "               \n" + 
       "SPACE              \n" + 
       " : (' ' | '\\t' | '\\r' | '\\n') {skip();}    \n" + 
       " ;               \n" + 
       "               \n" + 
       "ANY               \n" + 
       " : .              \n" + 
       " ;               "; 
     final String grammarName = "T"; 
     final String entryPoint = "parse"; 

     // 1 - Write the `.g` grammar file to disk. 
     Writer out = new BufferedWriter(new FileWriter(new File(grammarName + ".g"))); 
     out.write(grammar); 
     out.close(); 

     // 2 - Generate the lexer and parser. 
     Tool tool = new Tool(new String[]{grammarName + ".g"}); 
     tool.process(); 

     // 3 - Compile the lexer and parser. 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     compiler.run(null, System.out, System.err, "-sourcepath", "", grammarName + "Lexer.java"); 
     compiler.run(null, System.out, System.err, "-sourcepath", "", grammarName + "Parser.java"); 

     // 4 - Parse the command line parameter using the dynamically created lexer and 
     //  parser with a bit of reflection Voodoo :) 
     Lexer lexer = (Lexer)Class.forName(grammarName + "Lexer").newInstance(); 
     lexer.setCharStream(new ANTLRStringStream(args[0])); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     Class<?> parserClass = Class.forName(grammarName + "Parser"); 
     Constructor parserCTor = parserClass.getConstructor(TokenStream.class); 
     Parser parser = (Parser)parserCTor.newInstance(tokens); 
     Method entryPointMethod = parserClass.getMethod(entryPoint); 
     entryPointMethod.invoke(parser); 
    } 
} 

回答

2

我的猜测是,您使用的是这样的一个IDE,并没有你的类路径设置正确。我的答案演示(也使用v3.4)。这里就是我刚刚做:

我复制的文件Main.java在一个目录(~/Temp/demo,在我的情况),并在该目录中打开一个壳,也做了以下内容:

[email protected]:~/Temp/demo$ java -version 
> java version "1.6.0_24" 
> OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) 
> OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) 

[email protected]:~/Temp/demo$ wget http://www.antlr.org/download/antlr-3.4-complete.jar 
> --2012-10-17 19:26:01-- http://www.antlr.org/download/antlr-3.4-complete.jar 
> Resolving www.antlr.org (www.antlr.org)... 138.202.170.10 
> Connecting to www.antlr.org (www.antlr.org)|138.202.170.10|:80... connected. 
> HTTP request sent, awaiting response... 200 OK 
> Length: 2388361 (2.3M) [application/java-archive] 
> Saving to: `antlr-3.4-complete.jar' 
> 
> 100%[===============================================================================================================>] 2,388,361 317K/s in 8.9s  
> 
> Last-modified header invalid -- time-stamp ignored. 
> 2012-10-17 19:26:11 (261 KB/s) - `antlr-3.4-complete.jar' saved [2388361/2388361] 

[email protected]:~/Temp/demo$ javac -cp antlr-3.4-complete.jar *.java 

[email protected]:~/Temp/demo$ java -cp .:antlr-3.4-complete.jar Main "a b c" 
> ANY=a 
> ANY=b 
> ANY=c

(该>输出打印到控制台)

+0

是,终于有人classpath中,只需要包括新的类()的文件夹中的当前文件夹 '的javac -cp。\ ANTLR-3.4-complete.jar *。 java' 'java -cp。;。\ antlr-3.4-complete.jar主“a b c” 然后在Netbeans中将其添加到:项目属性>库>运行>添加文件夹 谢谢 – xchiltonx