bambooflow Note

AST

最終更新:

Bot(ページ名リンク)

- view
メンバー限定 登録/ログイン

ASTについて



抽象構文木(Abstract Syntax tree: AST)は、ラベル付きの木構造。

木構造は次のノードがあります。
  • 節点(internal node)
  • 葉(leaf node)


ANTLR3では、
-> ^(節点 葉 葉)
の形式で記述します。


例を載せます。

  • HtmlDoc.g
grammar HtmlDoc;
 
options
{
  output=AST;
}
 
tokens {
  DOC='doc';
  TITLE='title';
  BODY='body';
}
 
 
html_doc
  : '<html>' html_header html_body '</html>' EOF -> ^('doc' html_header html_body)
  ;
 
html_header
  : '<title>' TEXT '</title>' -> ^('title' TEXT)
  ;
 
html_body
  : '<body>'TEXT '</body>' -> ^('body' TEXT)
  ;
 
TEXT  : (~('<'))*
  ;
 
 

ASTのデバッグは、AntlrWorksでは処理できないので、自分でテストプログラムを作る必要があります。

  • TestE.java
import java.io.*;
import org.antlr.runtime.*;
import org.antlr.runtime.debug.DebugEventSocketProxy;
import org.antlr.runtime.tree.*;
 
public class TestE {
 
    public static void main(String args[]) throws Exception {
        HtmlDocLexer lex = new HtmlDocLexer(new ANTLRFileStream("./test_input.html", "UTF8"));
        CommonTokenStream tokens = new CommonTokenStream(lex);
 
        System.out.println( "start parse." );
 
        //HtmlDocParser g = new HtmlDocParser(tokens, 49100, null);
        HtmlDocParser g = new HtmlDocParser(tokens);
        try {
            HtmlDocParser.html_doc_return r = g.html_doc();
 
            // ツリーを表示
            System.out.println("tree = " + ((Tree)r.tree).toStringTree());
 
            // CommonTreeを表示
            CommonTree tree = (CommonTree)r.getTree();
            System.out.println(tree.toString());
            printTree(tree, 1);
 
        } catch (RecognitionException e) {
            e.printStackTrace();
        }   
    }   
 
    // CommonTreeを再帰的に表示する関数
    static public void printTree(CommonTree t, int indent) {
      if (t != null) {
        StringBuffer sb = new StringBuffer(indent);
        for (int i=0; i<indent; i++) {
          sb = sb.append("    ");
        }   
        for (int i=0; i<t.getChildCount(); i++) {
          System.out.println(sb.toString() + t.getChild(i).toString());
          printTree((CommonTree)t.getChild(i), indent+1);
        }   
      }   
    }   
}
 


  • test_input.html
<html><title>TEST TITLE</title><body>TEST BODY.</body></html>


  • コンパイルと実行

javac -cp '.:./antlr-3.2.jar' HtmlDocParser.java HtmlDocLexer.java  TestE.java
java -cp '.:./antlr-3.2.jar' TestE

実行結果
tree = (DOC (TITLE TEST TITLE) (BODY TEST BODY.))
DOC
    TITLE
        TEST TITLE
    BODY
        TEST BODY.
 

参考

タグ:

ANTLR
記事メニュー
ウィキ募集バナー