◀ANSI版開発トップへ
  • 3698 Cアウトライン解析のプリプロセッサ対応
    • 3700 Re: Cアウトライン解析のプリプロセッサ対応
      • 3702 Re2: Cアウトライン解析のプリプロセッサ対応
        • 3703 Re3: Cアウトライン解析のプリプロセッサ対応
          • 3704 Re4: Cアウトライン解析のプリプロセッサ対応
          • 3705 Re4: Cアウトライン解析のプリプロセッサ対応
            • 3706 Re5: Cアウトライン解析のプリプロセッサ対応
          • 3707 Re4: Cアウトライン解析のプリプロセッサ対応
          • 3708 Re4: Cアウトライン解析のプリプロセッサ対応
            • 3709 Re5: Cアウトライン解析のプリプロセッサ対応
  • [3698] Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月11日 02:06

    C/C++アウトライン解析で#if-#else-#endifにインチキながら対応しました.
    #if 0~#endif攻撃でも括弧の対応を間違えなくなりました.

    判定はかなりインチキです.
    #if 0はelse以降を,それ以外のif/ifdef/ifndefは最初のブロックを使います.
    コメント代わりに#elif使っているところを見たこと無いのでelifは無視しました.

    差分ファイル: c-outline-ifdef.zip
    関連関数が増えてきたのでC/C++アウトラインを新規ファイルに移動しました.

    ---
    問題がなければ次のバージョンに入れたいと思います.
    • [3700] Re: Cアウトライン解析のプリプロセッサ対応 もか 2004年08月11日 18:48

      CEditDoc_FuncLinst1.cpp 526行以降を無効化しているため、
      class Hoge{
      Hoge();
      };
      のようなclass宣言の中にある関数が、グローバルに追加されてしまいます。
      namespace等も同様です。
      • [3702] Re2: Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月12日 01:47

        >CEditDoc_FuncLinst1.cpp 526行以降を無効化している
        失礼.自分用に無効化したままでした.

        以前報告したようにここを無効にしないと struct/union/enum等が型に含まれていると解析がおかしくなるので.
        • [3703] Re3: Cアウトライン解析のプリプロセッサ対応 (全略) 2004年08月12日 19:48

          ▼ げんたさん
          > 以前報告したようにここを無効にしないと struct/union/enum等が型に含まれていると解析がおかしくなるので.
          修正してみました
          共有フォルダの c_outline_ifdef_zenu20040812.tar.bz2 です


          げんたさんの CEditDoc_FuncLinst1.cpp にさらに追加という形で作っています
          一応試したテストパターンを同梱の struct.c に書いてあります

          1. 関数の戻り値にstruct や classが来ても大丈夫なように
          2. K&Rスタイルの関数もちゃんと表示できるように
          3. GNUのソースコードで出くわした変な書き方に対処

          3番目はいらないかも、ですけど(^-^;
          • [3704] Re4: Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月12日 23:05

            >修正してみました
            おおっ,超ありがたい.早速試してみます.
          • [3705] Re4: Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月13日 00:07

            ナイスすぎるのでバイナリをホームページに置きました.
            http://members.at.infoseek.co.jp/sakura_editor/snapshot/sakura-2004-08-12-outline.zip

            Cプログラマの皆さん,極悪コードでいろいろお試しください.

            ---
            関係ないけど対括弧検索でもコメント内部を無視できればなぁ...
            • [3706] Re5: Cアウトライン解析のプリプロセッサ対応 すい 2004年08月13日 01:10

              横から関係無い話しですみませんが

              >関係ないけど対括弧検索でもコメント内部を無視できればなぁ...

              もし仮に、↑コレ、この通り素直にやられたら非常に困ると思います。

              C や perl や LISP みたいに括弧構成の言語なら確かに
              「単純にコメント内は無視」で良いでしょうけど、世の中には
              括弧構成ではない言語類もある訳ですから。

              例えばこのエディタで使われているマクロ PPA とかでも
              ループはだとかは「begin ~ end」だし。
              で、この手の言語でループの開始位置⇔終端位置の行き来のために
              注釈で対応するように括弧を記述しておく、というのはよくある手
              だと思います。
              # もちろん対括弧検索の機能付きのエディタとかを使っていないと
              # こんな事しても意味無いわけですが。

              私も PPAマクロ中で良く使っています。

              ↓begin や end の後ろの「 //{ 」が対括弧検索用のコメント括弧
              -----
              for chn :=1 to 7 do   // 7種類の置換を順におこなう。
              begin //{
                case chn of //{
                  1: begin  bef:='%';  aft:='%25';   end;  // ループ1回目では '%' ⇒ '%25' 変換
                  2: begin  bef:='#';  aft:='%23';   end;  // ループ2回目では '#' ⇒ '%23' 変換
                  3: begin  bef:='&';  aft:='%26';   end;  // ループ3回目では '&' ⇒ '%26' 変換
                  4: begin  bef:='=';  aft:='%3D';   end;  // ループ4回目では '=' ⇒ '%3D' 変換
                  5: begin  bef:='?';  aft:='%3F';   end;  // ループ5回目では '?' ⇒ '%3F' 変換
                  6: begin  bef:='+';  aft:='%2B';   end;  // ループ6回目では '+' ⇒ '%2B' 変換
                  7: begin  bef:=' ';  aft:='+' ;   end;  // ループ7回目では ' ' ⇒ '+'  変換
                end; //}

                <略>
              end; //}
              -----

              他にも HTML で↓みたいな。長い <table> とかで開始位置⇔終端位置行き来用の括弧を注釈で。
              -----
              <table><!-- {
              -->
                <tr>

                <略>

                </tr>
              </table><!--
              }-->
              -----

              ですので、もし仮に仕様変更するとするなら
              「コメント内の括弧はコメント内の括弧同士で検索し合う」
              「コメント外の括弧はコメント外の括弧同士で検索し合う」
              みたいなのが理想的なのでしょうか。
          • [3707] Re4: Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月13日 08:37

            残念ながら戻り値の型にstruct/class/enum等があって引数がある場合に、最初の引数名が関数名としてでてしまいます。

            struct XXX func( int param1, int param2 ){}
            の関数名が param1 とでます。
          • [3708] Re4: Cアウトライン解析のプリプロセッサ対応 (全略) 2004年08月13日 21:39

            > 残念ながら戻り値の型にstruct/class/enum等があって引数がある場合に、最初の引数名が関数名としてでてしまいます。
            もういっちょ修正してみました
            バイナリ込みなので自分の所にあげておきました
            http://qwerty.s2.xrea.com/data/c_outline_ifdef_zenu20040813.tar.bz2

            今のところ試した中では↓の関数ポインタが関数と区別が付かないですが
            int (*Vi) (int p0) ;

            基本方針はこんな感じです
            C言語では 括弧の中には式、引数リスト、関数ポインタしかこないとおもうので
            (これが違うともうカーニハンとリッチーに謝るしかありません ^^;)
            関数一覧が必要とする関数定義、関数、クラス等、メンバ関数は括弧の中には含まれないので括弧内を全て対象外にしています

            何度もすみませんが、よければ取り入れて下さい
            • [3709] Re5: Cアウトライン解析のプリプロセッサ対応 げんた 2004年08月14日 00:41

              試してみました.今度は大丈夫そうです.

              あと,継続行の扱いはすっかり頭から漏れていました.どうもありがとうございます.
              #define+継続行で関数丸ごと定義というソースもありますからね.

              ---
              しかし状態遷移が入り組んでいる上に行数も長くなってさっぱりわかりません.
              ステップ実行してかろうじて理解できるレベル.

              状態遷移ものに読んでわかるコードを期待するのがどだい無理な話なのか...

              ---
              ステップ実行でわかったこと:
              ・ScanLineにバグがあった(空行で戻り値-1だった)
              ・operator = が認識できない件はoperatorという文字列がクリアされていたため.
              ・関数外に書いたoperator演算子の実体がglobalになってしまう(operatorの後ろにブランクを入れた場合)
              ・なんか一文字ずつ読んでいるけど,word単位でまとまって読んだ方が速くない?

              やっぱり作り直しかなぁ...5000億年後に(汗)