C言語のソースプログラムを構文解析し、抽象構文木を表す属性付き字句系列に変換します。 属性付き字句系列は、ソースプログラムを構成する字句や、 抽象構文木の要素を表わす特別な字句を、出現順に並べたものです。 字句系列のすべての字句を結合すると、元のソースプログラムのテキストに戻ります。 TEBAでは、空白や改行、コメントも字句として扱うので、 戻したソースプログラムは元のものと完全に一致します。 字句の属性とは、字句に関する情報であり、 TEBAでは字句の種別と字句間の対応関係を表現する記号を属性値として使用します。
TEBAの特徴は次の2点です。
ただし、一般に、このような解析を正確に行うことは困難であり、 TEBA も例外ではありません。 TEBA では、構文解析の過程で構築する抽象構文木について、 部分的に精度が低くなることを許容する方法を採用しています。 精度が低いとは、構文に関する情報が欠落していたり、 字句の種別が誤っているといった状態を意味します。 また、このような解析を実現するために、粒度の粗い構文解析をしたあと、 段階的に解析を進めながら、精度を上げていく戦略を用いています。
TEBA は、以下のページからダウンロードできます。
このページの teba.tar.gz をダウンロードし、展開してください。 展開してできたディレクトリ teba-X.YY (X.YY は版の番号)の中に bin と TEBA という2つのディレクトリがあります。 ディレクトリ bin には実行ファイルが入っており、 ディレクトリ TEBA は実行に必要なモジュールや定義ファイルが入っています。 ディレクトリ sample は、プログラムの書換えパターンの例が入っています。
TEBA の解析器 cparse.pl などのコマンドを実行させるときは、 そのファイルを相対パスや絶対パスで指定する必要があります。 例えば、絶対パスで指定するなら、自分のホームディレクトリからのパスを以下のように指定します。
~/teba-X.YY/bin/cparse.pl
なお、この例では、ホームディレクトリの直下に展開していることを想定しています。 以降の説明も、この前提に従っています。
しかし、実行するたびに、いちいちこのようなパスを指定することは面倒です。 一般に、良く使うコマンドは、パスを指定しなくても実行できるように、 環境変数 PATH にコマンドのファイルが入っているディレクトリを指定します。 具体的には、ターミナルで、以下のように指定します。(bash の場合)
PATH=${PATH}:~/teba-X.YY/bin
この設定は、各シェル(ターミナル)を起動するたびに1回、実行する必要があります。
これを省略するには、ホームディレクトリに
.bashrc
というファイルを作り
(あるいは、すでに存在しているので)、その中に上記の PATH
の指定を書きます。
なお、以降の説明では PATH が設定されているものとし、コマンド名のみを書きます。 自の設定に合わせて読みかえてください。また、bash 以外のシェルを使っている場合には、 PATH の設定方法が異なることがあります。各自の環境に合う方法で設定してください。 なお、大学で貸与される PC の Linux の標準の設定では bash になっています。
TEBA の展開にはコマンド tar を利用します。 tar の使い方を man
コマンドで調べましょう。 man がわからないときは、 ターミナル(シェル)で
man man
と実行してみましょう。
ls コマンドで TEBA のディレクトリの中にどのようなファイルがあるか調べましょう。 TEBA はターミナル(シェル)上で使うことを前提としていますので、 様々なコマンドを使えるようになると開発が容易になります。
シェルの「環境変数」とは何か調べなさい。
TEBA は、CPAN で提供される以下のライブラリを利用しており、 あらかじめインストールする必要がある。
なお、各OS のパッケージ管理システムを利用して、これらをインストールできる場合がある。 Ubuntu などで、パッケージ管理システムに apt を利用している場合は、次のパッケージ名で導入できる。
すべてのインストール作業が終了したら、TEBA が動作するか、 以下の手順で確認してください。
cd ~/teba-X.YY/sample
make clean all
make がエラーにならずに終了すれば、正しく動作しています。
最初から動かない場合(例えば、“cparse.pl: not found
”
と表示される) は、 PATH
が正しく設定されていませんので、設定の確認をしてください。
“Algorithm::Diff
” に関するエラーが出る場合は、
モジュールがインストールされていない(または有効になっていない)
可能性が高いので、パッケージ管理システムで確認をしてください。
その他の不明なエラーは、演習担当者か著者に相談をしてください。
なお、sample ディレクトリに含まれる拡張子が .pt
のファイルは、 TEBA
のプログラム書換え機能を確認するためのパターン記述になっています。
書き方の参考になるので、TEBA の基本的な使い方を理解したあと、
各ファイルを読んでみてください。
また、テスト実行では、実際にプログラムを書き換えていますので、以下のように実行して、
実行結果を一つ一つ確認すると良いでしょう。
make clean; make all | less
この演習では、TEBA のプログラムの中を読む作業と、 自分でプログラムを作る作業があります。プログラムを読むときは、 すでに展開したファイルをエディタ等で開くのみですが、 プログラムを作るときは、どこかにファイルを作らなければなりません。 このような作業で、最も悪いやり方は以下の2通りです。
前者は、プログラミングの演習でもよく見かけますが、 どのファイルで作業をしているのかがわからなくなったり、 無関係なファイルを編集するなど、作業効率が著しく悪くなるやり方です。 おそらく日頃から自分の部屋を整理できない人に多いでしょう。 後者は、TEBA のファイルと自分のファイルが区別できなくなり、 不必要にTEBAのファイルを書換えて、プログラムが動かなくなり、 作業が進まなくなる危険性があるやり方です。 著作権など、他人の権利を尊重できない無神経な人に多いでしょう(言い過ぎ?)。
もっとも良いやり方は、自分のホームディレクトリ上に
作業用のディレクトリを作り、その中でファイルを作ることです。
以降の説明では、ホームディレクトリに teba-work
という
ディレクトリを作り、その中で作業をしているものとします。
ディレクトリは以下のように作成します。
mkdir ~/teba-work
ディレクトリに移動するには以下のように実行します。
cd ~/teba-work
なお、上記の方法は、ターミナル上で自分がどのディレクトリにいるかが わからなくても良いように絶対パスを用いています。 また、ターミナル上で自分がどのディレクトリにいるかを知りたいときは pwd コマンドで確認できます。
TEBA の開発用のメモをかねた資料として、日本語の文書があります。
この文書には、この演習の資料では説明していないことも含まれています。 また、TEBA 自体の開発に合わせて更新しているので、 TEBA の古い版では使えない機能も書かれています。 公開している最新版でも使えない機能が記述されている場合がありますが、 その機能が必要であれば著者に連絡をしてください。
次の用語について、それぞれの関係がわかるように説明せよ。
- 字句解析
- 構文解析
- 抽象構文木