CPrompt-C言語インタープリター

2009年6月以来、Cインタープリターを開発しています。 (これについては、関数呼び出しに関する記事で既に言及しました )。

ループ、選択、式の計算、関数呼び出し(ユーザー宣言と標準呼び出しの両方)、組み込みなど、かなり多くの構造が既に実装されています。



「prompt」コマンドラインプロンプト(D:>、root @ comp#、...)との類推により、プログラムはCPromptという名前を受け取りました。



通訳の仕事について少し



ソースファイルの解釈を開始するのは簡単です。

$ cprompt /path/to/file.c



解釈は3つの段階に分かれています。

1)前処理

2)実行ツリーの構築

3)main()を呼び出します



最初の段階である前処理は重要で退屈です。包含、定義、コメントなどを処理します。

出力は、ディレクティブと余分なテキストのないきれいなコードです。



2番目の段階は、実行ツリーの構築です。 ここでコードが取得され、グラフ(ツリー)が構築されます。グラフ(ツリー)のルートは特定のAPPLICATIONオブジェクトで、起動中のファイルに関する情報が含まれています。 サブツリー-関数では、各トークンはツリーの要素に入ります。 グラフの各要素には、独自の「タイプ」-目的を示す数字があります。

関数は2つのタイプに分けられます-ユーザーによって宣言されたものと「外部」です。 後者-たとえば、libcの他の共有ライブラリからの標準的なもの。



出力は次のようなツリーです。

...

ツリーが構築されました:

t0;アプリケーション;;;

| t0;関数;;;

| | t14;ダブル; cos ;;

| | t14;ダブル;フロア;;

| | t14; int; isdigit ;;

...

| | t2;ダブル;ラウンド;;

| | | t5; floor(値+ 0.5);;;

| | t14; int; printf ;;

| | t2; int; main ;;

| | | t1; int; l;ラウンド(7.2);

...

(これは、インタープリターが表示するログの一部です)。

t0、t2、t14-要素のタイプ。

0-タイプなし

1-式(割り当ては、+、-、* ...とともに操作の1つと見なされますが、優先順位は異なります)。

2-機能

5-「戻る」

14-「外部機能」、

その他、さまざまなアクション用。

関数の引数は構造体に保存されるため、ツリーの可視部分にはありません。 実際、それらへのポインターは各関数ブランチに登録されています。



すべてのプログラムの実行は非常に詳細に記録されます。--dbgパラメーターを指定すると、多くの情報が標準出力に出力されます。

ログを見ると、最初に言ったように、実行が3点ではなく5点に分割されていることがわかります。 前処理の前後の2つのポイントは、ソーステキストの解析です。 処理前の解析-および処理されたテキストの解析。



私が許可した標準を超えた唯一の方法は、「外部」構造を追加することでした。これは、静的リンクが不可能であるため、外部ライブラリから関数を宣言できます。 現在、インタプリタが構築されたライブラリでそれらの関数のみを宣言することが可能ですが、将来は共有ライブラリからインポートすることが可能になります。

例えば

cdeclの外側:double cos(double x);

cdeclの外側:ダブルフロア(ダブルx);



cdeclは関数呼び出し規則です。 この関数呼び出しの詳細



製品はC ++で作成されています。

ソースコード(Google Code)を表示またはダウンロードします

私は毎日標準に近づいているので、製品の実用リリースがすぐに利用可能になり、使用できることを願っています。 最終的な目標は、C99を完全にサポートすることです。





#include <cmath>



int main(int argv,char* argc[])

{

int l=round(7.2);

}






このようなコードでは、ログは次のようになります。

たくさんの余計なものがありますが、必要に応じて確認できます。

また、siインタープリターを使用するためのオプションは何ですか? この製品はどこに適用できますか?



プログラミング言語に移植されたUPD

UPD2リポジトリにメイクファイルを追加しました。

コンパイルするには:

svn checkout cprompt.googlecode.com/svn/trunk/ cprompt

cd cprompt

make






./cprompt / path / to / fileを実行します



All Articles