行の先頭ルールとunreadについて
今日は引き続きIRuleの自作方法について試行錯誤。やってみたことは2つ。
(1) 行の先頭でないと適用としないルールの作成
(2) ルールに適用されないと判断した場合に,スキャンした文字をunreadしたときの動きの確認
(1)については,scanner#getColumn()メソッドを使って,スキャンした文字が行の何文字目かにあるかどうかでルールに適用するかどうかを判断するように,コードを書き換えてみた。単純に,
scanner.getColumn() == 1
っていう評価式をevaluateメソッド内の条件判断に追加してあげただけだけど,結果はNG。単に行の先頭からキーワードを入力してあげればちゃんと動作するんだけど,先頭に空白を入れてあげても色付けがされたまま。そのほかにも怪しい動きをしてしまう。動作を見てると,文字入力をした位置よりも後の既に入力されている文字列がルール評価の対象になっていない模様。う~ん,どういうことだろうか。。。
(2)については,これまた単純にunreadしただけでは期待通りの動きにならない。っていうか,そりゃそうだなって動きになる。どういうことかというと,例えば「hoge」っていう文字列を色付けしたいときに,
hogehoge
って入力したとすると,下線を引いた部分が色づけされてしまう。ちゃんとunreadしているおかげで,
hogehoge(Unmatch) → ogehoge(Unmatch) → gehoge(Unmatch) → ehoge(Unmatch) → hoge(Match)
っていう評価がされて後半のhogeだけが色付けされてしまう。
これをやってて思ったんだけど,各Ruleオブジェクトによる評価の結果,Undefinedと判断された文字については,色づけなどのスタイルの更新が行われない?のかもしれない。それだとしたら,SQLWordRuleクラスでは,ルールにマッチしなかった文字についてはそのルール独自のトークンを返して,unreadしなかったというのも納得ができる。
・・・難しいなぁ。
| 固定リンク
この記事へのコメントは終了しました。
コメント