色分け設定
k.inabaさんが繰り広げられているエディタの解説が色分けに差しかかろうとしていますし、潮時かと思いますので(←意味不明)、未だヘルプすらまともに書いていないThebeの色分けの方法を書いておきます。
──こんなとこじゃなくてヘルプに書くべきですね。
色
設定ダイアログの共通項の「色」が、実は解析State(状態)の定義になっています。
PlainとかHeadingとかは、状態に名前と色を付けているわけです。
現行ver.では255個まで対応です*1。
状態ですので、Dのコメントで言えば/* */と/+ +/と//は分けて扱わないといけませんので、同じ色でも複数の状態として定義してあります。
状態の定義は共通です*2。
なお、青背景時は、色相を保って明るさを変化させています。
字句解析
個別項の「字句解析」が、解析ルールを定義しています。ヘッダーコントロールでも置いてラベル付けておくべきなのですが、さぼってます。ですので、私以外には今まで意味不明だったはずです。
左から、今の状態、(限定)正規表現、ヒットした部分の状態(色)、次の状態、見出しの深さレベル、見出しとして登録するかどうか、です。
今の状態 | (限定)正規表現 | ヒットした部分の状態 (色としての価値のみ) | 次の状態 | 見出しの深さレベル | 見出しとして登録するかどうか |
現行ver.が16進表示で色分けできないのは…文字毎のデータを見ても、「色」はわかりますが、その間にあった「状態」は何なのかわかりませんので(マッチ部分の色は別にできますから)、再開のやりようがないからです(テキスト表示時は行末毎に覚えています)*3。
状態のネストには対応していませんので、Pascalの関数内関数を正しく見出しにするのは至難です*4。C系であれば中括弧がありますので楽なんですけどね。PythonやHaskell等のインデントを使う言語も、やはり困りそうです*5。
もっとも、もともと色分けと見出しを同じルール表で兼ねるのが不自然なのかもしれません。
Thebeはバイナリエディタという事で検索は改行なんて超越してます。
しかし、正規表現エンジン…これも自作なのですが…が、連続したメモリに対してのみマッチを行えるという(よくある)仕様ですので、検索が起きる度にリンクリストで構成したバッファを破棄してひとつにまとめ直しています*6。改めて考えると凄いムチャです。色分け用の正規表現が限定されたものなのは、連続メモリじゃなくてもOKな、行数にして200行未満の色分け専用のミニ正規表現エンジンを別に作っていたからなのです。
一般的に言うならば、バッファを行とは独立した連続メモリに確保するか、連続メモリ以外を走査できる正規表現エンジンを使うかしか無いと思います。Thebeは検索は前者、色分けは後者です。正規表現エンジンも自前である以上どうにでもできるのですが、後者は++pで済むところをリストを辿る処理が必要になって検索速度に影響…するかなあ?いや、するに違いない。め、面倒臭いわけでは無いですよっ!え、影響してくれなきゃ言い訳にならないじゃないですかっ!という確固たる根拠の元…(^^;;
──こんな事を書いたら誰も使ってくれなさそうですなあ。もっともまだαでしかも作り直し中ですし、どうせ誰も見てくれてないのは承知ですので、構いやしません。
*1:今作り直してる新ver.では、31個までの予定です…ええ。減ってます。悪いかっ。どう考えても文字毎のフラグに3ビットは要るので、詰め込んでしまえばメモリの大幅節約になるんですよっ
*2:何故なら、以前常用していたサクラエディタが、色定義がバラでしたので、複数の言語で同じような色設定を使ってて「やっぱ文字列は黄色だよな」などと突然思い立った際、エクスポートしてインポートして…と面倒な事になっていたからです。31に減らしてしまうと、拡張子増やした時にあっさり超えてしまうかもです…そうなりゃそうなった時です(^^
*3:新ver.では文字毎にフラグを用意することで色分けを行から解放し、16進表示でも色分けできるようにするつもりではあります
*4:引数のところを別状態にして、引数定義中で使われる予約語を二重に定義すれば可能…?。あー、でも、interface節や型宣言中の「プロトタイプのみ」を区別できなきゃ結局だめか。"forward"も書かれないしなあ…。Adaなら"is"がありますのでどうにかなりそうです
*5:あれ、待てよ…TABごとに+1していって改行で0に戻せば別にいいのか…
*6:結局ギャップバッファにしてしまった理由(の半分くらい)もここにありまして、ギャップバッファなら連続メモリですから…