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