日本ソフトウェア科学会第 31 回大会 (2014 年度) 講演論文集

Code2Xml: ソースコードと構文木の相互変換を実現するパーサコレクション
坂本 一憲
ソースコード解析・変形処理において，構文木の生成は基本的かつ重要な処理である．既存ソフトウェアとしてパー
サライブラリやコンパイラコンパイラなどが存在するものの，対応するプログラミング言語の幅広さや生成した構文木の表現に問題があり，使用性の高いソフトウェアが存在しない．我々はコンパイラコンパイラである ANTLR3 お
よび 4 を活用することで，特徴 1) 汎用的な XML フォーマットで具象構文木を表現可能，特徴 2) 全てのトークン
情報を具象構文木上で有しておりオリジナルのソースコードに復元可能，特徴 3) 文法ファイルを用意すれば対応するプログラミング言語を拡張可能という 3 つの特徴を備えたパーサコレクション Code2Xml をオープンソースソフ
トウェアとして開発した．我々は Code2Xml を利用した 3 つのケーススタディを通して有用性を確認した上，実際に大量のソースコードに対して構文木と相互変換できることを確認した．

Generating syntax trees is a fundamental activity in source code analysis and transformation. There exist
various parser libraries and compiler compilers, but they support few programming languages or they provide restricted representations of syntax trees, thus there is no usable software. We propose a novel parser
collection, named Code2Xml, using ANTLR 3 and 4 which is a state-of-art compiler compiler. Code2Xml
has three important features: 1) It can represent concrete syntax trees in the versatile XML format, 2) It
can restore the original source code from generated concrete syntax trees and 3) It can easily enlarge supportof programming languages by adding language grammar files for ANLTR 3 or 4. We conducted three casestudies to evaluate Code2Xml and we confirmed that Code2Xml could treat large amount of source code.

ソースコードの解析および変形処理において，最1 はじめにも基本的な処理は構文解析である．構文解析はプロ

ソースコードはソフトウェアの仕様を説明する最も

グラミング言語の文法に則ってソースコードを構文

正確なドキュメントでり，ソースコード解析および変木に変換する．構文解析のアルゴリズムは複雑であ

形処理はソフトウェアの品質改善において重要であり，構文解析のプログラムを人手で作成することは難る [8]．ソースコード解析はソースコードを入力とししい．そのため，ソースコードの解析および変形処てその意味や何らかの指標を出力する行為，ソース

理を実装する場合は，一般に，構文解析の機能を有

コード変形はソースコードを入力して何らかの操作するライブラリ（パーサライブラリ）や，構文解析を加えてソースコードを出力する行為である．現在，

器（パーサ）のプログラムを自動生成するコンパイラ

様々なソースコード解析／変形処理を行うツールがコンパイラ [3] を利用する．コンパイラコンパイラは存在しており，例えば，ソースコードメトリクスの測Extended Backus-Naur Form（EBNF）などで記述

定 [4, 12]，テストカバレッジの測定 [19]，ミューテー

したプログラミング言語の文法定義ファイルを入力す

ション解析 [1] を行うツールなどが存在する．

ることで，パーサを自動生成する．
現在，様々なパーサライブラリが存在しており，

Code2Xml: A Parser Collection for Inter-Converting
between Source Code and Parse Trees.
Kazunori Sakamoto, 国立情報学研究所, National Institute of Informatics.

XML など汎用的なフォーマットで具象構文木もし
くは抽象構文木を出力するソフトウェアが存在する．

Badros らは Java のソースコードの抽象構文木を

XML フォーマットで表現するパーサライブラリを提は異なり，対応言語の拡大が容易である．しかし，コ案している [2]．また，Collard らは C，C++，Java

ンパイラコンパイラはパーサの生成を目的としていのソースコードの抽象構文木を XML フォーマット

るため，そもそも構文木の生成機能を有していなかっで表現するパーサライブラリ srcML を提案していたり，生成する構文木が特定のホスト言語のオブジェ

る [5]．JavaML も srcML も入力したソースコードのクトとして表現されていて，任意のプログラミング言

文字列を記憶しているため，XML 文章からオリジナ

語から操作することができなかったり，構文木を表現

ルのソースコードを完全に復元できる．

するオブジェクトが変形処理をサポートしていなかっパーサライブラリと同様に様々なコンパイラコン
パイラが存在する．ANTLR [15] や，SableCC [7]，たりと，ソースコード解析および変形処理を実装する
上で制約が大きい問題がある．

Coco/R [13]，JavaCC [11]，bison/flex など様々なコ

我々が調査した限りでは，特徴 1-3 の全てを備えて

ンパイラコンパイラが存在している．多くのコンパイ

いるソフトウェアが存在していない．特徴 1 が備わっ

ラコンパイラは，当該プログラミング言語の文法を表ていなければ，パーサライブラリやコンパイラコンパ

現するための EBNF をベースとした独自の言語を提イラを利用するツールの開発言語に制約が生じる．こ供している．提供されている言語を用いてパーサを生れらの制約はツール開発者の開発コストを増大させ，成したいプログラミング言語の文法を記述すること

ツール開発の機会の損失に繋がる．本論文ではソース

で，コンパイラコンパイラはパーサプログラムのソー

コードの全てのトークン情報を必要とする解析およ

スコードを自動生成する．様々なプログラミング言語

び変形ツールを考慮しており，特徴 2 が備わっていを利用してパーサのソースコードを生成できるため，るソフトウェアを対象として議論する．近年，Java

コンパイラコンパイラを利用する際の利用可能なホに取って代わる言語として，Scala や Kotlin，Gosu，

スト言語に対する制約は少ない．

Xtend，Ceylon，Fantom など様々な言語が開発されパーサライブラリの JavaML および srcML は，特ている上，Apple 社が Objective-C に取って代わる

徴 1) 汎用的な XML フォーマットで具象構文木もし言語として Swift を開発するなど，新しい言語が次々

くは抽象構文木を表現可能，特徴 2) 全てのトークンと生まれている．上述の言語を普及させる上で，C や情報を構文木上で有しておりオリジナルのソースコー

Java など普及している言語と同等のツールサポート

ドに復元可能という特徴を備えている．一般に，パーが必要不可欠であり，そのためには特徴 3 を備えたソサライブラリは特定のホスト言語のみから呼び出し

フトウェアが必要である．例えば，テストカバレッジて利用できるが，特徴 1 を備えることで XML 文章

測定ツールであれば，未だに PHP に対するブランチの処理機能さえ有していれば，任意のホスト言語か

カバレッジを測定するツールが存在しておらず [18]，ら生成した構文木を操作することができる．また，特我々は特徴 1-3 を備えたソフトウェアが存在しないこ

徴 2 を備えることで，例えば，物理コード行数の測とが原因であると考えている．

定やコードフォーマッティングなど，ソースコード

本論文では特徴 1-3 の全てを備えたパーサコレクが有する全てのトークンを必要とする解析および変ションのソフトウェアである Code2Xml を提案する．

形処理を実現できる．一方，JavaML も srcML も C，

Code2Xml は ANTLR3 および 4 を利用して文法ファ

C++，Java の 3 つのプログラミング言語に特化してイルからパーサを自動生成（特徴 3）した上で，パーおり，抽象構文木の表現が対象言語に特化して設計さサを機械的に変形することで全てのトークンを有すれており，他のプログラミング言語に新たに対応する

る具象構文木を生成できるように（特徴 2）修正すことは考慮されていない．

る．具象構文木は.NET Framework 上のクラスのオ

コンパイラコンパイラは，特徴 3) 文法ファイルをブジェクトとして表現されており，Code2Xml が提用意すれば対応するプログラミング言語を拡張可能供するパーサおよびクラスを利用することでソースという特徴を備えており，前述のパーサライブラリと

コード，XML 文書，具象構文木の 3 者間の相互変換（特徴 1）を実現する．Code2Xml は特徴 1-3 のコード，CstNode オブジェクト，XML 文章の 3 者間全てを備えることで，新しいプログラミング言語にで相互変換できる．

対する解析／変形ツールの開発を支援する．例えば，

Code2Xml は，主に ANTLR が生成するパーサを

Swift の ANTLR4 用の文法ファイルが既に存在して利用して，ソースコードから具象構文木を生成する．

いるため，Code2Xml は Swift にも対応している．なANTLR は対応する文法ファイルを入力することでお，Code2Xml はオープンソースソフトウェアとして GitHub 上で公開中である †1 ．

パーサのソースコードを生成する．ANTLR3 が生成するパーサのソースコードは拡張性に乏しく，そのままでは Code2Xml で利用できないため，Antl-

2 Code2Xml の概要

rHelper モジュールを用いて生成されたソースコード

本節では Code2Xml の概要を説明する．図 1 でを Code2Xml 用に変形する．Code2Xml は生成されCode2Xml の利用および拡張の様子を含む全体像をたパーサのソースコードを活用することで，入力し示す．Code2Xml は具象構文木を表現するクラス，

たソースコードから CstNode のオブジェクトを生成

ANTLR3 および 4 によって生成されたパーサ，パーする．

サに必要な ANTLR3 および 4 のランタイム，Antl-rHelper モジュールを持つ．Code2Xml は C#言語で

ANTLR の公式サイトでは，文法ファイルを投稿可能なリポジトリを提供しており †2 †3 ，公開されて開発しており，.NET Framework および Mono で動いる文法ファイルを用いれば，ほとんどコードを記述

作する．

しなくとも対応言語を拡大できる．なお，Code2Xml
は ANTLR の代わりに，Python の処理系の機能を利用して Python に対応している．ANLTR が生成するパーサと同等の機能を有するパーサライブラリであれば，別途，当該ライブラリに対するアダプタを記述することで Code2Xml に組み込める．
図 2 で ANTLR3 の Java 言語用の文法ファイル †4と Code2Xml を用いて生成した XML 文章，図 3 に関連する文法ファイルの抜粋を示す．Code2Xml は

ANTLR の文法ファイルの構造に従って具象構文木を生成しており，ノード名は文法ファイル上の終端記号
図1

Code2Xml の利用および拡張の様子を含む全体像

もしくは非終端記号の名前を用いる．非終端記号と終端記号を区別するために，非終端記号および終端記号

現在，Code2Xml は，C，C#，Java，JavaScript，の名前の先頭は，それぞれ小文字と大文字で始まる．

Lua，PHP，Python，Clojure，Erlang，Objective-

非終端記号に該当するノードは，構成要素の非終端記

C，Python，R，Smalltalk，Swift，Verilog2001 に対号および終端記号に該当するノードを子ノードとし応している．Code2Xml は対応している言語のソーて持つ．例えば，’if’ 終端記号は statement 非終端

スコードを入力すると，Code2Xml が提供する具象

記号の構成要素であるため，構文木上でも’if’ に該

構文木を表現するためのクラス CstNode のオブジェ

当する IF ノードの親ノードは statement ノードにクトを生成する．CstNode オブジェクトは XML 文
書と相互変換可能であり，また，CstNode オブジェク
トからソースコードを生成できる．そのため，ソース†1 https://github.com/exKAZUu/Code2Xml†2 http://www.antlr3.org/grammar/list.html†3 https://github.com/antlr/grammars-v4†4 https://github.com/exKAZUu/Code2Xml/blob/master/Code2Xml.Languages/ANTLRv3/Generators/Java/Java.
g

1
2
3
4

< statement id = " 277 " >< IF id = " s tr i ng _ li t er a l2 9 2 " >< WS id = " -1 " startline = " 1 " startpos = " 20 " endline = " 1 " endpos = " 21 " hidden = " true " > </ WS >< TOKEN id = " s t r in g _l i te r a l 2 9 2 " startline = " 1 " startpos = " 21 " endline = " 1 " endpos = " 23 " >if </ TOKEN >5</ IF >

6< parExpression id = " 293 " >789< LPAREN id = " c ha r_ l it era l4 0 8 " >< WS id = " -1 " startline = " 1 " startpos = " 23 " endline = " 1 " endpos = " 24 " hidden = " true " > </ WS >< TOKEN id = " c ha r_ l it era l4 0 8 " startline = " 1 " startpos = " 24 " endline = " 1 " endpos = " 25 " >( </ TOKEN >10</ LPAREN >11< expression id = " 409 " >

12
13
14

< c o n d i t i o n a l E x p r e s s i o n id = " 414 " >< c o n d i t i o n a l O r E x p r e s s i o n id = " 436 " >... snip ...

15< r e l a t i o n a l E x p r e s s i o n id = " 459 " >16< sh ift Ex pre ss i on id = " 462 " >... snip ...

17< Intege rLite ral id = " set629 " >18< TOKEN id = " set629 " startline = " 1 " startpos = " 25 " endline = " 1 " endpos = " 26 " >1 </ TOKEN >19</ IntegerLiteral >20... snip ...

21
22</ shiftExpression >23< relationalOp id = " 463 " >< LT id = " ch a r_ l it er a l4 6 9 " >24< WS id = " -1 " startline = " 1 " startpos = " 26 " endline = " 1 " endpos = " 27 " hidden = " true " > </ WS >25

< TOKEN id = " c ha r_ l it er a l4 6 9 " startline = " 1 " startpos = " 27 " endline = " 1 " endpos = " 28 " >& lt ; </ TOKEN >26</ LT >

27
28</ relationalOp >29< sh ift Ex pre ss i on id = " 464 " >... snip ...

30< Intege rLite ral id = " set629 " >31< WS id = " -1 " startline = " 1 " startpos = " 28 " endline = " 1 " endpos = " 29 " hidden = " true " > </ WS >32

< TOKEN id = " set629 " startline = " 1 " startpos = " 29 " endline = " 1 " endpos = " 30 " >2 </ TOKEN >33</ IntegerLiteral >34... snip ...

35</ shiftExpression >36</ relationalExpression >

37
38
39
40

... snip ...
</ conditionalOrExpression ></ conditionalExpression >41</ expression >42< RPAREN id = " c ha r_ l it era l4 1 0 " >43
44< TOKEN id = " c ha r_ l it era l4 1 0 " startline = " 1 " startpos = " 30 " endline = " 1 " endpos = " 31 " >) </ TOKEN ></ RPAREN >45</ parExpression >46< statement id = " 294 " >

47
48
49

... snip ...
</ statement ></ statement >図2Java 言語のパーサで if (1 < 2) から生成した具象構文木の XML 文章表現

なる．
1

block

2

: ’{ ’ ( blockS tatement )* ’} ’

3

;

4

Code2Xml はノード名に加えて親となる非終端記号の構成要素における位置に応じて一意な文字列（ID）

bl ockSta tementを割り当てる．ID を利用することで同じ名前のノード

5: localVariableDeclarationStatement

6| classOrInterfaceDeclarationを区別できる．例えば，if-else 文に該当する文法ルー

7| statement

ルでは，if 文と else 文でそれぞれ実行する文として8;

statement 非終端記号が 2 回出現するが，statement

9statement

10: blockという名前のみでは if 文と else 文のどちらに対応する

11| ’; ’

文か区別できない．そこで，Code2xml は周辺のノー12| IDENTIFIER ’: ’ statement

13| expression

14| ’if ’ parExpression statement ( ’ else ’ statement )?

15| ’ assert ’

16| ’ switch ’ parExpression’; ’expression ( ’: ’ expression )? ’; ’’{ ’ s w i t c h B l o c k S t a t e m e n t G r o u p s ’} ’

17

ドを参照しなくともノードを区別できるように ID を付与する．例えば，’if’ parExpression statement(’else’ statement)?というルールに対して，’if’に string literal292 ，parExpression に 293 ，1 つ目

18| ’ while ’ parExpression statement

19| ’do ’ statement ’ while ’ parExpression ’; ’20

| forstatement21| ’ break ’ ( IDENTIFIER )? ’; ’22

| ’ continue ’ ( IDENTIFIER )? ’; ’23

| ’ return ’ ( expression )? ’; ’24

| ’ throw ’ expression ’; ’

出現位置の開始行と列，終了行と列を設定する．XML

25| ’ synchronized ’ parExpression block

文章では startline，startpos，endline，endpos

26| trystatement27| tryWithResourcesStatementの 4 属性で表現される．また，空白や改行などパー;ス時に無視するように指定された終端記号は，他の終

28
29
30
31

parExpression: ’( ’ expression ’) ’

ex pressi onList

33: expression

35
36
37

端記号と区別するために hidden 属性を有する．例えライブラリで提供されている XML 文章の要素を表現

スを備えており，LINQ to XML と同様に遅延リスト: conditionalExpression( a s s i g n me n t O p er a t o r expression )?

を用いて先祖や子孫，兄弟ノードを走査する機能を提供する．また，要素の追加や削除などソースコード変;
relationalExpression

41: sh if tEx pr e ss ion

形処理に必要な機能を提供する．

( relationalOp shi f tEx pr es s io n )*42

44

置を記録するために，終端記号に該当する各ノードにするための XElement クラスに類似するインタフェー;
expression

40

43

Code2Xml は終端記号のソースコード上での出現位

なお，CstNode クラスは.NET Framework の標準( ’ , ’ expression )*38
39

つ目の statement に 296 という ID を割り当てる．

ば，図 2 の 3 行目の WS 要素は hidden 属性を持つ．

;

32

34

の statement に 294 ，’else’ に string literal295 ，2

3 Code2Xml の利用例;
relationalOp

45:’<’ ’= ’

本節では Code2Xml の利用例としてソースコー

46|’>’ ’= ’ドメトリクス測定ツール，カバレッジ測定ツール，

47| ’<’ | ’>’48;

ミューテーション解析ツールの実装例を示す．以下で示す実装例に加えて，Code2Xml を利用した研究が

図3

ANTLR3 の Java 言語用の文法ファイルの図 2に関連する部分の抜粋

既に存在している [9, 14, 16–18]．

3. 1 ソースコードメトリクス測定ツール

る文字を含まないトークンを返す．7 行目で列挙しソースコードメトリクス測定ツールは，ソースコー

た各ノードに対して，expression という名前の最ド中の特定のプログラム要素を数えたり，各クラスの初の子ノードを列挙する．なお，Select メソッド

継承関係などの情報を抽出することで，特定の指標のは.NET Framework の標準ライブラリが提供してお値を測定する．本節ではケーススタディとして if 文り，IEnumerable インタフェース型のコレクション

を数えるプログラムを説明する．なお，その他の条件に対する写像（いわゆる map）を計算する．8-11 行

分岐のプログラム要素も数えればサイクロマチック複目で列挙した if 文の条件式の前後に文字列を挿入す

雑度を測定できる．

ることで，b メソッドの呼び出しを追加する．12 行

図 4 で Code2Xml を用いて if 文を数える C#プロ
グラムのソースコードを示す．サンプルコードとして目で変形処理を行った具象構文木をソースコードに変換することで，変形済みソースコードを得る．

の読みやすさを考慮して，ソースコードが期待通りに動作することを確認するテスティングフレームワー

3. 3 ミューテーション解析ツール

ク NUnit のテストケースとして作成している．解析

ミューテーション解析ツールは，プロダクション

対象のソースコードを実行時引数等で変化させるこ

コードに機械的に欠陥（ミュータント）を埋め込んとで実用的なツールに改良できる．

だ上で，実際にテストを実施して欠陥を検出できる

図 4 の 3 行目で Java 用のパーサを利用することをかどうかを確認することで，テストの品質を測定す指定する．4 行目で指定したパーサを使ってソースる [10]．本節では，Code2Xml を用いてプロダクショ

コードを具象構文木に変換する．5 行目でルートノー

ンコードに欠陥を埋め込むケーススタディを示す．なドの子孫ノードのうち IF という名前のノードを数え

お，欠陥の埋め込み方はミュータントオペレーター

ることで，if 文を数える．

で定義されており，ステートメントを削除するというStatement Deletion オペレータを利用する [6]．
3. 2 テストカバレッジ測定ツール

図 6 で Code2Xml を用いてミュータントを埋め込

テストカバレッジ測定ツールは，バイナリファイル

む C#プログラムのソースコードを示す．各ステート

やソースコードに測定用の特殊なコードを挿入する

