1

私はあなたがそのようなことをするときそれをチュートリアルで読みました:

SimpleNode Program() #Program : {} 
{
    (Class_decl())* <EOF>

    { return jjtThis; }
}

SimpleNodeから継承するProgrammクラスを作成する必要があります(jjtreeでコンパイルすると)が、私の場合は、classなどは作成されません。自分で作成する必要がありますか、それとも何かが足りませんか?

ありがとう

4

1 に答える 1

3

jjtree文法で最初に使用していますか ( の前にjavacc)? それは私とうまく動作します:

ファイル: Test.jjt

options {
  MULTI=true;
  NODE_PREFIX="";
}

PARSER_BEGIN(Test)
public class Test {
  public static void main(String[] args) throws Exception {
    Test parser = new Test(new java.io.StringReader("class A; class B;"));
    SimpleNode root = parser.Program();
    root.dump("");
  }
}
PARSER_END(Test)

TOKEN :
{
     < CLASS : "class" >
  |  < SCOL  : ";" >
  |  < ID    : (["a"-"z","A"-"Z"])+ >
}

SKIP :
{
  " " | "\t" | "\r" | "\n"
}

SimpleNode Program() #Program : 
{} 
{
  (Class_decl())* <EOF> {return jjtThis;}
}

void Class_decl() #ClassDecl :
{}
{    
  <CLASS> <ID> <SCOL>
}

そして、コマンド:

jjtree Test.jjt
javacc Test.jj

これにより、次の Java ソース ファイルが生成されます。

ClassDecl.java
JJTTestState.java
Node.java
Program.java
SimpleNode.java
TestTreeConstants.java

そして両方ClassDeclProgram拡張SimpleNode

/* Generated By:JJTree: Do not edit this line. Program.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
public
class Program extends SimpleNode {
  ...
}

/* Generated By:JJTree: Do not edit this line. ClassDecl.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
public
class ClassDecl extends SimpleNode {
  ...
}

すべてのソース ファイルをコンパイルし、Testクラスを実行します。

javac -cp . *.java
java -cp . Test

印刷されます:

Program
 ClassDecl
 ClassDecl

(つまりProgram、2 つの子を持つルートClassDecl)

Java Compiler コンパイラ バージョン 5.0 でテスト済み。

于 2011-11-30T19:06:25.893 に答える