New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NFAエンジンを叩く #390
Comments
文字クラスの修正。 diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -2667,11 +2665,11 @@
switch (class)
{
case NFA_CLASS_ALNUM:
- if (isalnum(c))
+ if ((1 <= c && c <= 255) && isalnum(c))
return OK;
break;
case NFA_CLASS_ALPHA:
- if (isalpha(c))
+ if ((1 <= c && c <= 255) && isalpha(c))
return OK;
break;
case NFA_CLASS_BLANK:
@@ -2679,7 +2677,7 @@
return OK;
break;
case NFA_CLASS_CNTRL:
- if (iscntrl(c))
+ if ((1 <= c && c <= 255) && iscntrl(c))
return OK;
break;
case NFA_CLASS_DIGIT:
@@ -2687,7 +2685,7 @@
return OK;
break;
case NFA_CLASS_GRAPH:
- if (isgraph(c))
+ if ((1 <= c && c <= 255) && isgraph(c))
return OK;
break;
case NFA_CLASS_LOWER:
@@ -2699,7 +2697,7 @@
return OK;
break;
case NFA_CLASS_PUNCT:
- if (ispunct(c))
+ if ((1 <= c && c <= 255) && ispunct(c))
return OK;
break;
case NFA_CLASS_SPACE: |
マクロ定義したほうが良くない? |
最初にフラグ取って使いまわしましょう。 |
どういうことでしょう? |
コードが太るか太らないかくらいでしかないですが |
postfix領域(?)が埋まっていると、デバッグログのPostfix notationにゴミが出力されます。 diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1824,13 +1824,13 @@
else if (retval == OK)
fprintf(f, ">>> NFA engine succeeded !\n");
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
- for (p=post_start; *p; p++)
+ for (p = post_start; *p && p < post_end; p++)
{
nfa_set_code(*p);
fprintf(f, "%s, ", code);
}
fprintf(f, "\"\nPostfix notation (int): ");
- for (p=post_start; *p; p++)
+ for (p = post_start; *p && p < post_end; p++)
fprintf(f, "%d ", *p);
fprintf(f, "\n\n");
fclose(f); |
GJ |
あわせて送っちゃって下さい。 |
このパッチで下の2つが解決するのかな?
|
ふと気になった。パフォーマンスはどうなんだろう? |
postfix領域が足りないせいで、NFAエンジンでは扱えないようですね。 /* Some items blow up in size, such as [A-z]. Add more space for that.
* TODO: some patterns may still fail. */
// nstate_max += 1000; |
(1 <= c && c <= 255) の部分、どうしよう。 |
シェフのおまかせで |
結局、元のまま投げてしまいました。 |
残件:
|
あと残課題なんだろ On 5/21/13, K.Takata notifications@github.com wrote:
|
トップの残課題を更新しました。 |
\u は影響大きいと見た |
regexp_nfa のコメント見ると \ze が動かないと書いてありますね。 |
そりゃプラグイン壊れるわw |
でも regexpengine=0 になっていれば、NFAエンジンでサポートしていないパターンは旧エンジンで実行されるので実用上は問題ないはずなんですがね。プラグインが壊れるのと \ze, %u が使えないのは別だと思います。 |
僕はデフォを |
0です |
となると、NFA エンジンで処理しているが、結果が正しくないのが他にあるんでしょうね。
7.3.977 で |
/* TODO(RE) This needs more testing */ |
確かに、そうですね。まだ英文に慣れていないので……。 |
Shougoさんの英語に突っ込んじゃダメな気がする... (多すぎて) |
なんだかんだ言っても実際にアクション起こしてる人はカッコいいよ。(千円くれ) |
手元の 7.3.1128 では以下のようになりましたが… echo &enc
=> utf-8
set re=0
echo split("foo\XFFbar", '[\xFF]')
=> ['foo<ff>bar']
echo split("foo\XFFbar", "\xFF")
=> ['foo', 'bar']
echo split("foo\XFFbar", '\xFF')
=> ['foo<ff>bar']
set re=1
echo split("foo\XFFbar", '[\xFF]')
=> ['foo', 'bar']
echo split("foo\XFFbar", "\xFF")
=> ['foo<ff>bar']
echo split("foo\XFFbar", '\xFF')
=> ['foo<ff>bar']
set re=2
echo split("foo\XFFbar", '[\xFF]')
=> ['foo<ff>bar']
echo split("foo\XFFbar", "\xFF")
=> ['foo', 'bar']
echo split("foo\XFFbar", '\xFF')
=> ['foo<ff>bar'] |
あ、すみません。確かにヒストリをたどって実行した際に、ごっちゃになっていた可能性があります。 もう一度確認します。
ありがとうございます。 |
私の環境ではこのような結果になりました。vim_devには訂正メールを送っておきます。 |
修正版の結果を投稿しました。 |
旧エンジンでは代わりに U+00FF にマッチしているようですが、 |
ふむふむ。ややこしいですね。 |
Bram氏も同様の指摘をしていますね。了解です。私の件はcloseとさせてください。 |
vim_jp の Google group に報告がありますが、マルチバイト文字に対する マニュアルを見ると、「これらのものは、8 ビット文字のみマッチします。」とあるので、マルチバイト文字にはマッチしないのが仕様の気がします。 |
http://en.wikipedia.org/wiki/Regular_expression#Character_classes 値の範囲はASCIIなのでおいとくとしてDescriptionでは |
#413 を起票しました。 |
|
報告しました。 |
あざす! |
7.3.1217 で直りました。
|
Vim 7.3.1243で正規表現エンジンのデグレードがありました。私の作成したスニペットプラグインが使い物にならなくなっています。 https://groups.google.com/forum/#!topic/vim_dev/EYyJJwFURVk どうやら、Vim 7.3.1243で後方参照の実装が変更になったのが原因みたいです。 再現スクリプト: set regexpengine=0
echomsg substitute('2013-06-27${0}',
\'\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', ' \1 ', 'g')
set regexpengine=1
echomsg substitute('2013-06-27${0}',
\'\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', ' \1 ', 'g') 上記のスクリプトをsourceしてみると、regexpengine=0とregexpengine=1で結果が異なります。
この挙動は明らかにバグと思われます。 確認環境:Ubuntu 13.04 |
テスト漏れ |
@Shougo 報告した方が直るの早いと思うよ。 |
報告ありがとうございます。昨日は時間がなく、まずはvim-jpに現象をまとめておこうと考えていたので、代わりに報告してもらって助かります。 |
https://groups.google.com/d/msg/vim_dev/EYyJJwFURVk/GagpBMPcWuAJ
だそうです。 |
了解です。試してみます。 |
Vim 7.3.1265にて、私が報告した現象が直っていることを確認しました。 |
7.4 が出たことですので、閉じたいと思います。 |
NFAエンジンに対して以下のいずれかを目指す
いずれにせよ再現しやすい例を示したほうが良い。
#386 から残っている問題残課題:[[:cntrl:]]
にマルチバイト文字がマッチする。幾らかのプラグインで誤動作が見られる(Vimに付属のものが引っかかってくれると嬉しい)[[:alpha:]]
とかの判定がおかしい。check_char_class()
の中で、マルチバイト文字もお構いなしにisalpha()
などに放り込んでる。\%u
等のコード指定が無効化されている。先頭に*
を入れるとE866if (*regparse == 'n' || *regparse == 'n')
test64 にマルチバイトのテストが混ざっている。test95 が enc=utf-8 以外だと通らない。The text was updated successfully, but these errors were encountered: