私はあなたがそのようなことをするときそれをチュートリアルで読みました:
SimpleNode Program() #Program : {}
{
(Class_decl())* <EOF>
{ return jjtThis; }
}
SimpleNodeから継承するProgrammクラスを作成する必要があります(jjtreeでコンパイルすると)が、私の場合は、classなどは作成されません。自分で作成する必要がありますか、それとも何かが足りませんか?
ありがとう
私はあなたがそのようなことをするときそれをチュートリアルで読みました:
SimpleNode Program() #Program : {}
{
(Class_decl())* <EOF>
{ return jjtThis; }
}
SimpleNodeから継承するProgrammクラスを作成する必要があります(jjtreeでコンパイルすると)が、私の場合は、classなどは作成されません。自分で作成する必要がありますか、それとも何かが足りませんか?
ありがとう
jjtree
文法で最初に使用していますか ( の前にjavacc
)? それは私とうまく動作します:
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
そして両方ClassDecl
とProgram
拡張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 でテスト済み。