3

ANTLR2を使用すると、文法定義ファイルで次のようなものを定義できます。

options
{
   language = "CSharp";
   namespace = "Extended.Tokens";
}

tokens {
   TOKEN<AST=Extended.Tokens.TokenNode>;
}

次に、クラスを作成できます。

public class TokenNode: antlr.BaseAST
{
    ...
}

このようなものを使用できる場合のアイデアはありますか(ツリーレプリケーションを手動で行う代わりに、クラスの作成をASTファクトリに委任します)?古い形式から新しい形式への単純な文法定義のコピーだけでは機能しません。私は彼らのサイトとサンプルで似たようなものを検索しようとしました。ヒントはありますか?

編集

私はカスタムトークンを作成しようとはしていませんが、カスタムの「ノードパーサー」を作成しようとしています。

ツリーを「実行」するには、2つの選択肢があります(私が理解している限り)。

  1. 「ツリービジター」を作成して値を処理する、または
  2. 文法定義を「ほぼ複製」してツリーパーサーを作成します。

v2の場合、ツリーノードを好きなように装飾し、ルートノードから「execute」のようなものを呼び出すだけで、パーサーが実行された後にそれらを呼び出すことができます。

4

1 に答える 1

4

私は C# をほとんど知りませんが、Java ターゲットとの違いはあまりないはずです。

セクション (この場合は an)を設定することASTLabelTypeで、カスタム ツリーを作成し、ANTLR に使用させることができます。options { ... }XTree

Tg

grammar T;

options {
  output=AST;
  ASTLabelType=XTree;
}

tokens {
  ROOT;
}

@parser::header {
  package demo;
  import demo.*;
}

@lexer::header {
  package demo;
  import demo.*;
}

parse
  :  Any* EOF -> ^(ROOT Any*)
  ;

Any
  :  .
  ;

次に、以下を拡張するカスタム クラスを作成しますCommonTree

デモ/XTree.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class XTree extends CommonTree {

  public XTree(Token t) {
    super(t);
  }

  public void x() {
    System.out.println("XTree.text=" + super.getText() + ", children=" + super.getChildCount());
  }
}

のインスタンスを作成するときは、次のインスタンスを作成TParserするカスタムを作成して設定する必要がありTreeAdaptorますXTree

デモ/Main.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class Main {

  public static void main(String[] args) throws Exception {
    String source = "ABC";
    TLexer lexer = new TLexer(new ANTLRStringStream(source));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.setTreeAdaptor(new CommonTreeAdaptor(){
      @Override
      public Object create(Token t) {
        return new XTree(t);
      }
    }); 
    XTree root = (XTree)parser.parse().getTree();
    root.x();
  }
}

デモの実行:

java -cp antlr-3.2.jar org.antlr.Tool T.g -o demo/
javac -cp antlr-3.2.jar demo/*.java
java -cp .:antlr-3.2.jar demo.Main

印刷されます:

XTree.text=ROOT, children=3

詳細については、http ://www.antlr.org/wiki/display/ANTLR3/Tree+construction を参照してください。

于 2011-10-03T18:42:42.433 に答える