メントを pass 文に置換してテストを走らせることで，ことで，テスト時に実行されたプログラム要素を検出テストの品質を評価する．なお，図 6 では，テストをして測定する [18]．本節では，Code2Xml を用いて実行する代わりにミュータントを埋め込んだソース

テストカバレッジの測定に必要なソースコード変形のコードを Console.WriteLine メソッドで表示する．

ケーススタディを示す．

図 6 の 3 行目で Python 用のパーサを利用すること

図 5 で Code2Xml を用いて if 文の条件式にコードを指定する．5 行目でルートノードの子孫ノードのうを挿入する C#プログラムのソースコードを示す．bち small stmt という名前のノードを列挙する．6-13

メソッドの呼び出しを挿入することで，b メソッドの行目で列挙した各ノードに対して，ミュータントの中で条件式の評価値を記録して，真偽値の両方が評価

埋め込みと埋め込んだコードの表示を行う．7 行目でされて分岐が網羅されたかどうかを示すブランチカ

対象ステートメントを pass 文に置換して，9 行目でバレッジを測定する．

ミュータント埋め込み後のソースコードを表示する．

図 5 の 3 行目で C 用のパーサを利用することを指定する．5 行目でルートノードの子孫ノードのう

11 行目で置換を取り消すことでオリジナルなソース
コードを復元する．

ち selection statement という名前のノードを列挙
して，6 行目で列挙したノードのうち最初の子ノー

4 評価

ドのトークンが"if"であるノードに絞り込む．なお，

表 1 で 11 種類のオープンソースソフトウェアが有TokenText プロパティは空白などパース時に無視すする C#ソースコードの総サイズ，具象構文木の生成

1[ Test ] public void ParseJavaText () {2const string originalCode = @ " class K { void m () { if ( true ) {} if ( false ) {} } } " ;3var gen = CstGenerators . J av a Us i ng An t lr 3 ;4var cst = gen . G e n e r a t e T r e e F r o m C o d e T e x t ( originalCode );Assert . That ( cst . Descendants ( " IF " ). Count () , Is . EqualTo (2));

5
6

}

図4

1

Code2Xml を用いて if 文を数える C#プログラムのソースコード[ Test ] public void ModifyCText () {2const string originalCode = @ " void m () { if ( true ) {} if ( false ) {} } " ;3var gen = CstGenerators . CUsingAntlr3 ;4var cst = gen . G e n e r a t e T r e e F r o m C o d e T e x t ( originalCode );5

var conds = cst . Descendants ( " s e l e c t i o n _ s t a t e m e n t " ). Where ( e = > e . FirstChild . TokenText == " if " )6. Select ( e = > e . Child ( " expression " ));7foreach ( var cond in conds ) {8cond . I n s e r t C o d e B e f o r e S e l f ( " b ( " );9cond . I n s e r t C o d e A f t e r S e l f ( " ) " );

10

}

11

Assert . That ( cst . Code , Is . EqualTo ( @ " void m () { if ( b ( true )) {} if ( b ( false )) {} } " ));

12
13

}

図5

1

Code2Xml を用いて if 文の条件式にコードを挿入する C#プログラムのソースコード[ Test ] public void Mo di fy Py t h o n T e x t () {2const string originalCode = @ " a = 6; b = 7; b = a * b ; print ( b ) " ;3

var gen = CstGenerators . Python2 ;4

var cst = gen . G e n e r a t e T r e e F r o m C o d e T e x t ( originalCode );5

var stmts = cst . Descendants ( " small_stmt " ). ToList ();6

foreach ( var stmt in stmts ) {7stmt . Replacement = " pass " ;8// .. Conduct tests to judge whether tests detect mutants ..

9Console . WriteLine ( cst . Code );10

Assert . That ( cst . Code , Is . S t r i n g C o n t ai n ing ( " pass " ));11stmt . Replacement = null ;Assert . That ( cst . Code , Is . EqualTo ( originalCode ));

12

}

13
14

}

図6

Code2Xml を用いてミュータントを埋め込む C#プログラムのソースコードに要した時間，具象構文木からコード生成に要した

