[1255] Re:状況(日記?)
投稿者:山
2009/05/09 22:51:48
お疲れ様です。返事をもらえると嬉しいのですが、ごゆっくりどうぞ。
↓のクラスを見てわかるとおりに、ほとんどstructをクラスにしたままです。内部
データが少し変わっていますが、structの全体接続構造はほとんどそのままです。
私も意味もなくポリモルフィズムするのは好きではないし。本来の目的は
クラスでパッキングして見通しを良くしよう。そして、書くことによる自身の
理解、そして必要機能の追加のためです。それと、diksamもほぼ同じ量のメモリー
確保をしていますよ。
見間違いかもしれないけど、0.2.0はメモリーストレージを使ってないような・・・
class CT_Compiler : public CBase
{
public:
int function_count; // 関数の数
CT_FunctionDefinition * function_list; // 関数のリスト
CT_DeclarationList * declaration_list; // トップの宣言リスト
CT_StatementList * statement_list; // トップのステートメントのリスト
CT_Block * current_block; // 一番外側のブロック
//== 式のツリーノード ===========================================
class CT_Expression : public CBase
{
public:
CT_TypeSpecifier *type; //
E_ExpressionKind kind; // 式の種類
int line_number;
union {
E_Boolean boolean_value; // boolデータ リテラル
int int_value; // intデータ リテラル
double double_value; // doubeデータ リテラル
string *string_value; // stringデータ リテラル
ST_IdentifierExpression identifier; // 関数又は宣言文の識別子
ST_CommaExpression comma; // カンマ(,)式
ST_AssignExpression assign_expression; // 代入式
ST_BinaryExpression binary_expression; // 演算式
CT_Expression *minus_expression; // マイナス式
CT_Expression *logical_not; // 論理否定式
ST_FunctionCallExpression function_call_expression; // 関数式
ST_MemberExpression member_expression; // 使用していない?
CT_ExpressionList *array_literal; // 配列データ リテラル
ST_IndexExpression index_expression; // 配列の添え字式
ST_IncrementOrDecrement inc_dec; // ++,--,式
ST_CastExpression cast; // キャスト演算式
ST_ArrayCreation array_creation; // 配列生成式
} u;
実は、構文解析で構文ツリーが出来た時点では、TOPのCT_Compilerのオブジェクトを
deleteすればディストラクタ繋がりできれいに総てのメモリーを解放できたのですが
Fixtreeを作ってみると、多重リンクはするはリンクが切れてフリーが山ほど出てくる
はで。メモリー監視・チェック・報告のデバックプログラムが、一躍メモリー管理
プログラムに昇格して、多重リンクや放置されたメモリーを管理して、きれいに掃除
することになりました。思わぬ副作用が・・・
今大改造中で動かせなかったのですが、構文解析時点で5千数百のnewをしていました。
実は、ジェネレータとVM部分を始めていたのですが、ほしい仕様のための変更部分が
目立って見えてきたため、yacc,lex部分から大きく改造を始めてしまいました。
いま、#include #define 構文の追加と最外枠のステートメント禁止、main()関数起動
を組み込み始めました。そして上の二つの構文のためにプリプロセッサを書いています。
だから、コンパイルは+1増えて4ステージになりました。#includeは単に外部ファイルを
同一ファイルとしてコンパイルできる普通の機能です。でも、その為にライン数管理が
ファイル名+ライン数になってその部分が全体的改造に。
本当は、一通り終わるまで新機能は入れないつもりでしたが、チョコチョコ変えている
時点で、もう全体変更しようと思ってしまった。