bambooflow Note

AST

最終更新:

bambooflow

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

ANTLR AST生成



ここでは、AST生成について説明します。
ASTとは、抽象構文木(abstract syntax tree)のことで、各ノードを節と葉の関係をツリー状に表します。
おもにデバッグのために用いられます。

antlr v2.7.7

コード

  • calc.g
options
{
    language="Cpp";
}
 
class CalcParser extends Parser;
options
{
    buildAST=true;
}
//expr: LPAREN INTEGER (PLUS INTEGER)* RPAREN;
expr: LPAREN! INTEGER (PLUS^ INTEGER)* RPAREN!;
 
 
class CalcLexer extends Lexer;
public
INTEGER: (DIGIT)+;
LPAREN: '(';
RPAREN: ')';
PLUS: '+';
protected
DIGIT: '0'..'9';
 

  • main.cpp
#include 
#include "CalcLexer.hpp"
#include "CalcParser.hpp"
 
using namespace std;
using namespace antlr;
 
void main()
{
    try {
        ASTFactory my_factory;
 
        CalcLexer lexer(cin);
        CalcParser parser(lexer);
 
       parser.initializeASTFactory(my_factory);
       parser.setASTFactory(&my_factory);
 
        parser.expr();
        RefAST t = parser.getAST();
        cout << t->toStringList() << endl;
    } catch(exception& e) {
        cerr << "exception: " << e.what() << endl;
    }
}
 

ここで、expr実行前にinitializeASTFactoryとかを呼ばないと、セグメンテーションフォルトで落ちてしまうので注意です。


コンパイル


% java antlr.Tool calc.g 
または、
% antlr calc.g

% g++ -c -I/antlrインストール先/include/antlr CalcLexer.cpp
% g++ -c -I/antlrインストール先/include/antlr CalcParser.cpp
% g++ -c -I/antlrインストール先/include/antlr main.cpp
% g++ -o run.x L.o P.o main.o -L/ntlrインストール先/lib -lantlr

実行


% run.x
(1+2)
 ( + 1 2 )

参考

  • http ://www.merrells.com/blog/work/archives/2002/01/accent_vol_2_no.html
  • http ://www.antlr.org/pipermail/antlr-interest/2003-May/003928.html

タグ:

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