なお，Code2Xml のパフォーマンスはパーサに依時間，両者の合計時間を示す．32MB 程度の大規模な存する部分が大きい．ANTLR によって生成されるMediaPortal-1 であっても，2 分以内で具象構文木お

パーサは文法ファイルの記述内容によってパフォーマ

よびコードの生成に成功しており，実用上，十分なパンスが大きく変わる．また，ANTLR のバージョン

フォーマンスが得られていることが確認できる．

が 3 から 4 へ変わる際に，様々な高速化の工夫が取表1

Code2Xml による 11 種類のオープンソースの C#ソースコードの具象構文木およびコード生成時間

プロジェクト名

コードサイズ [byte]

具象構文木生成 [ms]コード生成 [ms]合計時間 [ms]moq4

1,152,394

4,895

186

5,081

ravendb

20,174,450

67,945

4,794

72,739MechJeb2

3,513,407

15,453935

16,388MediaPortal-1

32,027,472

109,188

8,475

117,663

MonoTouch.Dialog

235,824

907

62

969

Nancy

3,300,913

8,781

611

9,392

Newtonsoft.Json

4,147,728

12,322687

13,009

NuGetGallery

2,829,569

8,015

502

8,517

ServiceStack

5,018,555

13,9501,094

15,044SignalR

2,202,044

6,489

483

6,972

StarryboundServer

313,445

958

16

974

り入れられており，利用する ANTLR のバージョン
によってもパフォーマンスが変わる．

した．
今後は既存のパーサライブラリやコンパイラコ

今後はパーサのみのパース時間を測定することでンパイラをより網羅的に調査および整理した上で，

Code2Xml によるオーバーヘッドを明らかにして，さCode2Xml との比較実験を通して，Code2Xml の有らに，既存のパーサライブラリ等と処理速度の比較を

用性を評価していきたい．

行う予定である．

謝辞 本研究の一部は，独立行政法人情報処理推進機構の 2010 年度未踏 IT 人材発掘・育成事業「複数5 おわりに

言語対応のソースコード処理ツールのフレームワー

従来のパーサライブラリやコンパイラコンパイラ

クと利用例」による助成を受けた．また，本研究の一には，特徴 1) 汎用的な XML フォーマットで具象構

部は，一般財団法人安藤研究所の安藤博記念学術奨励

文木もしくは抽象構文木を表現可能，特徴 2) 全ての賞による助成を受けた．

トークン情報を構文木上で有しておりオリジナルのソースコードに復元可能，特徴 3) 文法ファイルを用参 考 文 献意すれば対応するプログラミング言語を拡張可能と[ 1 ] Andrews, J. H., Briand, L. C., and Labiche, Y.:
Is Mutation an Appropriate Tool for Testing Experiments?, Proceedings of the 27th International Conference on Software Engineering, ICSE ’05, New
York, NY, USA, ACM, 2005, pp. 402–411.
[ 2 ] Badros, G. J.: JavaML: A Markup Language forJava Source Code, Comput. Netw., Vol. 33, No. 16(2000), pp. 159–177.
[ 3 ] Brooker, R., MacCallum, I., Morris, D., andRohl, J.: The compiler compiler, Annual Review
in Automatic Programming, Vol. 3, No. 0(1963),
pp. 229 – 275. Annual Review in Automatic Programming.
[ 4 ] Chidamber, S. R. and Kemerer, C. F.: A Metrics Suite for Object Oriented Design, IEEE Trans.
Softw. Eng., Vol. 20, No. 6(1994), pp. 476–493.
[ 5 ] Collard, M. L., Decker, M. J., and Maletic,

いう 3 つの特徴を全てを備えたソフトウェアが存在しなかった．
本論文では，上述の 3 つの特徴を全てを備えるソフ
トウェアとして Code2Xml を提案した．Code2Xml
は ANLTR3 および 4 を用いて文法ファイルからパー
サを自動生成する．さらに，生成したパーサを利用して，ソースコードと具象構文木のオブジェクト表現・XML 文章表現の 3 者間での相互変換を実現した．また，Code2Xml の有用性を示すために，メトリクス
測定ツール，テストカバレッジ測定ツール，ミュー
テーション解析ツールの 3 つのケーススタディを説明

