◀一般トップへ
  • 5029 関数名色分け
    • 5034 Re:関数名色分け
    • 5035 Re:関数名色分け
      • 5038 Re2:関数名色分け
      • 5047 Re2:関数名色分け
        • 5051 Re3:関数名色分け
          • 5052 Re4:関数名色分け
          • 5054 Re4:関数名色分け
            • 5059 Re5:関数名色分け
  • [5029] 関数名色分け なかはた 2006年02月11日 15:14

    void printhand(int hand)
    {
    }
    などの関数があったときに上記関数"printhand"の部分
    を色分けするにはどのように設定すればよいのでしょうか?

    つまり、関数名を色分けしたいんです。

    誰かお分かりの方返信お願いします。
    • [5034] Re:関数名色分け マサ 2006年02月15日 14:36

      私の場合、強調キーワードに登録しました。
      関数名が多い場合は面倒です。
    • [5035] Re:関数名色分け ryoji 2006年02月15日 17:47

      お望みのこととはちょっと違うと思いますが、
      K2Editorなど他エディタの正規表現色分けを真似すれば
      関数定義行を色分けすることはできそうです。

      K2Editor風正規表現
      /^[a-zA-Z_][^\(=;:]*\s+\*?[a-zA-Z_]\w*\([^;]*$/k
      /^[a-zA-Z_][^\(=;:]*\s+operator[^\(;]+\([^;]*$/k
      /^[a-zA-Z_][^\(=;:]*::[^\(;]+\([^;]*$/k
      /^[a-zA-Z_]\w*[a-z]+\w*\s*\([^;]*$/k

      秀丸も似たような感じで色分けしてますね。
      (違いはよくわかりませんが)
      • [5038] Re2:関数名色分け みち 2006年02月16日 13:04

        ryojiさんの設定を真似しました。希望通りの動作です。
        ありがとうございます
      • [5047] Re2:関数名色分け fon 2006年02月21日 23:05

        横合いから済みません。
        関数定義を1つの正規表現で出来ないかと↑の例を元に
        挑戦してみました!
        完全ではないですが登録が1個で済みます。
        (正規表現は取っ付き難かったのですが、具体例がある
         と違いますね、感謝。)

        /^(((::)\s*)?[a-zA-Z_~\*]+[\w\s]*)+\([^;]*$/k

        対応していないもの:
         (type) func( ...
        誤認するもの:
         value*(10), ...
        代わりに **func( みたいのはいけます。

        関連して、type func(type value)にマッチしたら、
        typeには重複でヒットしないものなんですよね?
        優先順位をいじってもダメでした。
        • [5051] Re3:関数名色分け fon 2006年02月22日 13:13

          自分で載せて置いてなんですが、致命的な問題がありましたので、取り下げます。
          下記の正規表現で変換自体はうまくいきますが、処理がものすごく重くなります。
          具体的にはスクロールがもっさりしたり、ファイルを開くのに時間がかかります。
          繰り返し処理を何度も使ったのがいけなかったのでしょうか。
          やはり先人の知恵、シンプル・イズ・ベストということで。
          > /^(((::)\s*)?[a-zA-Z_~\*]+[\w\s]*)+\([^;]*$/k
          教訓:サクラの動作が不安定なときは、正規表現キーワードも疑ってみる。
          • [5052] Re4:関数名色分け げんた 2006年02月23日 00:19

            >処理がものすごく重くなります。
            >繰り返し処理を何度も使ったのがいけなかったのでしょうか。
            繰り返しが入れ子になっていると長さに応じて処理が指数的に増加します.
            私のPCではスクロールした瞬間に固まりました.
            試しに(全略)さんのJRegex版でも同じパターンを試してみましたが固まりました.

            ところで,これを::があって 英数字の列やスペースがあってというのが交互に来てその後括弧が始まると考えて,::と英数字部分を展開して以下のようにしたら固まらなくなりましたが,これだとどうでしょうか.

            /^(::\s*)?[a-zA-Z_~\*]+[\w\s]*(::\s*[a-z
            A-Z_~\*]+[\w\s]*)*\([^;]*$/k
          • [5054] Re4:関数名色分け すい 2006年02月23日 00:36

            >具体的にはスクロールがもっさりしたり、ファイルを開くのに時間がかかります。
            >繰り返し処理を何度も使ったのがいけなかったのでしょうか。
            >やはり先人の知恵、シンプル・イズ・ベストということで。
            >> /^(((::)\s*)?[a-zA-Z_~\*]+[\w\s]*)+\([^;
            ]*$/k

            当たり前です。(^^;) ↑これ、正規表現の禁じ手(?)ほぼその物ですからね。
            いくらなんでも無茶でしょう。

            ( ) の中に + (1つ以上) があるので、( ) が空文字列とはマッチしない
            という辺りに助けられて、かろうじて無限ループにはおちいらないで
            済んでいますが。

            それでも「マッチしそうでマッチしない」ような文字列があると、
            「本当にマッチしない」という事が分かるまでに確認しなくては
            ならないパターンが多量にあるので、確認作業が終了するまでに
            多大なマシンパワーを要します。

            この正規表現の場合だと、具体例を挙げると
            ↓こんな文字列ですね。

            int abcdefghijklmn;

            これの変数名が長いと「この正規表現にはマッチしない」と
            いう結論に至るまでに必要な処理量が膨大になります。

            しかも文字が1文字増える毎に必要な処理量は指数関数的に
            激増していきます。
            # さあ、実際に変数名を1文字ずつ増やしていってみませぅ。

            この辺の事は Google で「正規表現 無限ループ」とでも検索すれば
            すぐわかるのではないかと。
            • [5059] Re5:関数名色分け fon 2006年02月26日 22:05

              >int abcdefghijklmn;
              確かに激重い、たったこれだけの文なのに。。
              調べてみると、(.+)+[a] のような簡単な式でも、例文によって
               1.「type func(」だとヒットせず、処理が重い。
               2.「type a」だと、ヒットし、軽い。
              のように違いがありました。
              こうしてはダメ、という法則を見つけるには至りませんでしたが
              ご指摘頂いたように、繰り返しの入れ子や、マッチしそうでマッ
              チしないパターンなどに注意して設計しなくては、ですね。
              この件の調査中、先読み(?=pattern)というのも憶えましたので、
              入れ子を外し、再度見直しをかけたものを作ってみました。
              関数定義(括弧の前までにマッチ):
               /^[a-zA-Z_~:\*]+[\s\w~:\*]*(?=\([^;]*$)
              /k

              げんたさん、すいさん、コメントありがとうございます!