3

次の単純で無意味な文法があるとします。

propagate     :   what^ where*;
what          :   CHAR^;
where         :   NUMBER -> ^(PLUS NUMBER);

NUMBER        :   '0'..'9';
CHAR          :   'a'..'z';
PLUS          :   '+';

のような文字列を解析すると、a123456789次のような AST が生成されます。 AST

私がやろうとしているのは、によって解析されたトークンを渡して、what(where同じ入力に対して) AST を作成することです。 AST2

私は次の方法で試しました:

propagate       :   w=what^ where[$w.text]*;
what            :   CHAR^;
where[String s] :   NUMBER -> ^(PLUS CHAR[s] NUMBER);

NUMBER          :   '0'..'9';
CHAR            :   'a'..'z';
PLUS            :   '+';

トークンが 1 つの場合は機能whatしますが、ツリーの場合はどうでしょうか。これは正しいアプローチですか?

4

1 に答える 1

3

方法は次のとおりです。

grammar T;

options {
  output=AST;
  ASTLabelType=CommonTree;
}

parse
 : propagate EOF!
 ;

propagate
 : what^ where[$what.tree]*
 ;

what
 : CHAR
 ;

where[CommonTree lhs]
 : NUMBER -> ^(PLUS {new CommonTree($lhs)} NUMBER)
 ;

NUMBER : '0'..'9';
CHAR   : 'a'..'z';
PLUS   : '+';

ANTLRWorks のデバッガーは適切な AST を表示しない場合があります。自分で小さなドライバー クラスを作成します。

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

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("a123"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    CommonTree tree = (CommonTree)parser.parse().getTree();  
    DOTTreeGenerator gen = new DOTTreeGenerator();
    StringTemplate st = gen.toDOT(tree);
    System.out.println(st);
  }
}

実行するには、次のようにします。

java -cp antlr-3.3.jar org.antlr.Tool Tg
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar メイン > ast.dot

これにより、次の AST を表す DOT ファイルが生成されます。

ここに画像の説明を入力

于 2013-01-09T19:43:39.363 に答える