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.