J. I.: Lightweight Transformation and Fact Extraction with the srcML Toolkit, Proceedings of the2011 IEEE 11th International Working Conference
on Source Code Analysis and Manipulation, SCAM
’11, Washington, DC, USA, IEEE Computer Society, 2011, pp. 173–184.
[ 6 ] Deng, L., Oﬀutt, J., and Li, N.: Empirical Evaluation of the Statement Deletion Mutation Operator, Software Testing, Verification and Validation(ICST), 2013 IEEE Sixth International Conference
on, March 2013, pp. 84–93.
[ 7 ] Gagnon, E. M. and Hendren, L. J.: SableCC, an
Object-Oriented Compiler Framework, Proceedingsof the Technology of Object-Oriented Languages andSystems, TOOLS ’98, Washington, DC, USA, IEEE
Computer Society, 1998, pp. 140–.
[ 8 ] Harman, M.: Why Source Code Analysis andManipulation Will Always be Important, Source
Code Analysis and Manipulation (SCAM), 2010
10th IEEE Working Conference on, Sept 2010,
pp. 7–19.
[ 9 ] Humaira, R., Sakamoto, K., Ohashi, A.,
Washizaki, H., and Fukazawa, Y.: Towards a Unified Source Code Measurement Framework Supporting Multiple Programming Languages., SEKE,
Knowledge Systems Institute Graduate School,
2012, pp. 480–485.
[10] Jia, Y. and Harman, M.: An Analysis and Survey of the Development of Mutation Testing, Software Engineering, IEEE Transactions on, Vol. 37,
No. 5(2011), pp. 649–678.
[11] Kodaganallur, V.: Incorporating Language Processing into Java Applications: A JavaCC Tutorial,
IEEE Softw., Vol. 21, No. 4(2004), pp. 70–77.
[12] McCabe, T. J.: A complexity measure, Proceedings of the 2nd international conference on Software engineering, ICSE ’76, Los Alamitos, CA,
USA, IEEE Computer Society Press, 1976, pp. 407–.

[13] Mössenböck, H.: A generator for production quality compilers, Compiler Compilers, Hammer, D.(ed.), Lecture Notes in Computer Science,Vol. 477, Springer Berlin Heidelberg, 1991, pp. 42–
55.
[14] Ohashi, A., Sakamoto, K., Kamiya, T., Humaira, R., Arai, S., Washizaki, H., and Fukazawa,
Y.: UniAspect: A Language-independent Aspectoriented Programming Framework, Proceedings ofthe 2012 Workshop on Modularity in Systems Software, MISS ’12, New York, NY, USA, ACM, 2012,
pp. 39–44.
[15] Parr, T. and Fisher, K.: LL(*): The Foundationof the ANTLR Parser Generator, Proceedings of the
32Nd ACM SIGPLAN Conference on Programming
Language Design and Implementation, PLDI ’11,
New York, NY, USA, ACM, 2011, pp. 425–436.
[16] Sakamoto, K.: UNICOEN: A Unified Framework for Code Engineering Supporting Multiple
Programming Languages (in Japanese), IPSJ Journal, Vol. 54, No. 2(2013), pp. 1–16.
[17] Sakamoto, K., Ishikawa, F., Washizaki, H., andFukazawa, Y.: Open Code Coverage Framework: A
Framework for Consistent, Flexible and Complete
Measurement of Test Coverage Supporting Multiple Programming Languages, IEICE Transactions,Vol. 94-D, No. 12(2011), pp. 2418–2430.
[18] Sakamoto, K., Shimojo, K., Takasawa, R.,
Washizaki, H., and Fukazawa, Y.: OCCF: A
Framework for Developing Test Coverage Measurement Tools Supporting Multiple Programming Languages, Proceedings of the 2013 IEEE Sixth International Conference on Software Testing, Verification and Validation, ICST ’13, Washington, DC,
USA, IEEE Computer Society, 2013, pp. 422–430.
[19] Zhu, H., Hall, P. A. V., and May, J. H. R.: Software unit test coverage and adequacy, ACM Comput. Surv., Vol. 29, No. 4(1997), pp. 366–427.